关于 GhostFree
GhostFree 是面向使用 AI 编码助手的团队的本地 MCP 服务,可检查仓库依赖中的已知 CVE。它结合 OSV.dev 结果与 NVD、CISA KEV 信息,并在仓库中保存已接受的风险。
主要功能
- 01从仓库清单发现依赖项
- 02按严重程度查询 OSV.dev 的 CVE
- 03使用 NVD 和 CISA KEV 补充漏洞信息
- 04记录并管理有期限的风险接受项
适用场景
- 01检查仓库依赖中的已知 CVE
- 02按严重程度和利用状态安排漏洞优先级
- 03记录风险接受理由和到期日期
MCP 相关
向 MCP 客户端提供依赖发现、CVE 检查与信息补充、已接受风险管理工具,并提供扫描提示词。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y ghostfreeGHOSTFREE_DIROverride the directory where GhostFree stores its data files (accepted-risks.yml, config.yml). Defaults to .ghostfree/ in the scanned repository root.GHOSTFREE_MIN_SEVERITYMinimum CVE severity level to surface. One of: CRITICAL, HIGH, MEDIUM (default), LOW.NVD_API_KEY密钥Optional NVD API key for higher rate limits when enriching CVE details. Free to request at https://nvd.nist.gov/developers/request-an-api-key.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
6收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
什么是 GhostFree 🚫👻?
每个软件团队都可以借助一些工具,清除潜伏在依赖项中的代码库幽灵。
GhostFree 是一个本地 MCP 服务,可基于已发布的 CVE,使用 OSV.dev 扫描代码仓库依赖项中的已知漏洞,借助 NVD 和 CISA KEV 丰富发现结果,帮助你分类处理并修复问题,还能让你管理已接受的风险——所有操作都可直接通过 AI 编码助手完成。
快速开始
无需安装、注册或付费。将 GhostFree 添加到你所用代码工具的 MCP 设置中,然后运行 /ghostfree.scan。
VS Code Copilot(扩展——最简单)
在扩展视图中搜索 @mcp ghostfree(Ctrl+Shift+X),然后点击 安装。接着打开命令面板(Ctrl+Shift+P),运行 MCP: List Servers,选择 GhostFree,点击 Start Server,并在出现提示时确认信任。无需 JSON 配置。
VS Code Copilot(手动配置)
在项目根目录中创建或更新 .vscode/mcp.json:
{
"servers": {
"ghostfree": {
"type": "stdio",
"command": "npx",
"args": ["-y", "ghostfree", "--repo-path", "${workspaceFolder}"],
"env": {}
}
}
}
Claude Code
在项目根目录中创建 .mcp.json:
{
"mcpServers": {
"ghostfree": {
"type": "stdio",
"command": "npx",
"args": ["-y", "ghostfree", "--repo-path", "."]
}
}
}
Cursor
创建 .cursor/mcp.json:
{
"mcpServers": {
"ghostfree": {
"command": "npx",
"args": ["-y", "ghostfree", "--repo-path", "."]
}
}
}
Claude Desktop
将配置添加到 claude_desktop_config.json(文件位置因操作系统而异):
{
"mcpServers": {
"ghostfree": {
"command": "npx",
"args": ["-y", "ghostfree", "--repo-path", "/path/to/your/repo"]
}
}
}
使用方法
/ghostfree.scan 提示词
推荐使用内置提示词运行扫描。在 AI 客户端中输入:
/ghostfree.scan
此提示词会引导你完成以下流程:
- 发现 — 查找所有清单文件(requirements.txt、package.json、go.mod、Cargo.toml、pom.xml、*.csproj 等)
- 设置阈值 — 如果尚未配置,则询问你要设定的最低严重性级别(CRITICAL / HIGH / MEDIUM / LOW)
- 扫描 — 查询 OSV.dev,查找所有已发现软件包的 CVE
- 分类处理 — 每次展示 10 条带编号的结果,由你选择要调查的项目。
- 丰富信息 — 获取你所选项目的 CVSS 向量、CWE 分类,以及 CISA KEV“正在被积极利用”状态
- 修复 — 建议升级、修改代码,或说明理由并设置到期日以接受风险
会话示例
User: /ghostfree.scan
GhostFree: Discovering dependencies...
Found 84 packages across 2 ecosystems (npm, PyPI).
What minimum severity should I surface? (CRITICAL / HIGH / MEDIUM / LOW)
User: HIGH
GhostFree: Scanning against OSV.dev...
[1] CVE-2021-44228 CRITICAL (10.0) — org.apache.logging.log4j:[email protected]
Log4Shell: Remote code execution via JNDI lookup
Fix: upgrade to 2.17.1
[2] CVE-2022-25881 HIGH (7.5) — [email protected]
ReDoS in http-cache-semantics
Fix: upgrade to 4.1.1
[3] CVE-2021-28918 CRITICAL (9.8) — [email protected]
IP address parsing bypass (SSRF / allowlist bypass)
Fix: upgrade to 1.1.0
Showing 1-3 of 3. Which would you like to investigate? (e.g., 1, 2, or 'all')
User: 3
GhostFree: [Calls enrich_cve CVE-2021-28918]
CVE-2021-28918 — netmask CRITICAL (9.8)
CVSS: 9.1 · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
CWE: CWE-704 (Incorrect Type Conversion)
CISA KEV: Not listed
What it is: [email protected] improperly parses octal-notation IP addresses (e.g. 010.0.0.1),
treating them as decimal. This enables SSRF protection bypass and IP allowlist/blocklist
bypass — an attacker can craft an address that appears private but routes to a public host.
Exploit status: Not in CISA KEV. Public PoC exists (SICK-2021-011), ~280k affected projects.
Codebase exposure: netmask is not directly imported — it appears in package-lock.json as a
transitive dependency of [email protected] (a transitive dev dependency). No direct
require('netmask') or IP parsing logic found. Reachability is very low.
Recommendation: Upgrade — low effort, patch version (1.0.6 → 1.1.0), no API changes.
netmask is a transitive dependency; use npm audit fix or add a package.json overrides entry
to force [email protected].
→ Reply with a number to investigate another CVE, 'back' to return to the list,
'fix' to apply the recommended fix, 'accept' to record an accepted risk, or 'done' to wrap up.
示例:接受已知风险
User: Accept CVE-2022-25881 — it's only in our CI test pipeline, not reachable in production. Expiry end of year.
GhostFree: [Calls accept_risk CVE-2022-25881]
Accepted risk recorded:
• CVE-2022-25881 — http-cache-semantics (HIGH, CVSS 7.5)
Reason: Only used in CI test pipeline, not reachable in production
Expires: 2026-12-31
ID: 550e8400-e29b-41d4-a716-446655440000
This acceptance is saved to .ghostfree/accepted.yml. Commit this file to share the
decision with your team. The CVE will be suppressed on future scans until expiry.
User: List all accepted risks
GhostFree: [Calls list_accepted_risks]
## Accepted Risks (1)
**CVE-2022-25881** — ✅ expires in 272 days (2026-12-31) | Severity at acceptance: HIGH (7.5)
ID: 550e8400-e29b-41d4-a716-446655440000
Reason: Only used in CI test pipeline, not reachable in production
Accepted: 2026-04-03T10:00:00.000Z
示例:丰富特定 CVE 的信息
User: Tell me everything about CVE-2021-44228
GhostFree: [Calls enrich_cve CVE-2021-44228]
## Enrichment: CVE-2021-44228
### NVD
CVSS Score: 10.0 · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CWE: CWE-917 (Improper Neutralization of Special Elements in an Expression Language Statement)
References:
• https://nvd.nist.gov/vuln/detail/CVE-2021-44228
• https://logging.apache.org/log4j/2.x/security.html
### CISA KEV
⚠️ CONFIRMED actively exploited in the wild (added to KEV: 2021-12-10)
工具参考
| 工具 | 只读 | 描述 |
|---|---|---|
discover_dependencies | ✅ | 扫描代码仓库清单,按生态系统返回所有固定版本的软件包 |
check_cves | ✅ | 查询 OSV.dev 中的 CVE,按严重性筛选,并应用已接受的风险 |
enrich_cve | ✅ | 从 NVD 获取 CVSS、CWE 和参考资料,并查询 KEV 中的利用状态 |
list_accepted_risks | ✅ | 列出所有已接受的风险,包括到期状态和严重性快照 |
accept_risk | ❌ | 记录已接受的风险,包括理由、到期日和严重性快照 |
remove_accepted_risk | ❌ | 通过 UUID 移除已接受的风险 |
所有只读工具都可以在 MCP 客户端中安全地自动批准。写入工具(accept_risk、remove_accepted_risk)会要求确认。
check_cves 输入
| 参数 | 必填 | 描述 |
|---|---|---|
packages | 是 | {name, version, ecosystem} 数组——使用 discover_dependencies 的输出 |
min_severity | 否 | CRITICAL、HIGH、MEDIUM 或 LOW。如果未传入,则按以下顺序解析:GHOSTFREE_MIN_SEVERITY 环境变量,然后是 .ghostfree/config.yml,最后提示你选择 |
accept_risk 输入
| 参数 | 必填 | 描述 |
|---|---|---|
cve_id | 是 | CVE ID,例如 CVE-2021-44228 |
reason | 是 | 业务理由 |
expires_on | 是 | 采用 YYYY-MM-DD 格式的到期日期 |
confirm_extended_expiry | 否 | 如果到期日期超过 1 年后,设为 true |
severity | 是 | 接受风险时的严重性标签(CRITICAL、HIGH、MEDIUM、LOW、UNKNOWN)——快照,不会实时更新 |
cvss_score | 否 | 接受风险时的 CVSS 分数——快照,不会实时更新 |
配置
在仓库根目录创建 .ghostfree/config.yml,设置一个可通过源代码管理与团队共享的持久严重性阈值:
min_severity: HIGH
此设置的优先级高于环境变量。如果两者均未设置,GhostFree 会在扫描时提示你选择。
环境变量
| 变量 | 描述 |
|---|---|
NVD_API_KEY | 可选的 NVD API 密钥,可提高速率限制(50 req/30s,而非 5 req/30s) |
GHOSTFREE_MIN_SEVERITY | 可选——跳过严重性提示,并始终使用此阈值(CRITICAL、HIGH、MEDIUM 或 LOW) |
GHOSTFREE_DIR | 可选——使用自定义目录代替 .ghostfree/(同时适用于 accepted.yml 和 config.yml) |
VS Code 扩展用户: 在工作区根目录创建 .env 文件——扩展会自动读取该文件,并将其中的值转发给服务。对于其他所有设置(手动配置 MCP JSON):将这些变量添加到客户端配置文件(.vscode/mcp.json、.mcp.json、.cursor/mcp.json、claude_desktop_config.json 等)的 "env" 块中,或将其导出为系统环境变量。
接受风险管理
接受风险时,GhostFree 会将其写入仓库根目录下的 .ghostfree/accepted.yml。提交此文件,以便与团队共享已接受的决策。
accepted_risks:
- id: 550e8400-e29b-41d4-a716-446655440000
cve_id: CVE-2022-25881
reason: Only used in CI test pipeline, not reachable in production
expires_on: "2027-01-01"
accepted_at: "2026-04-02T10:00:00.000Z"
severity_at_acceptance: HIGH
cvss_score_at_acceptance: 7.5
规则:
expires_on为必填项——不允许无限期接受风险- 到期时间在 1 年内:立即接受
- 到期时间超过 1 年:需要
confirm_extended_expiry=true - 已过期的接受记录绝不会被静默丢弃——每次扫描都会重新显示为警告
支持的生态系统和清单文件
| 生态系统 | 清单文件 |
|---|---|
| Python | requirements.txt、pyproject.toml、Pipfile.lock、setup.cfg |
| Node.js | package.json、package-lock.json |
| Go | go.mod、go.sum |
| Rust | Cargo.toml、Cargo.lock |
| Java | pom.xml、build.gradle、build.gradle.kts |
| .NET | *.csproj、packages.config |
版本范围处理
当清单指定的是版本范围而非确切版本时,GhostFree 会提取一个版本,用于查询漏洞数据库。我们使用两种分类法来清晰说明相关逻辑:VRC(说明某个说明符 意味着什么)和 VRHP(说明我们会 如何处理)。
版本范围概念(VRC)
VRC 是一个与生态系统无关的标签,用于描述版本说明符所表达的含义。同一条目可以适用多个 VRC(例如,带有预发布标签的插入符范围为 vrc-caret + vrc-prerelease)。
| VRC | 概念 | 生态系统示例 |
|---|---|---|
vrc-exact | 精确固定的版本 | npm 1.4.0、Python ==2.28.0、Cargo 1.0.188、Maven 6.0.11 |
vrc-lockfile-pin | 锁文件中的解析版本 | package-lock.json、Cargo.lock、go.sum、Pipfile.lock |
vrc-prerelease | 预发布/非稳定版标签 | 1.0.0-beta、9.0.0-preview.1、1.0.0-SNAPSHOT、32.1.2-jre |
vrc-caret | 插入符(兼容主版本)范围 | npm ^1.2.3、Cargo ^1.0.100、Poetry ^2.28.0 |
vrc-tilde | 波浪号(兼容次版本/补丁版本)范围 | npm ~4.17.0、Cargo ~1.0.0、Poetry ~2.28.0 |
vrc-inclusive-minimum | 含下限(>=) | npm >=1.2.0、Python >=2.28.0、Cargo >=0.5 |
vrc-exclusive-minimum | 不含下限(>) | npm >1.0.0、Python >2.0、Cargo >0.5 |
vrc-compatible-release | 兼容版本 | Python ~=2.28 |
vrc-compound | 组合多个约束 | npm >=1.0.0 <2.0.0、Cargo >=0.5, <1.0、Python >=2.28,<3.0 |
vrc-inclusive-range | 下限包含在内的方括号区间 | NuGet [1.0,2.0)、Maven [1.0,2.0] |
vrc-exclusive-range | 下限不包含在内的方括号区间 | NuGet (4.1.3,)、Maven (1.0,2.0) |
vrc-wildcard | 通配符/任意版本 | npm *、NuGet 6.*、Cargo * |
vrc-upper-bound-only | 只有上限,没有下限 | npm <2.0.0、Python <=3.0、NuGet [,1.0]、(,1.0) |
vrc-exclusion | 排除版本 | Python !=2.0 |
vrc-tag | 命名标签或别名 | npm latest |
vrc-workspace-ref | 工作区/路径引用 | npm workspace:*、Cargo { workspace = true } |
vrc-property-placeholder | 构建变量占位符 | Maven ${spring.version} |
vrc-build-metadata | 构建元数据后缀 | Go v1.0.0+build.123 |
vrc-pseudo-version | Go 伪版本 | Go v0.0.0-20230817171753-abc123 |
版本范围处理原则(VRHP)
VRHP 是 GhostFree 在识别出 VRC 后采取的操作。使用字符串作为键,因此顺序不会产生影响。
| VRHP | 操作 | 详情 |
|---|---|---|
vrhp-lockfile | 使用锁文件版本 | 如果存在已解析的锁文件(package-lock.json、Cargo.lock、go.sum、Pipfile.lock),则使用其中精确的已安装版本。无需进行任何解释。 |
vrhp-extract-lower | 提取下限 | 对于范围说明符(^、~、>=),提取开发者所接受的最低版本。这是他们可能运行的最旧版本,也是最可能存在漏洞的版本。 |
vrhp-skip | 跳过依赖项 | 如果说明符只提供上限(<=、<)、用于排除版本(!=)、无法解析(*、latest、workspace:*),或使用只有解析器才能计算的表示法,则跳过该依赖项。查询错误的版本会导致误报或漏报,两者都比覆盖范围缺口更糟;后者可通过固定版本或提供锁文件来弥补。 |
vrhp-preserve-prerelease | 保留预发布标签 | 1.0.0-beta.1、2.0.0-rc 和 32.1.2-jre 等版本会按原样查询。预发布版本可能有自己的 CVE,不得删除标签或规范化版本。当 vrc-prerelease 与另一个 VRC 同时出现时,此原则始终与主要 VRHP 一并适用。 |
vrhp-passthrough | 原样传递 | Go go.mod、.NET packages.config 和所有锁文件都使用精确固定的版本,不含范围运算符。非版本字符串(例如 Maven 中的 ${...} 属性占位符)会被跳过。 |
生态系统示例
| 生态系统 / 文件 | 输入示例 | 查询版本 | VRC | VRHP |
|---|---|---|---|---|
.NET *.csproj — 精确版本 | 2.28.2 | 2.28.2 | vrc-exact | vrhp-passthrough |
.NET *.csproj — 预发布版本 | 1.0.0-beta, 9.0.0-preview.1 | 1.0.0-beta, 9.0.0-preview.1 | vrc-exact + vrc-prerelease | vrhp-passthrough |
.NET *.csproj — 含下限的区间 [lower,upper) | [1.0,2.0) | 1.0 | vrc-inclusive-range | vrhp-extract-lower |
.NET *.csproj — 通配符 6.*、6.0.* | 6.*, 6.0.* | 6.0, 6.0.0 | vrc-wildcard | vrhp-extract-lower — 将 .* 替换为 .0 |
.NET *.csproj — 不含下限 / 仅上限 | (4.1.3,), [,1.0], (,1.0) | (省略) | vrc-exclusive-range, vrc-upper-bound-only | vrhp-skip |
.NET packages.config — 精确版本 | 13.0.3 | 13.0.3 | vrc-exact | vrhp-passthrough |
.NET packages.config — 预发布版本 | 5.0.0-beta.1 | 5.0.0-beta.1 | vrc-exact + vrc-prerelease | vrhp-passthrough |
Go go.mod — 精确版本 | v1.21.0 | 1.21.0 | vrc-exact | vrhp-passthrough — 去除 v 前缀 |
Go go.mod — 预发布版本 / 构建元数据 | v1.0.0-beta.1, v2.0.0+build.123 | 1.0.0-beta.1, 2.0.0+build.123 | vrc-prerelease, vrc-build-metadata | vrhp-passthrough — 去除 v;保留标签 |
Go go.sum — 精确版本 | v1.21.0 | 1.21.0 | vrc-lockfile-pin | vrhp-lockfile — 去除 v;对 /go.mod 行去重 |
Go go.sum — 预发布版本 | v1.0.0-rc.1 | 1.0.0-rc.1 | vrc-lockfile-pin + vrc-prerelease | vrhp-lockfile — 去除 v |
Java build.gradle / build.gradle.kts — 精确版本 | 2.28.2 | 2.28.2 | vrc-exact | vrhp-passthrough |
Java build.gradle / build.gradle.kts — 预发布版本 / SNAPSHOT / 分类器 | 1.0.0-SNAPSHOT, 32.1.2-jre | 1.0.0-SNAPSHOT, 32.1.2-jre | vrc-exact + vrc-prerelease | vrhp-passthrough |
Java build.gradle / build.gradle.kts — 含下限的区间 | [1.0,2.0) | 1.0 | vrc-inclusive-range | vrhp-extract-lower |
Java build.gradle / build.gradle.kts — 不含下限 / 仅上限 | (4.1.3,), [,1.0] | (省略) | vrc-exclusive-range, vrc-upper-bound-only | vrhp-skip |
Java pom.xml — 精确版本 | 2.28.2 | 2.28.2 | vrc-exact | vrhp-passthrough |
Java pom.xml — 预发布版本 / SNAPSHOT / 分类器 | 1.0.0-SNAPSHOT, 32.1.2-jre | 1.0.0-SNAPSHOT, 32.1.2-jre | vrc-exact + vrc-prerelease | vrhp-passthrough |
Java pom.xml — 含下限的区间 | [1.0,2.0) | 1.0 | vrc-inclusive-range | vrhp-extract-lower |
Java pom.xml — 不含下限 / 仅上限 / 占位符 | (4.1.3,), [,1.0], ${spring.version} | (省略) | vrc-exclusive-range, vrc-upper-bound-only, vrc-property-placeholder | vrhp-skip |
npm package.json — 精确版本 | 1.4.0 | 1.4.0 | vrc-exact | vrhp-passthrough |
npm package.json — 预发布版本 | 1.0.0-beta.1, ^1.0.0-rc.2 | 1.0.0-beta.1, 1.0.0-rc.2 | vrc-prerelease, vrc-caret + vrc-prerelease | vrhp-preserve-prerelease, vrhp-extract-lower |
npm package.json — ^、~、>=、>、= | ^1.2.3, >=1.2.0 <2.0.0 | 1.2.3, 1.2.0 | vrc-caret, vrc-compound | vrhp-extract-lower |
npm package.json — *、latest、workspace:*、< | *, latest, <2.0.0 | (省略) | vrc-wildcard, vrc-tag, vrc-workspace-ref, vrc-upper-bound-only | vrhp-skip |
npm package-lock.json | 1.2.3 | 1.2.3 | vrc-lockfile-pin | vrhp-lockfile |
Python Pipfile.lock | 2.28.2 | 2.28.2 | vrc-lockfile-pin | vrhp-lockfile |
Python pyproject.toml(PEP 621)— == / >= / ~= | httpx==0.24.0, pydantic>=2.0.0 | 0.24.0, 2.0.0 | vrc-exact, vrc-inclusive-minimum | vrhp-passthrough, vrhp-extract-lower |
Python pyproject.toml(Poetry)— ^、~、>= | ^2.28.0, >=2.28,<3.0 | 2.28.0, 2.28 | vrc-caret, vrc-compound | vrhp-extract-lower |
Python pyproject.toml(Poetry)— 预发布版本 | ^1.0.0-beta | 1.0.0-beta | vrc-caret + vrc-prerelease | vrhp-extract-lower |
Python pyproject.toml(Poetry)— 仅 !=、< | !=2.28.0, <3.0 | (省略) | vrc-exclusion, vrc-upper-bound-only | vrhp-skip |
Python requirements.txt、setup.cfg — == / === / >= / > / ~= | requests>=2.28.0, requests~=2.28, requests===2.0.0 | 2.28.0, 2.28, 2.0.0 | vrc-inclusive-minimum, vrc-compatible-release, vrc-exact | vrhp-extract-lower, vrhp-passthrough |
Python requirements.txt、setup.cfg — 预发布版本 | requests==1.0.0-beta | 1.0.0-beta | vrc-exact + vrc-prerelease | vrhp-passthrough |
Python requirements.txt、setup.cfg — 仅 <= / < / != | requests<=2.28.0 | (省略) | vrc-upper-bound-only, vrc-exclusion | vrhp-skip |
Rust Cargo.toml — 纯版本号(隐式 ^) | 1.0.188 | 1.0.188 | vrc-exact | vrhp-passthrough |
Rust Cargo.toml — 预发布版本 | 1.0.0-beta | 1.0.0-beta | vrc-exact + vrc-prerelease | vrhp-passthrough |
Rust Cargo.toml — ^、~、>=、>、= | ^1.0, >=0.5 | 1.0, 0.5 | vrc-caret, vrc-inclusive-minimum | vrhp-extract-lower |
Rust Cargo.toml — *、< | *, <1.0 | (省略) | vrc-wildcard, vrc-upper-bound-only | vrhp-skip |
Rust Cargo.lock | 1.0.86 | 1.0.86 | vrc-lockfile-pin | vrhp-lockfile |
常见问题
问:为什么我需要超出现有 AI 编码 Agent 能力的工具?
AI Agent 对漏洞的认知会停留在其训练数据截止时点。每天都会披露新的 CVE——例如,Log4Shell 于 2021 年 12 月披露,在此之前训练的任何模型都无法识别它。
GhostFree 会查询权威漏洞报告机构的实时信息,确保每次扫描都反映当前的威胁态势,无论模型是在何时训练的。这些额外的上下文对于提高 Agent 所提供建议或推荐的准确性也至关重要。
它还会记录你接受的风险及其原因和到期日期,在你的代码仓库中建立可审计的记录。
GhostFree 的目标是在尽可能确保确定性的同时,仍由你选择的、与 GhostFree 交互的 Agent 执行核心操作。我们建议使用你能负担得起的最佳模型,但根据我们的测试,这种确定性策略有助于较便宜、较弱的模型在 GhostFree 的辅助下,成为效果不错的漏洞修复助手。
问:GhostFree 会将我的代码上传到任何地方吗?
不会。只会向 OSV.dev 发送软件包名称和版本。你的源代码不会离开你的设备。
问:我需要 API 密钥吗?
不需要。OSV.dev 无需身份验证。没有密钥也可以获取 NVD 补充信息(速率限制为每 30 秒 5 个请求);在通常的人工使用中,你不太可能触及此限制(不过,如果在某些自主 Agent 配置中运行,就可能会遇到)。如需提高限制,请设置环境变量 NVD_API_KEY(更多详情请参阅 nist.gov 网站)。
问:如果我处于离线状态怎么办?
扫描需要访问 OSV.dev。如果无法访问,NVD 和 KEV 补充信息会优雅降级,并发出警告。
问:它会扫描传递依赖吗?
部分支持。如果存在锁文件,GhostFree 会扫描完整的解析后依赖关系图(直接依赖 + 传递依赖):Node.js 使用 package-lock.json,Rust 使用 Cargo.lock,Go 使用 go.sum,Python 使用 Pipfile.lock。对于不支持锁文件的生态系统(Java、.NET),只会扫描直接声明的依赖。
问:扫描发现了一个我已经修复的 CVE,该怎么办?
更新清单中的软件包版本。下次扫描时,该漏洞就不会再出现。
支持
如需报告错误或提出功能请求,请在 GitHub 上提交 issue。
隐私政策
GhostFree 会在你的设备上本地处理代码仓库的依赖清单。以下是离开你设备的数据及其去向:
| 发送的数据 | 目的地 | 用途 |
|---|---|---|
| 软件包名称和版本 | OSV.dev(Google) | CVE 查询 |
| CVE ID | NVD API(NIST/美国政府) | CVSS 评分和 CWE 补充信息 |
| CVE ID | CISA KEV(美国政府) | 已知利用状态 |
我们绝不会以任何方式将源代码、文件内容、代码仓库名称、用户标识符或遥测数据发送到任何地方。 与使用任何 AI 辅助工具一样,你的底层环境、AI 模型、Agent、IDE 等如何选择与我们的代码和你的代码交互,均不受我们控制。使用此工具的任何人都应熟悉随附的 LICENSE.txt(MIT)中的信息。
GhostFree 不会收集、存储或共享任何数据。所有处理均在本地进行。已接受风险文件(.ghostfree/accepted.yml)保留在你的代码仓库中,由你掌控。
如有疑问,请在 GitHub 上提交 issue。
致谢
GhostFree 完全建立在三个组织的成果之上:它们向全世界免费开放漏洞情报,同时也有世界各地的漏洞研究人员报告 CVE。没有他们,就不会有这个工具。
Google 开源安全团队 — 开源漏洞(OSV)
OSV.dev 是每次 GhostFree 扫描的基石。它提供免费的开放 API,可按软件包名称和版本查询所有主要软件包生态系统中的已知漏洞,并在单个响应中包含严重性评分和修复版本数据。其宽松的速率限制和无需身份验证的设计,使其非常适合在每位开发者的本地设备上运行。
美国国家标准与技术研究院 — 国家漏洞数据库(NVD)
国家漏洞数据库由美国商务部下属的 NIST 维护,是每个已发布 CVE 的标准化 CVSS 严重性向量和 CWE 分类的权威来源。GhostFree 在逐个 CVE 分诊时调用 NVD API 2.0,以提供开发者做出明智修复决策所需的完整技术细节。
美国网络安全和基础设施安全局 — 已知遭利用漏洞(KEV)
CISA 隶属于美国国土安全部,负责发布和维护已知遭利用漏洞目录——其中收录了一份经过筛选的 CVE 清单,这些漏洞已确认正在现实环境中遭到积极利用。GhostFree 会下载并使用该目录,以回答最能影响团队采取行动紧迫程度的问题:这个漏洞现在正遭到利用吗?
我们的目标是让每位开发者都能尽可能便捷地获取这些组织提供的安全情报——这些情报耗费大量公共资金收集,并以促进互联网安全为目的免费共享,无论开发者身在何处都能使用。追逐这些漏洞的恶意分子不会休息,数据也不会。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。