- 漏洞扫描
- 网络安全
- 运维
【免费下载链接】vuls
Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices
Vuls(VULnerability Scanner)是一个用 Go 编写的无代理(agent-less)漏洞扫描器,面向 Linux、FreeBSD、Windows、macOS、容器、WordPress、编程语言库与网络设备,通过 SSH 连接目标服务器采集信息后在服务端完成漏洞检测与报告生成。本文基于当前仓库的 README.md 与源码实现,系统讲解 Vuls 的设计动机、核心特性、四种扫描模式、Remote/Local/Server 三种部署架构、非 OS 包漏洞检测方案,以及从构建、配置到扫描、报告的完整实战流程,帮助读者快速掌握这套"集中式漏洞管理"工具的落地方法。
背景:Vuls 解决什么问题
在生产环境中,系统管理员每天都要面对安全漏洞分析与软件更新两大负担。为了避免停机,管理员通常不会启用包管理器提供的自动更新,而是选择手动更新,这带来三个典型问题:
- 必须持续盯住 NVD(National Vulnerability Database)等漏洞数据库,跟踪新披露的漏洞;
- 当服务器上安装的软件包数量庞大时,人工无法逐一监控所有软件;
- 新漏洞出现时,要人工分析哪些服务器受影响,成本高且容易漏掉个别服务器。
Vuls 正是为解决上述问题而生,其设计目标包括:
- 告知用户与系统相关的漏洞;
- 告知用户哪些服务器受影响;
- 漏洞检测全自动执行,避免人工遗漏;
- 可通过 CRON 等方式定期生成报告,实现漏洞管理的常态化。
核心特性总览
支持多平台的漏洞扫描
Vuls 支持主流的 Linux/FreeBSD/Windows/macOS 发行版,包括:Alpine、Amazon Linux、CentOS、AlmaLinux、Rocky Linux、Debian、Oracle Linux、Raspbian、RHEL、openSUSE、openSUSE Leap、SUSE Enterprise Linux、Fedora、Ubuntu,以及 FreeBSD、Windows、macOS,并覆盖云环境、本地机房(on-premise)与运行中的 Docker 容器。
从源码看,发行版的自动识别在 scanner/scanner.go 的detectOS中按顺序探测:先判断是否为 pseudo 模式,再依次识别 Windows、Debian 系、RedHat 系、SUSE、FreeBSD、Alpine、macOS,最后落到unknown类型。RedHat 系的识别逻辑位于 scanner/redhatbase.go,通过读取/etc/fedora-release、/etc/oracle-release、/etc/almalinux-release、/etc/rocky-release等文件判定发行版并校验最低支持版本。
高质量扫描:多源漏洞数据
Vuls 的检测质量建立在多类漏洞数据源之上:
- 漏洞数据库(Vulnerability Database):NVD、JVN(日文);
- OVAL 数据:Red Hat、Debian、Ubuntu、SUSE、Oracle Linux 官方 OVAL 库;
- 安全通告(Security Advisory):Alpine-secdb、Red Hat Security Advisories、Debian Security Bug Tracker、Ubuntu CVE Tracker、Microsoft CVRF;
- 系统命令结果:利用
yum、zypper、pkg-audit等命令输出关联 RHSA / ALAS / ELSA / FreeBSD-SA 通告及 Changelog; - PoC 与 Exploit 情报:Exploit Database、Metasploit-Framework 模块、awesome-cve-poc、PoC-in-GitHub、inthewilddb、nuclei-templates;
- CERT 通告:US-CERT、JPCERT;
- KEV 已知被利用漏洞:CISA Known Exploited Vulnerabilities Catalog、VulnCheck KEV;
- 网络威胁情报:MITRE ATT&CK 与 CAPEC(仓库的 detector/vuls2 下内置了 mitre-attack、mitre-capec、mitre-cwe、mitre-cve-v5、cisa-kev、vulncheck-kev 等丰富数据源的解析器与测试样例);
- 语言库漏洞数据:基于 aquasecurity/vuln-list;
- WordPress:基于 wpscan.com API。
仓库 detector/vuls2/testdata/fixtures 中的 enrich 样例(如 nvd-feed-cve-v2、jvn-feed-rss、exploit-exploitdb 等)直观展示了这些数据源如何被解析并参与 CVE 信息富化(enrichment)。
动态分析(Dynamic Analysis)
Vuls 通过 SSH 连接目标服务器并执行命令来获取服务器实时状态,属于动态分析方式。它会在目标服务器更新了内核等组件但尚未重启时给出警告(如RebootRequired字段,见 models/scanresults.go 的 Kernel 结构),避免"更新了却未生效"的盲区。
非破坏性检测与 CI 友好
- 扫描过程为非破坏性(nondestructive testing);
- 在 AWS 上扫描前无需预授权,因此非常适合与持续集成(CI)结合,每天跑一次测试即可快速发现新漏洞;
- 支持自动生成配置文件模板:可用 CIDR 自动探测服务器集合并生成配置模板;
- 支持 Email 与 Slack 通知(支持日语);
- 扫描结果可通过配套软件查看:终端里的 TUI Viewer 或 Web UI(VulsRepo)。
四种扫描模式
Vuls 将扫描模式建模为位标志组合,定义见 config/scanmode.go:fast、fast-root、deep、offline,校验规则在ensure()中实现——deep与offline不能同时指定,且 fast/fast-root/deep 只能三选一(config/scanmode.go)。未显式配置时默认使用fast。
| 模式 | 说明 | 权限与特性 |
|---|---|---|
| Fast Scan | 无需 root 权限、无依赖 | 对目标服务器几乎零负载;支持离线扫描(CentOS、AlmaLinux、Rocky Linux、Debian、Oracle Linux、Red Hat、Fedora、Ubuntu) |
| Fast Root Scan | 需要 root 权限 | 对目标服务器几乎零负载;使用yum-ps检测受更新影响但未重启的进程(Amazon Linux、CentOS、AlmaLinux、Rocky Linux、Oracle Linux、Fedora、RedHat);使用 debian-goodies 的checkrestart检测已更新但未重启的进程(Debian、Ubuntu);同样支持上述发行版的离线扫描 |
| Deep Scan | 深度扫描 | 需要更多权限与依赖,用于获取更完整的软件信息(如 changelog 等) |
| Offline | 离线扫描 | 目标服务器无需访问互联网,仅上述部分发行版支持 |
扫描模式可在config.toml中通过scanMode配置,也可以在 subcmds/scan.go 的scan子命令运行期校验。除扫描模式外,还有独立的**扫描模块(ScanModule)**概念,定义见 config/scanmodule.go:ospkg(OS 包)、wordpress、lockfile(依赖锁定文件)、port(监听端口)。未配置时默认全部启用;注意规则"指定 port 时必须同时指定 ospkg"(config/scanmodule.go)。
三种部署架构:Remote / Local / Server
Vuls 提供三种灵活的部署方式,适应不同网络环境:
- Remote Scan Mode(远程扫描):只需搭建一台与所有目标服务器通过 SSH 连通的管理机,在管理机上统一执行扫描;
- Local Scan Mode(本地扫描):如果不想让中央 Vuls 服务器通过 SSH 连接各服务器,可在每台目标服务器本地运行 Vuls 进行扫描;
- Server Mode(服务模式):先在 Vuls 服务器上启动 HTTP 服务并监听端口,然后在目标服务器上直接执行命令采集软件信息,把结果通过 HTTP 发给 Vuls Server,以 JSON 形式拿回扫描结果。该模式无需 SSH、无需安装扫描器,只在目标服务器上执行 Linux 命令即可。
Server 模式的服务端实现见 server/server.go:/vuls端点接收application/json或text/plain两种 Content-Type 的请求(text/plain时借助scanner.ViaHTTP解析包列表),随后复用同一个 vuls2 数据库会话完成DetectPkgCves与EnrichVulnInfos,再按cvss-over、confidence-over、ignore-unscored-cves、ignore-unfixed等过滤条件处理结果并返回。子命令server默认监听localhost:5515,并提供/health健康检查端点(见 subcmds/server.go)。
非 OS 包漏洞扫描
除操作系统自带软件包外,Vuls 还能扫描编程语言库、自编译软件与网络设备。相关配置字段集中在 config/config.go 的ServerInfo结构中,主要包括:
Lockfile 扫描(Lockfile based Scan)
扫描目标服务器上的依赖锁定文件(如package-lock.json、go.mod、requirements.txt、Cargo.lock等),通过lockfiles字段显式指定路径,或用findLock+findLockDirs自动发现。扫描解析复用 Trivy 的 fanal 解析器(见 scanner/base.go 中的 npm/yarn/pnpm/bun/cargo/gomod/pip/poetry/composer 等大量解析器导入),结果转换为 PURL 格式输出(见 scanner/library.go 的convertLibWithScanner)。仓库 scanner/testdata/golden 下存放了大量真实锁文件的解析 golden 结果,可作为参考。JAR/WAR 等 Java 归档文件由 scanner/trivy/jar 负责解析出内部依赖库。
GitHub 集成(GitHub Integration)
对接 GitHub Security Alerts,将仓库清单(manifests)纳入扫描范围,相关模型见 models/github.go。
CPE 扫描(Common Platform Enumeration based Scan)
通过cpeNames字段指定 CPE URI,检测自编译软件、网络设备等没有包管理器的目标。加载配置时toCpeURI会做 CPE 规范化(见 config/tomlloader.go),检测阶段由 detector/detector.go 的DetectCpeURIsCves完成。
OWASP Dependency Check 集成
通过owaspDCXMLPath指定 OWASP Dependency Check 生成的 XML 文件,解析出 CPE 后参与检测(解析器位于 contrib/owasp-dependency-check/parser/parser.go,调用点在 detector/detector.go)。
WordPress 扫描
通过wordpress配置块(osUser、docRoot、cmdPath、noSudo,见 config/config.go)扫描 WordPress 核心、主题与插件,检测逻辑在 detector/wordpress.go。
容器扫描
containersIncluded/containersExcluded/containersOnly/containerType(支持 docker、lxd、lxc)控制容器级扫描,${running}通配可自动包含所有运行中的容器(见 scanner/scanner.go)。
构建与安装
仓库提供 GNUmakefile 一键构建:
make build # 构建完整版 vuls(含扫描与报告功能) make build-scanner # 构建仅扫描功能的精简版(-tags=scanner,用于 Server 模式下目标端采集) make install # 安装到 GOPATH各目标通过-ldflags注入版本、Git Revision 与构建时间(见 GNUmakefile)。也可用标准方式手动构建:
go build ./cmd/vuls完整版二进制注册的子命令在 cmd/scanner/main.go 中可见:discover、scan、history、configtest、saas,配合-v输出版本号。
实战流程:从配置到报告
1. 生成配置文件
使用discover子命令通过 CIDR 自动探测服务器并生成config.toml模板。
2. 编写 config.toml
Vuls 使用 TOML 配置,由 config/tomlloader.go 解析([default]段提供全局默认值,[servers.xxx]段定义每台目标)。ServerInfo中的常用字段:
| 字段 | 说明 |
|---|---|
host | 目标主机名/IP,支持 CIDR 展开;type = "pseudo"表示本地伪扫描 |
user/port/keyPath | SSH 连接参数(可省略以使用 SSH 配置) |
scanMode | fast/fast-root/deep/offline |
scanModules | ospkg/wordpress/lockfile/port |
ignoreCves/ignorePkgsRegexp | 忽略特定 CVE 或匹配正则的软件包 |
cpeNames/owaspDCXMLPath | CPE 与 OWASP DC 集成 |
containersIncluded等 | 容器扫描控制 |
lockfiles/findLock | 依赖锁文件扫描 |
enablerepo/disablerepo | 针对 CentOS/Alma/Rocky/RHEL/Amazon/Fedora 的 yum 仓库开关(目前仅允许base、updates,见 config/tomlloader.go) |
3. 验证配置
vuls configtest -config=/path/to/config.tomlconfigtest会检测服务器/容器 OS、检查扫描模式、检查依赖包与 sudo 免密设置(见 scanner/scanner.go),并输出可扫描的服务器列表。
4. 执行扫描
vuls scan -config=/path/to/config.tomlscan子命令完整参数见 subcmds/scan.go,常用参数包括:
-results-dir=/path/to/results:结果 JSON 输出目录(默认当前目录下results/);-timeout=300:除扫描外的处理超时(秒,默认 300);-timeout-scan=7200:全部服务器漏洞扫描超时(秒,默认 7200);-cachedb-path=/path/to/cache.db:Ubuntu/Debian changelog 本地缓存;-http-proxy=http://proxy:port:走代理访问互联网数据源;-pipe:从 stdin 读取目标服务器列表;-ips:采集 IPS(入侵防护系统)标识;-vvv:打印 SSH 调试信息(排查 SSH 连接问题时非常有用);-debug/-quiet/-log-to-file:日志控制。
扫描流程(scanner/scanner.go)依次为:并行探测各服务器/容器 OS → 校验扫描模式 → 检测平台(AWS/Azure/GCP 等)→ 按需检测 IPS → 并行执行各模块扫描(包、端口、WordPress、库),最后写入带时间戳的结果目录。
5. 生成报告
vuls report -config=/path/to/config.tomlreport子命令(subcmds/report.go)从结果目录读取 JSON,调用 detector/detector.go 的Detect完成漏洞检测与 CVE 信息富化,再按需输出。关键参数:
- 格式:
-format-json、-format-csv、-format-list、-format-full-text、-format-one-line-text、-format-one-email,以及 SBOM 格式-format-cyclonedx-json、-format-cyclonedx-xml、-format-spdx-json(实现见 reporter/sbom); - 过滤:
-cvss-over=7(只报告 CVSS ≥ 7)、-confidence-over=80(默认 80)、-ignore-unscored-cves、-ignore-unfixed; - 差异对比:
-diff(同时输出新增与消失的 CVE)、-diff-plus、-diff-minus,配合history子命令可用于跟踪漏洞变化趋势; - 通知渠道:
-to-slack、-to-email、-to-chatwork、-to-googlechat、-to-telegram、-to-syslog、-to-http、-to-localfile、-to-s3、-to-azure-blob; - Trivy 数据库:
-trivy-cachedb-dir、-trivy-db-repository、-trivy-java-db-repository、-trivy-skip-java-db-update,用于语言库漏洞检测的数据源管理; - 语言:
-lang=en|ja; - 最后可附带 RFC3339 格式的时间参数,指定只报告某个扫描批次。
未显式指定格式时默认输出 list 格式(subcmds/report.go)。若不加任何-to-*渠道,结果仅输出到 stdout。
6. 定期自动化
用 CRON 定时执行scan+report -to-slack/-to-email即可实现每日漏洞巡检;邮件与 Slack 通知支持日语。报告渠道的配置项(Webhook URL、Token、SMTP 服务器等)分别定义在 config/slackconf.go、config/smtpconf.go、config/chatworkconf.go 等文件中,并在report/server执行前的ValidateOnReport中统一校验(config/config.go)。
使用限制:Vuls 不做什么
需要明确的是:Vuls 不负责更新有漏洞的软件包。它只负责发现、定位与报告漏洞,更新动作仍由管理员结合企业变更流程手动完成。
源码阅读指引
若想深入理解 Vuls 的实现,建议按以下路径阅读当前仓库:
- 入口与子命令:cmd/scanner/main.go、subcmds/scan.go、subcmds/report.go;
- 配置体系:config/config.go、config/tomlloader.go、config/scanmode.go、config/scanmodule.go;
- 扫描引擎:scanner/scanner.go、scanner/base.go,以及各发行版实现(scanner/redhatbase.go、scanner/debian.go、scanner/alpine.go 等);
- 检测与富化:detector/detector.go、detector/vuls2(含各数据源解析器与 testdata/fixtures 测试样例);
- 报告输出:reporter(stdout、slack、email、s3、azureblob、syslog、sbom 等 Writer);
- 数据模型:models/scanresults.go、models/vulninfos.go、models/library.go;
- 构建脚本:GNUmakefile。
小结
Vuls 以"一台管理机 + SSH"的 agent-less 形态,把分散在各服务器上的漏洞信息收集、多源漏洞库比对、影响面分析与报告通知集中到一条自动化流水线中:discover生成配置 →configtest验证可扫描性 →scan采集与初筛 →report检测富化与多渠道输出,配合 CRON 即可形成常态化漏洞管理闭环。其 fast/fast-root/deep/offline 四种模式、Remote/Local/Server 三种架构,以及 Lockfile/CPE/OWASP DC/WordPress/容器等多模块扫描能力,使其在"仅靠标准包管理无法覆盖"的现代软件供应链场景(语言库、自编译软件、网络设备)中同样具备实战价值。
- 漏洞扫描
- 网络安全
- 运维
【免费下载链接】vuls
Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices
相关推荐
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考