future-architect/vuls
Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices
Healthy across the board
weakest axiscopyleft license (GPL-3.0) — review compatibility
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit today
- ✓8 active contributors
- ✓Distributed ownership (top contributor 33% of recent commits)
Show all 7 evidence items →Show less
- ✓GPL-3.0 licensed
- ✓CI configured
- ✓Tests present
- ⚠GPL-3.0 is copyleft — check downstream compatibility
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/future-architect/vuls)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/future-architect/vuls on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: future-architect/vuls
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/future-architect/vuls shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across the board
- Last commit today
- 8 active contributors
- Distributed ownership (top contributor 33% of recent commits)
- GPL-3.0 licensed
- CI configured
- Tests present
- ⚠ GPL-3.0 is copyleft — check downstream compatibility
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live future-architect/vuls
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/future-architect/vuls.
What it runs against: a local clone of future-architect/vuls — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in future-architect/vuls | Confirms the artifact applies here, not a fork |
| 2 | License is still GPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of future-architect/vuls. If you don't
# have one yet, run these first:
#
# git clone https://github.com/future-architect/vuls.git
# cd vuls
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of future-architect/vuls and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "future-architect/vuls(\\.git)?\\b" \\
&& ok "origin remote is future-architect/vuls" \\
|| miss "origin remote is not future-architect/vuls (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is GPL-3.0" \\
|| miss "license drift — was GPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "cmd/vuls/main.go" \\
&& ok "cmd/vuls/main.go" \\
|| miss "missing critical file: cmd/vuls/main.go"
test -f "cmd/scanner/main.go" \\
&& ok "cmd/scanner/main.go" \\
|| miss "missing critical file: cmd/scanner/main.go"
test -f "config/config.go" \\
&& ok "config/config.go" \\
|| miss "missing critical file: config/config.go"
test -f "cache/db.go" \\
&& ok "cache/db.go" \\
|| miss "missing critical file: cache/db.go"
test -f "constant/constant.go" \\
&& ok "constant/constant.go" \\
|| miss "missing critical file: constant/constant.go"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/future-architect/vuls"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Vuls is an agent-less vulnerability scanner written in Go that detects security vulnerabilities across Linux, FreeBSD, containers, WordPress, and programming language libraries by scanning installed packages against NVD and other vulnerability databases. It runs without deploying agents on target systems, generates automated reports, and integrates with alerting platforms like Slack, email, and cloud services (AWS, Azure). Monolithic Go project with clear separation: cmd/ contains two entry points (cmd/vuls/main.go for CLI, cmd/scanner/main.go for agent), config/ handles TOML/JSON configuration loading and platform-specific OS scanning modes, cache/ implements BoltDB persistence, and specialized packages for cloud integrations (AWS, Azure, Google Chat, Slack, HTTP webhooks). No internal pkg/ directory yet; packages are top-level organized by concern.
👥Who it's for
System administrators and DevOps engineers managing production Linux/FreeBSD infrastructure who need to continuously monitor for vulnerabilities without downtime-causing manual updates, and security teams that require automated vulnerability reporting across multiple servers and containers.
🌱Maturity & risk
Production-ready. The project shows active development (dependencies updated to 2025, Go 1.26 support), comprehensive CI/CD via GitHub Actions (build.yml, golangci.yml, docker-publish.yml, goreleaser.yml), structured test files throughout (config_test.go, cache/bolt_test.go, portscan_test.go), and clear versioning via goreleaser. Last meaningful updates in early 2025 indicate ongoing maintenance.
Moderate risk. The dependency graph is moderately large (mainline imports ~30+ external packages including aquasecurity/trivy, AWS SDK v2, Azure SDK, Google container registry). Single-maintainer concerns exist (future-architect org), though the 2.8MB Go codebase suggests multi-contributor history. Breaking changes possible in vulnerability database schema (MaineK00n/vuls-data-update and MaineK00n/vuls2 are pre-release alpha versions). Database update frequency (trivy-db, trivy-java-db) is critical but external dependency.
Active areas of work
Active development on v3-alpha with MaineK00n/vuls2 v0.0.1-alpha dependency and vuls-data-update module (0.0.0-20260428075914-ea21d0d8e4c9), indicating schema or data format migration. Recent GitHub Actions workflows (scorecard.yml, diet-check.yml) suggest security and binary size focus. Trivy integration updated to 0.69.2 (late 2024).
🚀Get running
git clone https://github.com/future-architect/vuls.git && cd vuls && make build (or make install from GNUmakefile). For Docker: docker build -t vuls:latest . && docker run vuls --help.
Daily commands: make build produces binary in current dir. For local scan: ./vuls scan --config config.toml. For Docker: docker run --rm -v /etc:/etc:ro vuls scan. See Dockerfile for multi-stage build (Go 1.26 base).
🗺️Map of the codebase
cmd/vuls/main.go— Primary CLI entry point for the vulnerability scanner; all scan workflows originate herecmd/scanner/main.go— Agent scanner entry point; handles remote scanning operations on target systemsconfig/config.go— Core configuration parsing and validation; defines scan targets, notification channels, and scan modescache/db.go— Vulnerability database caching layer; critical for scan performance and offline operationconstant/constant.go— Global constants and configuration values that propagate throughout the scanner.golangci.yml— Linter configuration enforcing code quality standards that all contributors must followGNUmakefile— Build and development workflow; documents how to compile, test, and release the scanner
🧩Components & responsibilities
- CLI (cmd/vuls/main.go) (Cobra (CLI framework)) — User-facing entry point; parses arguments, loads config, orchestrates scan and report workflows
- Failure mode: If CLI fails, no scan is initiated; config parsing errors prevent execution
- Config Loader (config/*) (TOML, JSON parsers) — Loads TOML/JSON config, validates targets, notification settings, and scan modes
- Failure mode: Invalid config blocks all scans; missing credentials cause notification failures
- Scanner Engine — undefined
🛠️How to make changes
Add a New Notification Channel
- Create a new configuration struct in config/ (e.g., config/newnotifierconf.go) with fields for credentials and endpoint (
config/newnotifierconf.go) - Add the configuration type to the main Config struct in config/config.go (
config/config.go) - Implement notification logic as a handler function that integrates with the reporting pipeline (
config/newnotifierconf.go) - Update the TOML loader in config/tomlloader.go to parse the new notifier settings (
config/tomlloader.go)
Add Support for a New Vulnerability Source
- Create a new configuration in config/vulnDictConf.go or extend it to recognize the new source (
config/vulnDictConf.go) - Update the cache layer in cache/db.go to query and store data from the new source (
cache/db.go) - Register the source in the main configuration parsing flow in config/config.go (
config/config.go)
Add a New Scan Mode (OS/Container Type)
- Define the scan mode constant in config/scanmode.go (
config/scanmode.go) - Add mode-specific configuration fields in config/config.go (
config/config.go) - Update config/tomlloader.go to parse the new mode from TOML configurations (
config/tomlloader.go) - Implement mode detection and handling in config/os.go for OS fingerprinting (
config/os.go)
🔧Why these technologies
- Go — Single static binary for agent-less remote scanning; minimal dependencies and fast execution on target systems
- BoltDB (embedded KV store) — Lightweight offline caching of vulnerability data; no external database required for standalone operation
- TOML configuration — Human-readable configuration for scan targets, notification channels, and OS detection rules
- Trivy integration — Leverages mature container/OCI image vulnerability scanning; composable with system package scanning
- AWS/Azure SDK — Native cloud integration for scanning distributed EC2/VM instances across multiple accounts
⚖️Trade-offs already made
-
Agent-less architecture via SSH/agentless protocols
- Why: Reduces operational overhead and security footprint on targets
- Consequence: Requires network access and credentials; cannot perform deep monitoring on systems where SSH is disabled
-
Local BoltDB caching instead of central vulnerability DB
- Why: Enables offline scanning and reduces dependency on external services
- Consequence: Vulnerability data must be manually updated; multiple scanner instances maintain separate caches
-
Configuration via static TOML files
- Why: Simple, version-controllable, no database required
- Consequence: Does not support dynamic target discovery; requires config file changes to add/remove targets
-
Multiple notification backends (Slack, email, HTTP webhooks)
- Why: Flexibility to integrate with any alerting system
- Consequence: Increased configuration complexity; each notifier requires separate credential management
🚫Non-goals (don't propose these)
- Real-time continuous monitoring (scan-based, not event-driven)
- Vulnerability remediation (scanning & reporting only, no patching automation)
- Windows system scanning (Linux/FreeBSD focused)
- Zero-trust network environments (requires SSH or API access to targets)
- Multi-tenant SaaS (designed for single organization deployments)
🪤Traps & gotchas
BoltDB cache persists in ./vuls/ by default; tests may fail if directory is read-only. Scan modes in config/scanmode.go are exclusive (only one active scan backend per run); misunderstanding this causes 'no vulnerabilities found' silently. Database freshness is critical: MaineK00n/vuls-data-update and trivy-db must be updated separately before scanning or CVE data will be stale. Network scanning (nmap) requires root or CAP_NET_RAW on Linux. No env var documentation visible; config is TOML/JSON-only. Docker image assumes /etc:/etc:ro mount for package database access on Linux; scans fail silently without it.
🏗️Architecture
💡Concepts to learn
- Agent-less scanning — Core design principle of Vuls—understanding why it avoids deploying software on target hosts (reduces attack surface, simpler operations, no port management) explains architectural choices like SNMP for network devices and SSH-based remote execution
- Package metadata enumeration — Vuls detects vulnerabilities by reading installed package lists (APK, DEB, RPM) and version info, not by probing ports; understanding config/os.go and package manager abstraction is essential to extending OS support
- BoltDB (embedded key-value store) — Vuls uses BoltDB for local caching of scan results and vulnerability data; understanding cache/bolt.go is necessary for performance tuning and multi-host scan coordination
- Vulnerability database sources (NVD, JVN, Trivy DB) — Vuls combines multiple CVE feeds (NVD for US vulnerabilities, JVN for Japanese, Trivy DB for container-specific); data freshness and source reliability directly impact scan accuracy
- TOML configuration with schema validation — Config is loaded via BurntSushi/toml and validated with govalidator; understanding config/config.go is mandatory for debugging user configuration issues and extending supported settings
- Pluggable scan modules (scanmodule.go interface) — Architecture allows switching between OS package scanning, container scanning, and network scanning via config; this pattern enables extensibility without modifying core logic
- Software Bill of Materials (SBOM) integration (CycloneDX) — Vuls imports CycloneDX-go for SBOM parsing in CI/CD pipelines; understanding this integration is important for supply-chain security scanning and container image analysis
🔗Related repos
aquasecurity/trivy— Vuls embeds Trivy (v0.69.2) for container and artifact scanning; understanding Trivy's database schema is essential for multi-scanner deploymentsMaineK00n/vuls-data-update— External module that populates the vulnerability database that Vuls scans against; required for fresh CVE datausiusi360/vulsrepo— Web UI frontend for Vuls reports (mentioned in README with demo GIF); common companion for visualization and historical trackinggreenbone/openvas— Alternative agent-less vulnerability scanner for comparison; uses active scanning vs. Vuls' passive package-based approachanchore/grype— Similar vulnerability scanner for container images and SBOMs; often deployed alongside Vuls in multi-scanner security pipelines
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive unit tests for config package modules
The config package is critical for Vuls (handling AWS, Azure, Slack, SMTP, etc. configurations), but most config files lack corresponding test files. Only config_test.go, os_test.go, portscan_test.go, tomlloader_test.go, and syslog/syslogconf_test.go exist. Missing tests for awsconf.go, azureconf.go, chatworkconf.go, googlechatconf.go, httpconf.go, saasconf.go, slackconf.go, smtpconf.go, telegramconf.go, and vulnDictConf.go would significantly improve reliability and catch regressions in notification/storage integrations.
- [ ] Create awsconf_test.go with tests for AWS credential validation and S3 configuration parsing
- [ ] Create azureconf_test.go testing Azure blob storage authentication and parameters
- [ ] Create slackconf_test.go, telegramconf_test.go, and other notification config tests validating webhook URLs and auth tokens
- [ ] Add tests for saasconf.go validating SaaS platform-specific config merging logic
- [ ] Run 'go test ./config/...' to ensure all tests pass and add to CI pipeline coverage requirements
Add integration tests for cache layer (bolt.go) with test fixtures
The cache package (cache/bolt.go, cache/db.go) is foundational for vulnerability data caching, but cache_test.go and bolt_test.go appear minimal. Add comprehensive tests covering cache miss/hit scenarios, concurrent access patterns, and BoltDB file corruption recovery. This is critical for a vulnerability scanner that needs reliable offline caching.
- [ ] Expand bolt_test.go with tests for concurrent read/write operations to cache/bolt.go
- [ ] Add test fixtures in cache/testdata/ directory with sample vulnerability datasets
- [ ] Create tests validating cache invalidation, TTL expiration, and recovery from corrupted BoltDB files
- [ ] Add benchmarks in cache/ to track performance regressions as vulnerability dataset sizes grow
- [ ] Document cache layer expectations in CONTRIBUTING.md or a new cache/README.md
Create missing CI workflow for diet/binary size checks and add goreleaser validation
The repo has diet-check.yml workflow but no validation that goreleaser.yml (.goreleaser.yml exists) actually builds successfully across all target platforms. The .goreleaser.yml config file exists but there's no CI step that validates the release artifacts or checks for binary bloat regressions. Adding this prevents broken releases and tracks binary size trends important for agent-less deployment.
- [ ] Create .github/workflows/goreleaser-validate.yml that runs 'goreleaser build --snapshot' on PRs to validate build configuration
- [ ] Extend diet-check.yml to compare binary sizes across releases and fail if any target platform binary grows >10% (configurable)
- [ ] Add build matrix in goreleaser-validate.yml for linux/amd64, linux/arm64, freebsd/amd64, and windows/amd64
- [ ] Document binary size expectations in CONTRIBUTING.md with links to .goreleaser.yml
- [ ] Reference the new workflow in .github/pull_request_template.md to remind contributors to check
🌿Good first issues
- Add unit tests for config/color.go parsing; file exists but no color_test.go present, and config parsing logic should be fully covered
- Document the config/scanmodule.go plugin interface with an example walkthrough in CONTRIBUTING.md; new contributors struggle adding custom scan types without this
- Implement cache/bolt_test.go expansion to cover concurrent access and recovery scenarios; current test coverage appears minimal for embedded database reliability
⭐Top contributors
Click to expand
Top contributors
- @MaineK00n — 33 commits
- @dependabot[bot] — 32 commits
- @shino — 23 commits
- @kotakanbe — 5 commits
- @sadayuki-matsuno — 3 commits
📝Recent commits
Click to expand
Recent commits
230527e— fix(config): refresh openSUSE Leap EOL entries (add 16.0, extend 15.6) (#2543) (shino)6372c4c— fix(detector/library): regenerate PURL after JAR SHA1 canonicalization (#2533) (kotakanbe)a975238— feat(detector/vuls2): thread RedHat CVE Mitigation into VulnInfo (#2532) (MaineK00n)18abe61— test(scanner): source lockfiles from vulsio/integration (#2531) (shino)52eff31— chore(deps): bump the go_modules group across 1 directory with 2 updates (#2527) (dependabot[bot])f235b9c— chore(deps): bump the all group across 1 directory with 5 updates (#2526) (dependabot[bot])0e039bb— chore(deps): bump the all group across 1 directory with 2 updates (#2525) (dependabot[bot])c08f424— chore(deps): bump the others group across 1 directory with 5 updates (#2523) (dependabot[bot])bb3cad0— feat(config/os): add ubuntu 26.04 (#2524) (MaineK00n)71ddc50— chore(deps): bump the go_modules group across 1 directory with 5 updates (#2520) (dependabot[bot])
🔒Security observations
- High · Outdated Alpine Base Image —
Dockerfile (line 13). The Dockerfile uses Alpine 3.22 which may contain unpatched vulnerabilities. Alpine base images should be regularly updated to the latest stable version to receive security patches. Fix: Update to the latest stable Alpine version and rebuild regularly. Consider using Alpine 3.21 or later with automatic rebuilds in CI/CD. - High · Missing SBOM and Dependency Verification —
go.mod (dependencies section). The go.mod file contains numerous external dependencies without pinned versions (using version ranges or 'latest' semantics for some dependencies like vuls-data-update and vuls2). This increases the risk of supply chain attacks and unexpected behavior changes. Fix: Pin all dependencies to exact versions using checksums. Enable Go module verification with GOSUMDB or use go.sum validation in CI/CD pipeline. - High · Hardcoded Email for Security Reports —
SECURITY.md. Security vulnerability reports are directed to a single personal email (kotakanbe@gmail.com) without a formal security contact or disclosure policy. This lacks infrastructure for secure reporting and may delay vulnerability fixes. Fix: Establish a formal security.txt file at /.well-known/security.txt, use a dedicated security email address, and implement a vulnerability disclosure policy with expected response times. - Medium · No Version Support Timeline —
SECURITY.md. Security.md states 'Only the latest version is supported' which provides no clear support window or patching timeline for users running the tool in production environments. Fix: Define a clear versioning and support policy (e.g., support last 2-3 minor versions for 6 months). Implement automated security patching notifications. - Medium · Dependency on Trivy with Transitive Dependencies —
go.mod (aquasecurity packages). Heavy reliance on aquasecurity/trivy (v0.69.2) and trivy-db with multiple database dependencies creates a large attack surface through transitive dependencies. Fix: Regularly audit transitive dependencies using 'go mod graph' and 'go mod why'. Consider using tools like 'nancy' or 'snyk' in CI/CD for vulnerability scanning of dependencies. - Medium · Insecure Default Configuration Pattern —
config/ directory. Multiple configuration files (awsconf.go, azureconf.go, etc.) exist without visible validation shown. Risk of misconfiguration allowing credential exposure or insecure defaults. Fix: Implement strict validation for all configuration parameters. Use environment variables with validation, never accept sensitive data in config files. Document secure configuration practices. - Medium · Missing Container Security Best Practices —
Dockerfile. Dockerfile does not use specific golang version digest (uses :alpine without digest), runs apk add without --no-cache in some cases, and does not drop unnecessary capabilities or run as non-root user. Fix: Add digest to golang:alpine base image, ensure all RUN commands use --no-cache, add USER directive to run as non-root, and use COPY --chown for proper permissions. - Low · Incomplete Dependency Version Pins —
go.mod. Some dependencies use '+incompatible' or loose version specifications (e.g., github.com/cenkalti/backoff v2.2.1+incompatible), which may pull unexpected versions. Fix: Review and update incompatible dependencies to their v2+ versions where available. Use exact version pins with verification. - Low · No Code Signing or Release Verification —
.github/workflows/goreleaser.yml (implied). While goreleaser is configured, there is no visible implementation of binary signing or artifact verification for end-users. Fix: Implement GPG signing of releases in goreleaser configuration. Provide signed checksums and document verification process for users. - Low · Broad SSH Access in Scanner Container —
Dockerfile (openssh-client). Dockerfile includes openssh-client which may not be necessary for the scanning agent and increases potential attack surface. Fix: Evaluate
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.