Skip to content

[自动合并 P2-5] 依赖供应链 policy 落地 #90

Description

@randypanding

目标

把 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 等,按栈定)

执行步骤

  1. 许可证白名单:声明允许清单(MIT/Apache-2.0/BSD/ISC 等),dependency-review action 的 allow-licenses 拒绝式执行;新增依赖许可证不在清单 → 红。
  2. 包龄与流行度:新增依赖查询 registry(PyPI/npm 等),发布 <90 天、或周下载量低于阈值、或维护者数为 1 且无组织背书 → 红或要求 ADR(幻觉包抢注的直接防线)。
  3. postinstall/构建期脚本:新增依赖含 install 脚本(package.json postinstallsetup.py 等)→ 需 ADR。
  4. lockfile 一致性:CI 全部改 frozen/immutable 安装模式,lockfile 与 manifest 不一致(手改 lockfile、忘更新 lockfile)→ 安装即失败即红。
  5. 阈值全部进 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 为准

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    auto-merge自动合并计划(#81)工作卡supply-chain供应链安全相关

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions