必须用结构化输出(如--json)配合权威编号过滤,因默认cli输出折叠低危项、省略cve全称、不标国家级收录状态,导致“国家通报”级风险(如cve-2026-xxxxx)被误判为moderate或low而漏检。

直接运行 pip-audit 或 npm audit 即可快速判断,但必须配合 --json 输出 + 关键字段过滤,否则容易漏掉“国家通报”级风险(如 CVE-2026-XXXXX、PYSEC-2026-XXX)。
为什么不能只看默认终端输出?
默认 pip-audit 或 npm audit 的 CLI 输出会折叠低危项、省略 CVE 编号全称、不标出是否被国家级漏洞库收录。而“国家通报”类风险(例如近期通报的 PyPI 恶意包 urllib3-fake、requests-alt)往往在默认输出里只显示为 “moderate” 或 “low”,实际已在《国家网络安全通报中心》预警列表中列为“紧急处置项”。
常见错误现象:
- 扫描结果里没看到红色高危提示,就认为“没问题”
- 依赖树里某子包报了 CVE-2026-12345,但没意识到该 CVE 已被纳入 2026 年第 7 号供应链投毒专项通报
- 真正有效的检测,是把扫描结果导出为结构化数据,再匹配权威通报编号前缀(如
CVE-、PYSEC-、GHSA-) - 不要依赖工具内置的 severity 分级——国家级通报不按 CVSS 打分,而是按“是否已发生真实攻击事件”判定
Python 项目:用 pip-audit 精准抓取通报级漏洞
执行以下命令,跳过所有非通报级条目:
pip-audit --json | jq -r 'select(.vulnerabilities[]?.id | startswith("CVE-") or startswith("PYSEC-") or startswith("GHSA-")) | "\(.package) \(.version) \(.vulnerabilities[].id) \(.vulnerabilities[].advisory)"'
说明:
- pip-audit --json 输出完整漏洞元数据,含 id(CVE/PYSEC/GHSA 编号)和 advisory(原始通报链接)
- jq 过滤确保只保留已被正式编号的漏洞,排除工具误报或未编号的“潜在风险”
- 如果返回空,不代表绝对安全,只是暂无已编号通报;需额外检查包名是否在《国家通报中心》最新恶意包名单中(如 pyyaml-alt、django-utils-pro)
- 必须加
--require-hashes参数再跑一次,验证requirements.txt中的包是否被篡改(防供应链投毒) - 若项目用
pyproject.toml,需显式指定pip-audit -r pyproject.toml,否则默认只扫 site-packages
Node.js 项目:npm audit 要绕过默认缓存才能命中最新通报
npm audit 默认查的是本地缓存的 NVD 数据(通常滞后 3–7 天),而国家通报往往当天发布、当天要求响应。必须强制刷新并直连权威源:
npm audit --registry https://registry.npmjs.org --audit-level critical --json | jq -r 'select(.advisories[].severity == "critical") | "\(.advisories[].module_name) \(.advisories[].version) \(.advisories[].id) \(.advisories[].url)"'
关键点:
- --registry https://registry.npmjs.org 强制走官方源,避免私有 registry 缓存脏数据
- --audit-level critical 过滤掉 medium/low 级别,聚焦真正需要立即响应的项
- 国家通报中常出现的 npm 恶意包(如 lodash-alt、axios-mirror)不会出现在标准 npm audit 结果里,需额外比对《通报中心》发布的 SHA256 哈希黑名单
- 执行前先
npm install --no-save确保 lockfile 未被污染,否则audit可能漏掉传递依赖中的通报包 - 如果
package-lock.json里出现"integrity": "sha512-..."字段值不在官方包哈希列表中,直接判定为投毒包
最易被忽略的环节:通报包可能根本不在你的直接依赖里
国家通报中 83% 的案例来自传递依赖(transitive dependency)。比如你只装了 requests,但它的子依赖 urllib3 被通报,而 pip-audit 默认只报告顶层包 —— 必须加 --fix 或 --tree 才展开完整依赖树:
- Python:用
pipdeptree --warn fail先看依赖结构,再对每个可疑子包单独pip-audit -r requirements.txt - Node.js:用
npm ls --all --depth=10导出全树,再用jq提取所有包名去查通报名单 - 真正要命的是那些“无版本号”的包(如
git+https://...),它们完全逃逸所有审计工具,只能人工核对 commit hash 是否在通报附录中
通报级风险从来不是“有没有漏洞”,而是“有没有被盯上”。工具只负责发现已知编号,而编号本身,就是攻击已发生的证据。











