目标
把 dep-review 从"跑了"升级为有具体 policy:许可证白名单(拒绝式)、新依赖最小存在期 + 下载量/维护者阈值、postinstall/构建期脚本需 ADR、lockfile 与 manifest 一致性(frozen/immutable 模式重现)。
背景(源自 #81 §5)
agent 加依赖的成本现在没有门禁,而 LLM 幻觉包名是真实攻击面:agent 幻觉出一个不存在的包名,攻击者抢注(typosquat/slopsquat),下次安装即中招。公开仓库,依赖即攻击面(risk_posture: supply_chain)。
涉及文件
CI-Workflows/.github/workflows/dep-review.yml(现有,扩充)
governance/policy/(新增依赖 policy:许可证白名单、包龄阈值 ≥90 天、下载量/维护者阈值、postinstall 清单)
- 各业务仓 lockfile 安装命令(改 frozen/immutable 模式:
pip install --require-hashes / npm ci / go mod verify 等,按栈定)
执行步骤
- 许可证白名单:声明允许清单(MIT/Apache-2.0/BSD/ISC 等),dependency-review action 的
allow-licenses 拒绝式执行;新增依赖许可证不在清单 → 红。
- 包龄与流行度:新增依赖查询 registry(PyPI/npm 等),发布 <90 天、或周下载量低于阈值、或维护者数为 1 且无组织背书 → 红或要求 ADR(幻觉包抢注的直接防线)。
- postinstall/构建期脚本:新增依赖含 install 脚本(package.json
postinstall、setup.py 等)→ 需 ADR。
- lockfile 一致性:CI 全部改 frozen/immutable 安装模式,lockfile 与 manifest 不一致(手改 lockfile、忘更新 lockfile)→ 安装即失败即红。
- 阈值全部进 policy 文件,可被对账。
验收标准
- 四类违规 fixture PR 各红一次;正常成熟依赖 PR 绿。
- 全组织 CI 安装命令为 frozen/immutable 模式。
- policy 落盘且 gate 可解析校验。
测试方法(预先指定)
T1 许可证(负向):fixture PR 添加一个 GPL-3.0 许可证依赖(选一个真实存在的小型 GPL 包)→ 断言红,错误信息指明许可证。
T2 包龄/幻觉包(核心,负向):fixture PR 添加一个发布不足 90 天的真实新包(执行时在 registry 按发布时间筛选一个)→ 断言红。另断言:添加一个不存在的包名时,报错信息明确为"包不存在"而非其他误导性错误(幻觉包的典型形态)。
T3 postinstall(负向):fixture PR 添加含 postinstall 脚本的依赖且无 ADR → 断言红。
T4 lockfile 篡改(负向):fixture PR 手工编辑 lockfile(改一个版本号或 hash 使其与 manifest 不一致)→ 断言 CI 安装步骤失败即红。
T5 正常路径(正向):fixture PR 添加一个成熟(发布 >1 年、高下载、白名单许可证、无 install 脚本)的依赖,lockfile 由工具正常生成 → 断言绿。
T6 阈值生效证明(单元级):临时把包龄阈值改为 10000 天,重跑 T5 的检测逻辑 → 断言同一依赖变为红——证明判定消费 policy 阈值而非硬编码。
依赖
- P1-3(aggregator 模式)
- 与各仓栈相关的 frozen 安装改造可拆为各仓子任务,但验收以本卡 T4 为准
目标
把 dep-review 从"跑了"升级为有具体 policy:许可证白名单(拒绝式)、新依赖最小存在期 + 下载量/维护者阈值、postinstall/构建期脚本需 ADR、lockfile 与 manifest 一致性(frozen/immutable 模式重现)。
背景(源自 #81 §5)
agent 加依赖的成本现在没有门禁,而 LLM 幻觉包名是真实攻击面:agent 幻觉出一个不存在的包名,攻击者抢注(typosquat/slopsquat),下次安装即中招。公开仓库,依赖即攻击面(risk_posture: supply_chain)。
涉及文件
CI-Workflows/.github/workflows/dep-review.yml(现有,扩充)governance/policy/(新增依赖 policy:许可证白名单、包龄阈值 ≥90 天、下载量/维护者阈值、postinstall 清单)pip install --require-hashes/npm ci/go mod verify等,按栈定)执行步骤
allow-licenses拒绝式执行;新增依赖许可证不在清单 → 红。postinstall、setup.py等)→ 需 ADR。验收标准
测试方法(预先指定)
T1 许可证(负向):fixture PR 添加一个 GPL-3.0 许可证依赖(选一个真实存在的小型 GPL 包)→ 断言红,错误信息指明许可证。
T2 包龄/幻觉包(核心,负向):fixture PR 添加一个发布不足 90 天的真实新包(执行时在 registry 按发布时间筛选一个)→ 断言红。另断言:添加一个不存在的包名时,报错信息明确为"包不存在"而非其他误导性错误(幻觉包的典型形态)。
T3 postinstall(负向):fixture PR 添加含
postinstall脚本的依赖且无 ADR → 断言红。T4 lockfile 篡改(负向):fixture PR 手工编辑 lockfile(改一个版本号或 hash 使其与 manifest 不一致)→ 断言 CI 安装步骤失败即红。
T5 正常路径(正向):fixture PR 添加一个成熟(发布 >1 年、高下载、白名单许可证、无 install 脚本)的依赖,lockfile 由工具正常生成 → 断言绿。
T6 阈值生效证明(单元级):临时把包龄阈值改为 10000 天,重跑 T5 的检测逻辑 → 断言同一依赖变为红——证明判定消费 policy 阈值而非硬编码。
依赖