快讯2026-10-21 · 智涌AI

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

GitHub 包防火墙封面:终端里 npm install 请求经过 package-firewall.githubapp.com,冷却期和新增 postinstall 的包被拦下

北京时间 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 看实际装上的版本。

📬 订阅《智涌AI周报》

每周一封,精选 AI 大事和实用技巧。