GitHub 包防火墙公测:编程 Agent 装 npm 包前先过安检

北京时间 10 月 21 日凌晨,GitHub 宣布「包防火墙」(package firewall)进入公测。它放在 Actions 运行器、编程 Agent、开发者电脑和 npm 官方源之间,下载前先查一遍:是不是已知恶意包、是不是刚发布、是不是突然多了安装脚本,不合规就直接拦下。目前只有 GitHub 企业版云服务(GHEC)客户能用,只支持 npm,预览期不收费。个人开发者暂时用不上,不过 npm 自带两个开关能挡掉一部分风险,我们在本机试过了。
攻击发生在 npm install 那一刻
GitHub 在更新日志里说得很直接:越来越多的恶意软件利用的是安装环节,靠 preinstall/postinstall 这类脚本在 CI 主机或开发者电脑上收集凭证,包里的代码都不用被调用。所以拦截点放在下载前,放在运行时就晚了。
按官方文档,管理员在企业设置的 Policies → Package firewall 里配置这 5 项,规则对所有经过防火墙的请求生效:
| 控制项 | 做什么 | 默认 |
|---|---|---|
| 拦已知恶意包 | 查 GitHub Advisory Database,有恶意软件公告就拦 | 开 |
| 拦漏洞版本 | 按严重度拦,可选 仅严重 / 高及以上 / 中及以上 / 全部 | 仅严重 |
| 拦证明降级 | 旧版本有 SLSA 证明、新版本没了,视为发布流程可能被攻破 | 开 |
| 拦新增安装脚本 | 包最近新加了 preinstall/postinstall 等脚本 | 开 |
| 最小包龄 | 新版本发布不满 N 天不放行,可设 1–365,0 为关闭 | 1 天 |
为什么点名编程 Agent
官方文档的副标题写的是保护「开发者电脑、AI Agent 和 CI 运行器」上的依赖安装。原因不难理解:让 Claude Code、Codex 这类 Agent 修 bug,它常常会自己跑 npm install 装一个它觉得合适的包,你不一定每次都盯着看。Agent 所在的环境往往又有 git 凭证、云密钥。人装包至少会扫一眼包名,Agent 不会犹豫。
装一个刚发布 3 小时的版本,和装一个已经有人用了 3 天的版本,风险差很多。冷却期就是让别人先替你踩雷。
怎么接:改一行 registry
文档给的 npm 配置是在用户级 .npmrc 里把源换成企业专属地址,再带上 token(ENTERPRISE 换成你的企业 slug):
registry=https://package-firewall.githubapp.com/npm/enterprises/ENTERPRISE
//package-firewall.githubapp.com/npm/enterprises/ENTERPRISE/:_authToken=${GITHUB_TOKEN}
token 只需要「公开仓库只读」权限,但必须属于企业成员(人或机器人账号都行),文档要求放在 CI secret 里,别提交进仓库。用 JFrog Artifactory 的团队可以把防火墙配成一个远程仓库,这部分官方标注为实验性。包被误拦时,npm 输出会给出申请例外的网址,由企业管理员或安全经理审批,审批时可以放行单个版本,也可以用 * 放行所有版本。
限制也要说清:只支持 npm;只有 GHEC(含数据驻留版)能用;预览期免费,GitHub 说正式版会像 Actions 一样按用量计费,价格还没公布。没改 registry 直连 npm 官方源的机器,防火墙管不到。
没有企业版:npm 自带的两个开关
我们在本机(npm 11.21.0、Node.js 20.19.2,10 月 21 日实测)试了 npm 文档里的两个设置:
| GitHub 包防火墙 | npm 11 自带 | |
|---|---|---|
| 谁能用 | GHEC 企业 | 所有人 |
| 新版本冷却 | 策略统一设,默认 1 天 | min-release-age=天数 |
| 安装脚本 | 拦「新增」的脚本 | 依赖的安装脚本默认不跑,allowScripts 白名单放行 |
| 恶意包 / 漏洞库 | 下载前查 Advisory Database | 没有,只能装完跑 npm audit |
| 例外审批 | 有流程和记录 | 自己改配置 |
安装脚本:npm 11.21 的文档写明依赖的安装脚本默认被拦。我们装 @anthropic-ai/claude-code 时,npm 只提示「1 个包有安装脚本未被 allowScripts 覆盖」,它的 postinstall 确实没执行,要用 npm install-scripts approve 才放行。
冷却有个坑。当时 Claude Code 最新版 2.1.305 发布还不到 6 小时,我们以为 --min-release-age=1 会装上前一天的 2.1.304,结果装上的是 6 月 30 日的 2.1.197。查 npm 源才知道,2.1.198 起这个包要求 Node 22 以上,npm 在 latest 标签被冷却挡掉以后,会退回到满足当前 Node 版本的最高版本,退了快 4 个月,全程没报错。改成 @^2.1.300 锁住范围后,装上的才是 2.1.304。所以开了冷却以后要看一眼实际装上的版本号。
谁该关心
在用 GHEC、又让编程 Agent 或 CI 自动装依赖的团队,可以直接申请试用,默认策略已经够用,先只调最小包龄。个人开发者和小团队现在就能在 ~/.npmrc 里加 min-release-age,再确认 npm 已升到带 allowScripts 的版本。pnpm 用户的对应设置叫 minimumReleaseAge,本文未实测。
最后
给 Agent 开了「自己装包」权限的,今天就在 ~/.npmrc 里加一行 min-release-age=1,然后跑一次 npm ls 看实际装上的版本。
- GitHub Changelog:GitHub package firewall in public preview(2026-10-20)
- GitHub Docs:Protecting endpoints with GitHub package firewall
- npm Docs:config(min-release-age、before、allow-scripts)
- npm Docs:npm install-scripts(依赖安装脚本默认被拦)
- npm registry:@anthropic-ai/claude-code 元数据(各版本发布时间与 engines 字段,10-21 查)
- pnpm Docs:Settings(minimumReleaseAge)
- 本文实测:npm 11.21.0 + Node.js 20.19.2,Debian 13,2026-10-21