三天一起
StepSecurity 在周六公布了整整一年恶意软件包攻击的统计:共 56 起,前六个月 6 起,二月以来的六个半月里 50 起,三月起大约每三天一起。接着报告点名了它们持续奏效的原因:开发机器与 CI runner 上的机密、未固定版本的 latest、毫无限制的对外连接。这三件事没有一件是软件包的性质。三者描述的都是执行安装的那台机器,而如今安装软件包最多的那台机器上,坐着一个编码代理。
恶意软件包在安装时就引爆。没有需要抵达的脆弱代码路径,没有需要编写的漏洞利用,也没有 可修补的空窗。在三天一起的频率下,它装在哪个软件包里,已经不再是值得追问的问题。
周六,StepSecurity 发表了 一份为期十二个月的开源供应链攻击统计。 五十六起。“在 2025 年 8 月到 2026 年 1 月的六个月里,我们记录到 6 起事件。在 2026 年 2 月 以来的六个半月里,我们记录到 50 起。”三月起,速度维持在每月约九起,也就是“大约每三天 一起”。
StepSecurity 卖的是一套带过滤的注册表,请带着这个前提去读这份报告。统计本身仍然站得住脚。 这是目前公开资料中对恶意软件包最审慎的一份清点,而它背后的定义是刻意收窄的。
这个数字在数什么
报告把漏洞排除在外。不计 CVE,也不计事后才发现真的有问题的 unsafe 块。它数的是有人蓄意
下毒的软件包。
这正是这个数字可用的原因。漏洞需要第二个事件:得有人找到你的实例、抵达受影响的代码路径, 并从中取走些什么。你可以跑一整年的脆弱版本而什么都没发生。恶意软件包把这些全部跳过。用 报告的话说,它“在开发机器或 CI runner 安装它的那一刻就开始执行”。安装本身就是入侵成功。 你永远不会有披露到修补之间的空窗,因为没有人披露过什么,也没有人发过补丁。你拿到的只有 一个版本号,然后是一场厘清谁拉取过它的忙乱。
2026 年 3 月有 13 起。4 月 9 起、5 月 9 起、6 月 10 起、7 月 6 起。在三月的五天之内,一个
被追踪为 Team PCP 的行动污染了 Trivy GitHub Action 全部 77 个标签中的 76 个,以及少数其他
构建期组件,
从 2,186 个组织手中取走 78,330 份机密,
其中 92 家是上市公司。每周下载量超过一亿的 axios,发布了两个带有跨平台远程访问木马的恶意
版本。这一年里出现了六只蠕虫:Shai-Hulud 两次、CanisterWorm、Mini Shai-Hulud、Miasma,以及
本月的 ChainDrop。npm、PyPI、RubyGems、Composer、crates.io、GitHub Actions。“每一个主要的
软件包生态与 CI/CD 平台都中过招。”
这份清单里有两项在这里格外重要。报告指出,“一个由 AI 驱动的机器人”hackerbot-claw 盯上了
Microsoft、Datadog 与 CNCF 的 GitHub Actions,而且“Miasma 蠕虫专门锁定 AI 编码代理”。
三个条件,没有一个是软件包
接着报告做了件有用的事。在一个追问攻击为何持续奏效的标题底下,它给出三个答案:“CI/CD 流水线与开发机器上的机密、未固定版本的 latest、毫无限制的对外连接”。
这份清单里没有一项在描述软件包。没有混淆、没有拼写相似度、也没有安装钩子的花招。三者描述 的都是执行安装的那台机器:它握着什么、它怎么挑版本、它获准连到哪里。只要改动其中任何一项, 这五十六起里的大多数就不再划算。
未固定的 latest
解析链上的某一环说了“要最新的”。一段浮动范围、一个间接依赖、一份重建的 lockfile、一个 代你加上库的代理。攻击者只需要解析器偏好一个几分钟前才发布的版本。
机器上的机密
~/.ssh、~/.aws、~/.kube、~/.npmrc、环境变量里的 GH_TOKEN、
~/.docker/config.json 里的注册表登录信息。这些没有一样属于这次构建,而构建刚刚启动的
东西全都读得到。
开放的对外连接
偷到的东西得送出去,第二阶段的可执行文件得送进来。两者都只是从一台允许连往任何地方的 机器发出的、再普通不过的对外连接。
现在装软件包装得最多的,是谁的机器
大家一直倚靠的防线是注意力。你读 diff。你注意到一个缓存库拉进了一个依赖,名字跟某个日期 格式化库只差一个字母。
有两件事已经超车了。首先是频率:没有人每三天就把间接依赖重看一遍。其次是谁在装。编码代理 因为你要它做点东西而加进一个库、解析出依赖树、跑完安装,然后回报测试通过。你读的是它产生 的 diff,那的确是值得你花时间的部分。但 tarball 从来不会出现在 diff 里。StepSecurity 的清单 上,已经有一只蠕虫正是冲着这种工作方式来的。
代理留着。把控制点搬到它的速度不再重要的地方。
三个条件,三道控制,全都在 Mac 这一侧
Bromure Agentic Coding 让代理跑在 Apple Virtualization 框架上的一台用完即弃的 Ubuntu 虚拟机 里,只挂载你挑选的文件夹,并以宿主端的代理服务器作为唯一的对外出口。这样的摆放,把 StepSecurity 的三个条件各自挡在一道构建碰不到的控制之前。
未固定的 latest 变成一只时钟。 每一次软件包拉取都先经过宿主端代理:npm、PyPI、Cargo、
RubyGems、Maven、NuGet、Go 模块、Packagist。发布时间闸门默认开启,门槛是两天。浮动引用会
解析到早于截止时间的最新版本,于是 latest 照常工作,却不再意味着“在你读这段字的时候才
发布的版本”。指向太新版本的固定引用会返回一个带着 Bromure 错误信息的 451。在此之上,你还
可以按自选的严重度门槛启用 OSV 查询、让软件包改走 socket.dev 的信誉数据库或 Delpi 的过滤式
注册表,并在传输过程中把 preinstall、install、postinstall 与 prepare 从 npm tarball
里剥掉。Bromure 会改写 tarball,并同步更新注册表元数据的哈希值,让 npm 自己的校验照样通过。
虚拟机内的 .npmrc 与 pip.conf 可以把上述任何一项设置收得更紧,但没有一项放得松。
机器上的机密都是替身。 真正的凭据从不进入虚拟机。代理服务器在线路上把占位符换成真正的
令牌;客户机里的 kubeconfig 是合成的,用的是一次性的客户端证书;AWS 拿到的是一个
credential_process 辅助程序,递给 SDK 一组四十字符的假值,同时由宿主用真正的密钥重新签出
SigV4,因此任何绕过代理的东西,只会从 Amazon 收到一个 InvalidSignatureException。读取
~/.aws/credentials 的安装期代码会找到一个文件、读完它,然后外发一份诱饵。每一份凭据还带有
一项在宿主代理上强制执行的写入策略(关闭、拦截破坏性操作,或只读),外加使用时需要批准,
能把任何一次使用变成一个同意对话框,授权范围可选五分钟、一小时,或本次会话的其余时间。
开放的对外连接,得听你写的规则。 在护栏底下,对外连接表是一份按配置文件划分的防火墙:
一条规则一行,每行有动作、协议(tcp、udp、web 或 any)、主机或 CIDR、端口,web
还可指定 HTTP 方法列表。规则自上而下匹配,第一条命中者胜出,而未命中的流量是一个你设为
允许或拒绝的开关。同一套规则由两层一起执行:虚拟交换机按目的 IP,以及按它从客户机自己的
DNS 应答中学到的主机名;代理服务器则按 TLS SNI。透明拦截默认开启,所以就算构建脚本把
HTTPS_PROXY 清掉,哪些连接出得去也完全不受影响。
上周的 crates.io 攻击,正好演示了这条规则拦住了什么。在 StepSecurity 的分析里,投放程序的 构建脚本 解出一个 base64 编码的网址,从一个裸 IP 的 9089 端口拉取对应平台的可执行文件, 并关闭证书校验,接着把子进程分离,好让 Cargo 不会等它。只要未命中的流量设为拒绝,这次拉取 就永远完成不了,而构建脚本的退出码也不再是个值得追问的问题。
八十六分钟
回到同一起攻击,就能看出时钟为什么胜过判断力。arrayref、internment 与 append-only-vec
被下毒的版本,在 crates.io 撤下它们之前分别活了 86、90 与 107 分钟。为了把解析器导向这些
版本,攻击者把干净的版本从 0.3.9 一路 yank 到 0.3.5,整串动作只花了十六秒,只留下一个
没人撤回的发行版。StepSecurity 对这起事件最锐利的一句话是:“攻击者把注册表自身的安全机制
变成了投递通道。”而 arrayref 本身并没有带任何恶意代码。载荷是搭着构建期对 proc-macro2
的拼写仿冒进来的。
两天的发布时间闸门完全不需要认出上面任何一件事。一个八十六分钟大的版本比门槛还新,而等它 够老到可以被安装时,crates.io 早就把它删了。攻击者打造的那扇窗,比闸门原本就会忽略的那扇 还要短。
第五十七起
报告以一句值得记住的话作结:“12 个月 56 起攻击。第 57 起攻击已经在制作中了。”
你不会知道它装在哪个软件包里,你也不会去读它。你的代理同样不会。五个月维持三天一起的节奏, 早已远远超出任何人能够审查的频率,把它说成粗心大意,谁都得不到好处。但它落在什么上面,是 你可以决定的:它需要的那个版本,你的解析器会不会收;它来找的那些机密,是不是真的;它想连 的那个地址,你的机器会不会替它送出去。三个设置,全都在边界的你这一侧。
资料来源:StepSecurity,“The State of Open Source Supply Chain Attacks”(2026 年 8 月 22 日) · StepSecurity,“Rust Supply-Chain Attack: arrayref, internment, and append-only-vec Poisoned by the proc-macro1 Build-Time Dropper”(2026 年 8 月 20 日) · StepSecurity,“Team PCP Stole 78,330 Secrets From 2,186 Organizations”(2026 年 8 月 13 日)