enomoto11/vuln-symtrace-ts

GitHub: enomoto11/vuln-symtrace-ts

一款基于 AST 和符号级导入分析的 TypeScript 依赖漏洞分流工具,通过交叉比对企业代码实际使用情况与安全公告,帮助团队从海量告警中识别真正有风险的漏洞。

Stars: 2 | Forks: 0

# vuln-symtrace-ts 一个基于 OSV 的漏洞扫描器,它增加了一个分流步骤:它能告诉你你的代码实际使用了哪些易受攻击的依赖项——精确到单个导出(exports)——并将它们与每个安全公告(advisory)标记的内容进行交叉比对,让你能专注于代表真实风险的警报。 ## 问题所在 `npm audit` 和 Dependabot 会以相同的紧迫程度标记依赖树中的每一个易受攻击的包。在实际操作中,大多数警报来自你的代码从未触及的传递依赖项。团队要么追查每一个警报(浪费时间),要么完全忽略它们(错失真正的风险)。这两种结果都会造成损害。 ## symtrace 的作用 symtrace 会扫描你的依赖树,自行查询 OSV 数据库以获取已知漏洞,然后使用 TypeScript AST 分析 (ts-morph) 将每个易受攻击的包与你的实际源代码进行交叉比对,从而对其进行分类: | 级别 | 含义 | | -------------- | --------------------------------------------------------------- | | `needs-review` | 你的代码导入了的直接依赖项 | | `not-affected` | 从未被导入的直接依赖项 | | `transitive` | 间接依赖项;报告会显示是哪个直接依赖项引入了它 | 这让你能专注于少数代表真实风险的警报,而不是对所有警报一视同仁。 ## 工作原理 1. 检测并解析项目的 lockfile(`pnpm-lock.yaml`、`package-lock.json` 或 `yarn.lock`) 2. 通过 OSV API 查询每一个直接和间接依赖项 3. 对于每个易受攻击的包,使用 ts-morph 解析你的代码使用了它的哪些导出,以及在哪里使用的 4. 将使用的导出与每个安全公告指出的 API 进行交叉比对,对影响进行分类并生成报告 导入检测涵盖了静态导入、动态 `import()`、`require()` 以及重新导出(`export ... from`),包括像 `lodash/get` 这样的子路径导入和像 `@scope/pkg/sub` 这样的作用域子路径——这些都会被解析回它们所属的包。纯类型导入(Type-only imports)会被忽略,因为它们在编译时会被擦除。 ## 用法 ### 安装 无需安装直接运行: ``` npx vuln-symtrace-ts scan -p . ``` 或者全局安装 `symtrace` CLI: ``` npm install -g vuln-symtrace-ts ``` ### 扫描项目 ``` symtrace scan -p ./my-project ``` 选项: - `-p, --path ` — 要扫描的项目目录(默认:`.`) - `-t, --tsconfig ` — tsconfig 路径,相对于 `--path`(默认:`tsconfig.json`) - `-s, --severity ` — 触发非零退出代码的最低严重级别:`low` | `moderate` | `high` | `critical`(默认:`moderate`) - `--json` — 输出 JSON 而不是人类可读的文本 当 `needs-review` 包存在达到或超过严重性阈值的漏洞时,将以代码 `1` 退出,使其可用作 CI 门禁。 ### 抑制警报 要阻止特定漏洞导致 CI 门禁失败——例如你已经审查并接受的漏洞——请在扫描的项目目录中添加一个 `.symtracerc.json` 文件: ``` { "ignore": [ { "id": "GHSA-jf85-cpcp-j695", "reason": "not reachable — only the unaffected API is used", "expires": "2026-12-31" } ] } ``` - `id` — 要抑制的漏洞的 OSV id、GHSA id 或 CVE 别名。 - `reason` — 必填项,以确保每次抑制都有文档记录。 - `expires` — 可选的 ISO 日期(`YYYY-MM-DD`)。过期后,该规则将停止抑制,并且 symtrace 会打印警告,从而强制进行定期重新审查。 被抑制的漏洞仍会列在报告中(并附注其原因);它们只是被排除在退出代码判断之外。 ### 检查单个包 ``` symtrace check -p lodash symtrace check -p lodash -v 4.17.20 ``` 在不进行代码分析的情况下通过 OSV API 查询包。 ## 严重性 漏洞的严重性取自 GitHub Advisory Database 的标签(如果存在),否则根据 CVSS 向量计算。支持 CVSS v3 和 v4 向量;v4 分数是近似值,GitHub Advisory 标签始终优先于它。 ## 公告交叉比对 对于每个 `needs-review` 漏洞,symtrace 会读取安全公告文本中指出的 API 名称,并将它们与你的代码使用的导出进行比较: - **审查优先级 (review priority)** — 你的代码使用了公告指出存在漏洞的导出 - **可能较低风险 (likely low)** — 公告指出了具体的导出,而你的代码没有使用其中任何一个 - _(无提示)_ — 公告未指出具体的 API,因此没有可比较的内容 这些提示指导你首先应该查看哪里;它们不是最终定论。它们永远不会改变退出代码——当满足严重性阈值时,`likely low` 结果仍然会导致 CI 门禁失败。公告匹配是一种保守的文本启发式方法(它读取反引号标注的 API 名称),因此请手动确认结果。 ## 支持的包管理器 pnpm、npm 和 yarn v1 (classic)。尚不支持 Yarn Berry (v2+)。 ## 环境要求 Node.js >= 20。 ## 范围与限制 symtrace 不能替代 `npm audit` 或 Dependabot——它只是增加了一个分流步骤。当前的限制: - 会解析你的代码使用了易受攻击包的哪些导出,并将它们与公告文本进行交叉比对,但公告匹配是一种保守的文本启发式方法,而且许多公告根本没有指出任何 API。提示仅作为指导,而非定论——请手动确认 `review priority` 和 `needs-review` 结果。参数级别的数据流分析已在计划中。 - 间接依赖项会被标记,但不会进行代码使用情况分析,因为你的代码通常不会直接导入它们。报告会显示引入每个间接依赖项的依赖链。 - 尚不支持 Workspaces / monorepos。symtrace 会根据一个 `tsconfig` 分析单个包,因此在包含多个包的 pnpm/npm/yarn workspace 中,直接/间接依赖的分类和导入分析可能不准确。建议改为在每个包目录中分别运行一次 symtrace。 - 通过 `allowJs` 支持纯 JavaScript(非 TypeScript)项目,但在缺少类型信息的情况下,符号解析的准确性会较低。 ## 状态 Beta (0.1.x)。仅支持单仓库扫描。 ## 许可证 MIT
标签:MITM代理, TypeScript, WebSocket, 依赖分析, 安全插件, 漏洞分诊, 自动化攻击, 错误基检测, 静态代码分析