自动化与脚本
审计项目依赖供应链风险时,用脚本采集+人工判断生成可引用报告
当需要审计 npm/PyPI/Go 项目的依赖供应链风险(版本匹配的安全公告、废弃上游、发布者集中度、安装脚本执行)时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
审计项目依赖供应链风险时,用脚本采集+人通用
解决思路
- 确认目标目录存在清单文件:package.json、pyproject.toml、requirements*.txt 或 go.mod;若都不存在则说明并停止,不要手工审计该采集器不解析的生态。锁文件用于读取精确版本和传递依赖扫描:package-lock.json/npm-shrinkwrap.json、uv.lock、go 1.17+ 的 go.mod;yarn.lock、pnpm-lock.yaml、poetry.lock 不被读取,存在时报告需说明,版本回退到 pin 或最新发布版。
- 检查 gh auth status;未认证的 GitHub 每小时仅允许 60 次请求(认证为 5000 次),而采集器每个依赖会发起多次请求,未认证时仓库类判据会返回 unassessable,需明确说明而非静默修复。
- 先采集再渲染,输出放到被审计仓库之外(除非另有要求):运行 uv run {baseDir}/scripts/collect.py <project-dir> --json <out-dir>/findings.json,再运行 uv run {baseDir}/scripts/render.py <out-dir>/findings.json --out <out-dir>/report.md。约 50 个依赖需几分钟;若 collect.py 非零退出,说明它拒绝报告,需原样转述其消息,不要重试或绕过。
- 阅读 report.md 和 findings.json:报告是交付物,JSON 保存每个判据背后的数据以便引用。
- 补充采集器无法提供的内容,并与已测量内容明确区分:为读者写简短叙述(先处理什么及原因);为公告类发现给出升级路径(检查修复是补丁版还是大版本);为废弃或归档依赖给出替代候选(命名前先在注册表验证其存在,并标注为判断而非测量);对被标记的安装脚本,判断本项目构建是否可用 npm ci --ignore-scripts。
- 撰写补充文字时采用安全报告风格,报告附录与最终回复同样适用(回复会被原样粘贴进工单和报告):陈述发现、背后数据与行动。
- 使用无人称陈述句:不用第一/第二人称(如“I ran the collector”“you should upgrade”),不用缩写和感叹号。
- 使用主动语态,以主题为动作主体:如“upgrading to 1.19.0 clears all 25 advisories”,而非“it is recommended that axios be upgraded”。
- 保持客观:不用强化词或主观措辞(如“very”“significant”“fortunately”),不猜测项目为何做此选择。
- 时态:审计所做用过去时,依赖状态用现在时,行动或不行动的后果用将来时。
- 保持建设性:建议需指明行动及其代价,绝不指责。
- 若会话中有 report-writing:writing-style 技能则遵循它,它是该风格的完整版本。
- 渲染报告只含事实;以下解读规则是给你的指令而非给读者的内容,不要作为注意事项或框架复制进交付物。
- 解读报告时:unassessable 不等于风险——PyPI 不发布维护者 ACL、Go 无注册表,这些行说明的是无法得知的内容而非有问题。
- 覆盖表限定所有结论的边界:“无公告”意为“在所评估范围内没有”,重复干净结论前先检查已评估数量。
- 逐字引用数字:不要重新推导、四舍五入或修饰报告中的数字,每个数字都可从产物复现。
- 发现中未出现不等于背书:无发现的依赖仅针对这些判据被测量过。
- 拒绝以下合理化:“gh 能比采集器更快给出维护者数量”——测量方式错误,仓库贡献者与注册表发布权是不同群体;“无发现所以依赖安全”——看覆盖表,PyPI 和 Go 上有一半判据结构性不可评估;“unassessable 行会让读者困惑,删掉”——它们是报告中所有结论的边界,删掉会把部分覆盖变成健康证明,这正是本技能重建要防止的失败;“版本大概够接近”——在最新发布版检查的范围与锁文件解析的版本是不同结论,报告会标注是哪种,保留该标注。
适用边界 · 注意事项
- 许可证合规审计。
- 扫描目标自身源码中的漏洞或密钥——本技能从不读取依赖源码,只读注册表、公告和仓库元数据。
- 判断项目能否安装或构建——审计仅基于依赖清单和锁文件,从不安装、构建或执行任何东西;安装失败和导入期错误不在范围内。
- npm、PyPI、Go 之外的生态——应说明该生态不受支持,而非临时拼凑审计。