mcpField
R
reachvuln

reachvuln

本地服务
github.com/CloudCorpRecords安全01 周前更新

关于 reachvuln

reachvuln 是供开发者按代码可达性排列漏洞报告的本地工具,帮助确定修复优先级。它分析提供的导入关系和入口点,并按明确的严重性权重及可达性系数评分。

主要功能

  1. 01根据导入图计算可达性
  2. 02匹配易受攻击的软件包导出项
  3. 03按可达性对发现项分类
  4. 04按固定规则为发现项排序
  5. 05验证输入并返回统计数

适用场景

  1. 01确定扫描器报告中的修复优先级
  2. 02识别可从应用入口到达的发现项
  3. 03区分未使用的软件包与可达漏洞
  4. 04依据提供的模块数据排列漏洞

MCP 相关

向 MCP 客户端提供 rank_vulns_by_reach 工具。该工具接收漏洞发现项、模块导入关系和入口点,并返回排序结果及可达性统计。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cloudcorprecords-reachvuln": {
"command": "npx",
"args": [
"-y",
"@reneturcios/reachvuln"
]
}
}
}
启动命令npx -y @reneturcios/reachvuln

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@reneturcios/reachvuln0.1.0
ocighcr.io/cloudcorprecords/reachvuln:0.1.0

工具

1

收录的工具列表 · 更新于 1 周前

参数类型必填说明
modulesarray是模块及其导入项:{path, imports}
entry_pointsarray是作为入口点的模块路径
vulnerabilitiesarray是发现项:{id, package, severity, vulnerable_exports}

详细介绍

reachvuln

包含两百条发现项的扫描报告并不是待办清单。其中大多数软件包可能根本不会被你的代码加载;即使被加载,其中的易受攻击导出项也可能不是你导入的那个。reachvuln 会围绕这个问题重新排列报告:给定发现项、模块及其导入项,以及入口点,哪些发现项实际上可以被触达?

可达性基于你提供的导入图计算。若某个导入项的 package 与另一个模块的 path 相同,则它是本地边;其他情况都是外部软件包导入项。可达模块包括入口点,以及沿本地边从入口点到达的所有模块——采用广度优先遍历,并能安全处理循环,因此循环导入链既不会无限循环,也不会隐藏其后的模块。

如果某个可达模块导入了该发现项的软件包,并且该发现项未列出 vulnerable_exports(导入该软件包的任何内容都算),或该导入项的 names 与 vulnerable_exports 至少有一项相同,则该发现项为 reachable。如果某个模块导入了该软件包,但不满足可达条件,则该发现项为 imported_unreachable——该软件包位于导入树中,但没有可达模块以触及易受攻击导出项的方式导入它。如果没有任何模块导入该软件包,则该发现项为 not_imported。对于可达发现项,reached_via 会列出满足条件的可达模块路径(去重并排序);否则该字段为空。

排名采用固定算法,而非启发式计算:严重性权重分别为 critical 40、high 30、medium 20、low 10;对于可达发现项,权重乘以 3;对于已导入但不可达的发现项,乘以 1;对于未导入的发现项,乘以 0。发现项按排名分数降序、严重性权重降序、id 升序排列,结果还会包含这三类发现项的计数。

验证严格,并会指出出错路径:vulnerabilities、modules 或 entry_points 缺失或类型不正确;发现项的 id 缺失、为空或重复,package 缺失或为空,severity 不属于枚举值,或 vulnerable_exports 类型不正确;模块的 path 缺失、为空或重复,imports 缺失,或导入项的 package 或 names 不正确;以及不属于模块路径的入口点。请注意,导入项 names 中的条目可以是空字符串——它们只会与易受攻击导出项不匹配,而易受攻击导出项本身必须非空。未知的额外字段会被忽略;输入无效时不会生成部分结果。计算是纯本地操作:不访问网络、不读取配置,也不读取任何代码仓库。

命令行

npx @reneturcios/reachvuln rank --input args.json
npx @reneturcios/reachvuln --version

args.json 包含完整的参数对象:

{
  "vulnerabilities": [
    {
      "id": "CVE-1",
      "package": "lodash",
      "severity": "high",
      "vulnerable_exports": ["merge"]
    }
  ],
  "modules": [
    {
      "path": "src/app.ts",
      "imports": [{ "package": "lodash", "names": ["merge"] }]
    }
  ],
  "entry_points": ["src/app.ts"]
}

结果以 JSON 格式打印:

{
  "ranked": [
    {
      "id": "CVE-1",
      "package": "lodash",
      "severity": "high",
      "reachability": "reachable",
      "rank_score": 90,
      "reached_via": ["src/app.ts"]
    }
  ],
  "counts": {
    "reachable": 1,
    "imported_unreachable": 0,
    "not_imported": 0
  }
}

退出代码:成功时为 0;发生运行时错误时为 1(包括输入文件无法读取或无效,以及输入无效);使用方式错误时为 2。

MCP 服务

npx -y @reneturcios/reachvuln mcp

MCP 客户端配置:

{
  "mcpServers": {
    "reachvuln": {
      "command": "npx",
      "args": ["-y", "@reneturcios/reachvuln", "mcp"]
    }
  }
}
工具
  • rank_vulns_by_reach — 根据易受攻击的软件包及其导出项能否从入口点访问,对漏洞发现进行排序。

    • vulnerabilities(数组,必填,可为空)— 发现项,每项为 {id, package, severity, vulnerable_exports};id 是非空且唯一的字符串, package 是非空字符串,severity 是 critical、high、medium、low 之一,而 vulnerable_exports 是非空字符串数组,可选(默认为 [])
    • modules(数组,必填,可为空)— 模块, 每项为 {path, imports};path 是非空且唯一的 字符串,imports 是 {package, names} 数组, 其中 package 是非空字符串,names 是必填字符串数组(条目可为空)
    • entry_points(数组,必填,可为空)— 作为入口点的模块路径;每个条目都必须 与某个模块的 path 相同

    返回 {ranked, counts},其中每个排序条目为 {id, package, severity, reachability, rank_score, reached_via},顺序固定;counts 为 {reachable, imported_unreachable, not_imported}。

Docker

docker run -i ghcr.io/cloudcorprecords/reachvuln
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/reachvuln rank --input /w/args.json

开发

npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (pure local, no network)
npm run dev     # run the CLI from source

许可证

MIT — 版权所有 (c) 2026 Rene Turcios

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。