AnasSahel/vulnex
GitHub: AnasSahel/vulnex
一款开源的多源漏洞情报聚合CLI工具,整合NVD、KEV、EPSS、GHSA、OSV等数据源,支持离线缓存、复合风险评分、SBOM扫描与CI/CD门禁。
Stars: 0 | Forks: 0
# vulnex
[](https://github.com/AnasSahel/vulnex/releases)
[](https://go.dev/)
[](https://github.com/AnasSahel/vulnex/actions/workflows/ci.yml)
[](LICENSE)
一款开源、支持离线、多源漏洞情报 CLI 工具。
vulnex 将 **NVD**、**CISA KEV**、**EPSS**、**GitHub Advisory Database** 和 **OSV.dev** 的数据聚合到统一的命令行体验中,具备本地 SQLite 缓存、复合风险评分和管道友好的输出。
**[文档](https://anassahel.github.io/vulnex/docs/)** | **[快速入门](https://anassahel.github.io/vulnex/docs/getting-started/)**
### 演示
```
$ vulnex cve get CVE-2021-44228
CVE-2021-44228 — Apache Log4j2 JNDI features do not protect against attacker controlled LDAP and other JNDI related endpoints
Severity CRITICAL (10.0)
Vector NETWORK / LOW / NONE / CHANGED
Priority P0 — Critical: actively exploited, high EPSS
EPSS 0.97185 (97.2%) — percentile: 99.99%
KEV Yes — due 2021-12-24
Published 2021-12-10
Modified 2023-11-06
Sources NVD · KEV · EPSS · GHSA · OSV
References
• https://logging.apache.org/log4j/2.x/security.html
• https://www.cisa.gov/known-exploited-vulnerabilities-catalog
```
## 功能特性
- **多源丰富化** — 在单次查询中结合 NVD、KEV、EPSS、GHSA 和 OSV 数据
- **复合风险评分** — 混合 CVSS、EPSS 和 KEV 信号的 P0–P4 优先级矩阵
- **可配置的评分配置文件** — 从内置配置(默认、漏洞聚焦、严重性聚焦)中选择,或为 CVSS、EPSS 和 KEV 信号设置自定义权重
- **Lockfile 扫描** — 直接扫描 lockfile 以查找漏洞:`go.sum`、`package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、`Cargo.lock`、`Gemfile.lock`、`requirements.txt`、`poetry.lock`、`composer.lock`
- **离线模式** — 具有可配置 TTL 的本地 SQLite 缓存;无需网络访问即可工作
- **SBOM 扫描** — 解析 CycloneDX/SPDX SBOM,查找按组件分组的漏洞,并生成 OpenVEX 文档
- **SBOM 差异比对** — 比较两个 SBOM,查看依赖项变更引入或修复了哪些漏洞
- **CI/CD 门禁** — `sbom check` 在发现漏洞时退出码为 1,`sbom diff` 在引入新漏洞时退出码为 1;通过 `--severity` 过滤以控制阈值
- **抑制文件** — `.vulnexignore` 允许团队抑制已接受的风险,支持包范围、过期日期和审计跟踪
- **管道友好** — 支持 stdin、多种输出格式和可组合的命令
- **零 CGO** — 纯 Go 编写,无 C 依赖;单个静态二进制文件
## 安装
### Homebrew
```
brew install AnasSahel/tap/vulnex
```
### 从源码安装
```
go install github.com/trustin-tech/vulnex@latest
```
### 从源码构建
```
git clone https://github.com/AnasSahel/vulnex.git
cd vulnex
make build
```
## 快速开始
```
# 利用所有数据源丰富 CVE
vulnex cve get CVE-2021-44228
# 检查 CVE 是否在 CISA Known Exploited Vulnerabilities 目录中
vulnex kev check CVE-2024-3094
# 获取 EPSS 利用概率
vulnex epss score CVE-2024-3094
# 搜索 CVE
vulnex cve search "apache log4j" --severity critical
# 扫描 lockfile 或 SBOM 以查找漏洞
vulnex sbom check go.sum
vulnex sbom check package-lock.json
vulnex sbom check bom.json
# 对比两个 SBOM — 此变更引入了哪些漏洞?
vulnex sbom diff old-bom.json new-bom.json
# 若存在严重漏洞则 CI 失败
vulnex sbom check bom.json --severity critical
# 查看评分配置文件和阈值
vulnex scoring
```
## 配置
初始化默认配置文件:
```
vulnex config init
# 创建 ~/.vulnex/config.yaml
```
管理设置:
```
vulnex config show
vulnex config get api_keys.nvd
vulnex config set api_keys.nvd "your-key-here"
```
你也可以通过环境变量或标志设置 NVD API 密钥:
```
export VULNEX_API_KEY="your-key-here"
# 或
vulnex --api-key "your-key-here" cve get CVE-2021-44228
```
## 全局标志
这些标志适用于所有命令:
| 标志 | 描述 |
|------|-------------|
| `-o, --output ` | 输出格式:`table`、`json`、`csv`、`markdown`、`yaml`、`sarif`(默认:`table`) |
| `-l, --long` | 显示完整描述而非截断内容 |
| `--no-color` | 禁用彩色输出 |
| `--api-key ` | NVD API 密钥 |
| `--cache-dir ` | 自定义缓存目录 |
| `--no-cache` | 绕过此请求的缓存 |
| `--offline` | 仅使用本地缓存的数据(无网络) |
| `--config ` | 配置文件路径 |
| `--timeout ` | HTTP 请求超时(例如 `30s`、`1m`、`2m30s`) |
| `-v, --verbose` | 详细输出 |
| `-q, --quiet` | 抑制非必要输出 |
## 命令
### `vulnex cve` — CVE 操作
#### `cve get` — 获取丰富的 CVE 详情
旗舰命令。将 NVD + KEV + EPSS + GitHub Advisory + OSV 结合到单一的丰富视图中。
```
vulnex cve get CVE-2021-44228
vulnex cve get CVE-2024-3094 CVE-2023-44228 --output json
echo "CVE-2024-3094" | vulnex cve get --stdin --output table
cat cves.txt | vulnex cve get --stdin --output csv > enriched.csv
# 使用加权评分
vulnex cve get CVE-2024-24790 --scoring-profile default
vulnex cve get CVE-2024-24790 --scoring-profile exploit-focused
vulnex cve get CVE-2024-24790 --cvss-weight 0.5 --epss-weight 0.3 --kev-weight 0.2
# 完全忽略 CVSS,仅根据真实世界的利用证据进行评分
vulnex cve get CVE-2024-3094 --cvss-weight 0 --epss-weight 0.7 --kev-weight 0.3
```
| 标志 | 描述 |
|------|-------------|
| `--stdin` | 从 stdin 读取 CVE ID |
| `--scoring-profile` | 用于评分的预设权重平衡:`default`(均衡)、`exploit-focused`(漏洞聚焦)或 `severity-focused`(严重性聚焦) |
| `--cvss-weight` | 严重性 (CVSS) 对最终分数的影响程度,范围从 0.0(忽略)到 1.0(全权重) |
| `--epss-weight` | 漏洞利用概率 (EPSS) 对最终分数的影响程度,范围从 0.0(忽略)到 1.0(全权重) |
| `--kev-weight` | 已知被利用状态 (KEV) 对最终分数的影响程度,范围从 0.0(忽略)到 1.0(全权重) |
#### `cve search` — 按关键字搜索 CVE
```
vulnex cve search "apache log4j"
vulnex cve search "remote code execution" --severity critical --has-kev
vulnex cve search "fortinet" --year 2024 --output json
vulnex cve search "xss" --cwe CWE-79 --limit 50
```
| 标志 | 描述 |
|------|-------------|
| `--severity` | 按严重性筛选:`LOW`、`MEDIUM`、`HIGH`、`CRITICAL` |
| `--has-kev` | 仅显示 CISA KEV 中的 CVE |
| `--year` | 按发布年份筛选 |
| `--cwe` | 按 CWE ID 筛选(例如 `CWE-79`) |
| `--no-rejected` | 排除已拒绝的 CVE(默认:true) |
| `--limit` | 最大结果数(默认:20) |
#### `cve list` — 使用筛选器列出 CVE
```
vulnex cve list --severity critical --limit 50
vulnex cve list --start-date 2024-01-01 --end-date 2024-12-31
vulnex cve list --offset 20 --limit 20
```
| 标志 | 描述 |
|------|-------------|
| `--severity` | 按严重性筛选 |
| `--start-date` | 发布开始日期(`YYYY-MM-DD`) |
| `--end-date` | 发布结束日期(`YYYY-MM-DD`) |
| `--limit` | 每页结果数(默认:20) |
| `--offset` | 分页的起始偏移量 |
#### `cve history` — 修改历史
```
vulnex cve history CVE-2021-44228
vulnex cve history CVE-2024-3094 --output json
```
#### `cve watch` — 本地关注列表
```
vulnex cve watch CVE-2024-3094 CVE-2021-44228 # add to watch list
vulnex cve watch --list # show watched CVEs
vulnex cve watch --refresh # re-fetch all watched CVEs
vulnex cve watch --remove CVE-2024-3094 # remove from list
cat cves.txt | vulnex cve watch --stdin # add from file
```
### `vulnex kev` — CISA 已知被利用漏洞
#### `kev list` — 列出所有 KEV 条目
浏览带有分页的 CISA KEV 目录。默认每页 20 个条目。
```
vulnex kev list # first 20 entries
vulnex kev list --limit 50 # 50 entries
vulnex kev list --limit 0 # all entries
vulnex kev list --offset 20 # skip first 20
vulnex kev list --ransomware # only ransomware-linked entries
vulnex kev list --output json
```
| 标志 | 描述 |
|------|-------------|
| `--limit` | 显示的最大条目数(默认:20,0 = 全部) |
| `--offset` | 跳过前 N 个条目以进行分页 |
| `--ransomware` | 仅显示已知勒索软件活动的条目 |
#### `kev recent` — 最近添加的条目
```
vulnex kev recent # last 7 days
vulnex kev recent --days 30
vulnex kev recent --ransomware # only ransomware-linked
```
| 标志 | 描述 |
|------|-------------|
| `--days` | 回溯的天数(默认:7) |
| `--ransomware` | 仅显示已知勒索软件活动的条目 |
#### `kev check` — 检查 CVE 是否在 KEV 中
为每个匹配项显示详细的标签-值输出。长字段(描述、所需操作、注释)默认被截断 — 使用 `--long` 显示完整内容。
```
vulnex kev check CVE-2021-44228
vulnex kev check CVE-2021-44228 --long
vulnex kev check CVE-2024-3094 CVE-2023-44228
echo "CVE-2024-3094" | vulnex kev check --stdin
```
#### `kev stats` — 目录统计
```
vulnex kev stats
vulnex kev stats --top 20
```
### `vulnex epss` — 漏洞利用预测评分系统
#### `epss score` — 获取 EPSS 分数
```
vulnex epss score CVE-2024-3094
vulnex epss score CVE-2024-3094 CVE-2023-44228 CVE-2021-44228
cat cves.txt | vulnex epss score --stdin --output csv
```
#### `epss top` — 按利用概率排名的顶级 CVE
```
vulnex epss top
vulnex epss top 50 --output json
```
#### `epss trend` — EPSS 分数随时间变化的历史
```
vulnex epss trend CVE-2021-44228
vulnex epss trend CVE-2024-3094 --days 30 --output json
```
### `vulnex advisory` — GitHub Advisory Database & OSV
#### `advisory search` — 搜索公告
```
vulnex advisory search "log4j"
vulnex advisory search "xss" --ecosystem npm --severity critical
vulnex advisory search "sql injection" --type reviewed --limit 50
```
| 标志 | 描述 |
|------|-------------|
| `--ecosystem` | 按生态系统筛选:`npm`、`pip`、`maven`、`go` 等 |
| `--severity` | 按严重性筛选:`critical`、`high`、`medium`、`low` |
| `--type` | 公告类型:`reviewed`、`malware`、`unreviewed`(默认:`reviewed`) |
| `--limit` | 最大结果数(默认:30) |
#### `advisory get` — 获取特定公告
```
vulnex advisory get GHSA-jfh8-c2jp-5v3q
vulnex advisory get GHSA-jfh8-c2jp-5v3q --output json
```
#### `advisory affected` — 查找包的公告
```
vulnex advisory affected lodash --ecosystem npm
vulnex advisory affected django --ecosystem pip --output json
```
### `vulnex sbom` — SBOM 分析
#### `sbom check` — 扫描 SBOM 或 lockfile 以查找漏洞
解析 CycloneDX/SPDX JSON 文件或包 lockfile,并在 OSV 中查询每个组件。结果按组件分组,显示公告 ID、严重性、修复版本和摘要。发现漏洞时以代码 1 退出,适用于 CI/CD 流水线。
```
vulnex sbom check bom.json
vulnex sbom check go.sum # lockfile support
vulnex sbom check package-lock.json # lockfile support
vulnex sbom check bom.json --vex # output as OpenVEX document
vulnex sbom check sbom-spdx.json --ecosystem npm # filter by ecosystem
vulnex sbom check bom.json --severity critical # only critical findings
vulnex sbom check bom.json --output json # structured JSON output
```
表格输出示例:
```
Parsed 3 components from bom.json
Found 6 vulnerabilities
django 3.2.0 (PyPI)
ID Severity Fixed Summary
GHSA-2gwj-7jmv-h26r CRITICAL 2.2.28 SQL Injection in Django
GHSA-xpfp-f569-q3p2 CRITICAL 3.2.5 SQL Injection in Django
lodash 4.17.20 (npm)
ID Severity Fixed Summary
GHSA-35jh-r3h4-6jhm HIGH 4.17.21 Command Injection in lodash
Summary: 3 components scanned, 2 vulnerable, 3 findings
CRITICAL: 2 HIGH: 1
```
| 标志 | 描述 |
|------|-------------|
| `--vex` | 输出 VEX 文档以共享分类决策 |
| `--enrich` | 添加来自多个来源的漏洞利用可能性、已知利用状态和严重性评分 |
| `--ecosystem` | 按生态系统筛选组件 |
| `--severity` | 按严重性筛选结果(如果无匹配项则退出码为 0) |
| `--ignore-file` | 抑制文件路径(默认:`.vulnexignore`) |
| `--strict` | 显示所有发现,包括被 `.vulnexignore` 抑制的 |
#### `sbom diff` — 比较两个 SBOM 的漏洞变化
比较两个 CycloneDX 或 SPDX JSON SBOM 文件,并报告哪些漏洞被添加、移除或未更改。当引入新漏洞时以代码 1 退出 — 将其用作 CI 门禁以阻止有风险的依赖项更改。
```
vulnex sbom diff old-bom.json new-bom.json
vulnex sbom diff old.json new.json --severity critical # only critical changes
vulnex sbom diff old.json new.json --ecosystem npm # filter by ecosystem
vulnex sbom diff old.json new.json -o json # structured JSON output
```
表格输出示例:
```
+ ADDED (2 vulnerabilities)
flask 0.12.0 (PyPI)
GHSA-562c-5r94-xh97 HIGH 0.12.3 Flask is vulnerable to Denial of...
GHSA-5wv5-4vpf-pj6m HIGH 1.0 Directory traversal in Flask
- REMOVED (1 vulnerability)
lodash 4.17.20 (npm)
GHSA-35jh-r3h4-6jhm HIGH 4.17.21 Command Injection in lodash
= UNCHANGED (55 vulnerabilities)
django 3.2.0 (PyPI)
GHSA-2gwj-7jmv-h26r CRITICAL 2.2.28 SQL Injection in Django
Summary: old=3 components (56 vulns), new=4 components (57 vulns), +2 added, -1 removed
```
| 标志 | 描述 |
|------|-------------|
| `--ecosystem` | 按生态系统筛选组件 |
| `--severity` | 按严重性筛选结果 |
| `--ignore-file` | 抑制文件路径(默认:`.vulnexignore`) |
| `--strict` | 显示所有发现,包括被 `.vulnexignore` 抑制的 |
### `.vulnexignore` — 抑制已接受的风险
在项目根目录中创建 `.vulnexignore` 文件以抑制已知的误报或已接受的风险。被抑制的发现从退出码计算中排除,允许你的 CI 门禁保持开启状态同时管理噪音。
```
suppressions:
- id: GHSA-2gwj-7jmv-h26r # required: advisory ID
package: django # optional: scope to package
reason: "Transitive dep, mitigated at WAF" # required: justification
expires: "2026-06-01" # optional: auto-unsuppress after date
approved_by: security-team # optional: who approved
```
**行为:**
- `sbom check` 和 `sbom diff` 自动从当前目录加载 `.vulnexignore`
- 使用 `--ignore-file ` 指定不同的文件
- 使用 `--strict` 跳过抑制并报告所有发现
- 过期条目(超过 `expires` 日期)会被自动忽略 — 发现将再次变为活动状态
- 在 `sbom diff` 中,只有**新增的**发现符合抑制条件(移除/未更改的不会触发 CI 门禁)
### `vulnex exploit` — 漏洞利用情报
#### `exploit check` — 检查漏洞利用可用性
将 CVE ID 与四个漏洞利用情报来源进行交叉引用 — GitHub PoC、Nuclei 模板、Metasploit 模块和 ExploitDB — 并呈现统一视图。
```
vulnex exploit check CVE-2021-44228
vulnex exploit check CVE-2021-44228 CVE-2017-0144 -o json
echo "CVE-2024-3094" | vulnex exploit check --stdin
```
输出示例:
```
CVE-2021-44228 — 8 known exploit(s)
SOURCE NAME URL
github kozmer/log4j-shell-poc (1.2k) https://github.com/kozmer/log4j-shell-poc
github fullhunt/log4j-scan (3.1k) https://github.com/fullhunt/log4j-scan
metasploit exploit/multi/http/log4shell_header_injection https://github.com/rapid7/...
nuclei http/cves/2021/cve-2021-44228.yaml https://github.com/projectdiscovery/...
exploitdb 50592 https://www.exploit-db.com/exploits/50592
Sources: GitHub (5) · Metasploit (2) · Nuclei (1) · ExploitDB (1)
```
| 标志 | 描述 |
|------|-------------|
| `--stdin` | 从 stdin 读取 CVE ID |
### `vulnex scoring` — 评分配置文件和阈值
显示内置评分配置文件和 P0–P4 优先级阈值矩阵。无需 API 调用。有关完整公式、计算示例和选择权重的实用指导,请参阅 [Scoring & Prioritization Guide](https://vulnex.dev/docs/scoring/)。
```
vulnex scoring
```
输出:
```
Scoring Profiles
================
default CVSS=0.30 EPSS=0.50 KEV=0.20
exploit-focused CVSS=0.10 EPSS=0.60 KEV=0.30
severity-focused CVSS=0.60 EPSS=0.30 KEV=0.10
Risk Priority Thresholds
========================
P0-CRITICAL In CISA KEV (regardless of other scores)
P1-HIGH EPSS >= 0.7 OR CVSS >= 9.0
P2-MEDIUM EPSS >= 0.3 OR (CVSS >= 7.0 AND EPSS >= 0.1)
P3-LOW CVSS >= 7.0 but EPSS < 0.1
P4-MINIMAL CVSS < 7.0 AND EPSS < 0.1
```
使用 `--scoring-profile` 配合 `cve get` 以显示加权分数:
```
vulnex cve get CVE-2024-24790 --scoring-profile default
vulnex cve get CVE-2024-24790 --scoring-profile exploit-focused
vulnex cve get CVE-2024-24790 --scoring-profile severity-focused
```
### `vulnex stats` — 漏洞统计
```
vulnex stats --year 2024 # severity breakdown
vulnex stats --group-by cwe --year 2024 --limit 10 # top CWEs
vulnex stats --group-by month --year 2024 # monthly trend
vulnex stats --group-by vendor --vendor "apache" --year 2024
```
| 标志 | 描述 |
|------|-------------|
| `--group-by` | 分组方式:`month`、`cwe`、`vendor`(默认:severity) |
| `--year` | 按发布年份筛选 |
| `--vendor` | 按供应商关键字筛选 |
| `--severity` | 按严重性筛选 |
| `--limit` | 最大行数(默认:20) |
### `vulnex cache` — 缓存管理
/etc/bash_completion.d/vulnex
# Zsh
vulnex completion zsh > "${fpath[1]}/_vulnex"
# Fish
vulnex completion fish > ~/.config/fish/completions/vulnex.fish
# PowerShell
vulnex completion powershell > vulnex.ps1
```
## 管道与组合
所有接受 CVE ID 的命令都支持 `--stdin` 进行管道传输:
```
# 链式调用:获取最近的 KEV 条目并进行丰富
vulnex kev recent --days 7 -o csv | cut -d, -f1 | vulnex cve get --stdin -o json
# 从文件批量评分
cat my-cves.txt | vulnex epss score --stdin -o csv > scores.csv
# 预热缓存后的离线模式
vulnex cve get CVE-2021-44228 # fetches and caches
vulnex --offline cve get CVE-2021-44228 # reads from cache only
```
## 输出格式
使用 `-o` / `--output` 切换格式:
| 格式 | 描述 |
|--------|-------------|
| `table` | 彩色终端表格(默认) |
| `json` | 格式化的 JSON |
| `csv` | 逗号分隔值 |
| `markdown` | Markdown 表格 |
| `yaml` | YAML |
| `sarif` | 用于 GitHub Code Scanning、Azure DevOps、IDE 查看器的 [SARIF v2.1.0](https://sarifweb.azurewebsites.net/) |
### SARIF 输出与 GitHub Code Scanning
生成 SARIF v2.1.0 输出以与 GitHub Code Scanning、Azure DevOps 和兼容 SARIF 的 IDE 查看器集成:
```
vulnex sbom check bom.json -o sarif > results.sarif
```
在 CI 中上传至 GitHub Code Scanning:
```
- run: vulnex sbom check bom.json -o sarif > results.sarif
continue-on-error: true
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
```
## 数据来源
| 来源 | 描述 | API |
|--------|-------------|-----|
| [NVD](https://nvd.nist.gov/) | NIST 国家漏洞数据库 | NVD API 2.0 |
| [CISA KEV](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) | 已知被利用漏洞目录 | JSON feed |
| [EPSS](https://www.first.org/epss/) | 漏洞利用预测评分系统 | FIRST.org API |
| [GitHub Advisory](https://github.com/advisories) | GitHub 公告数据库 | REST API |
| [OSV](https://osv.dev/) | 开源漏洞 | OSV.dev API |
## 许可证
MIT
标签:AI Agent, CISA KEV, CISA项目, CVE, DevSecOps, EPSS, EVTX分析, GitHub Advisory, Go, GPT, NVD, OSV, Ruby工具, SBOM, SQLite, StruQ, Vercel, XSS, 上游代理, 安全合规, 提示词注入, 数字签名, 文档安全, 日志审计, 漏洞情报, 漏洞管理, 硬件无关, 网络代理, 软件供应链安全, 远程方法调用, 风险评分