安全公司 Trail of Bits 的 Keegan Ryan 搭了一个被篡改的假包服务器,把 25 款流行包管理器全部指向它。结果只有两款——Go 和 vcpkg——在没有锁文件的情况下也校验了每一个下载的包。其余 23 款,给什么就装什么。
![]()
锁文件本该是那张安全网,但测试显示它大多没被接上。Ryan 把每个工具的流量都引到一个能改写下载内容的代理后面,用默认设置安装快速上手项目,分别在有无锁文件的情况下各跑一遍。注入的代码被执行,就算攻击成功。威胁模型假设任何面向 Web 的服务器——比如注册表或镜像站——都可能被攻破,但后端密钥(例如私有签名密钥)不会。
锁文件会钉死每个依赖的确切版本,理想情况下还记录一个哈希:下载内容必须匹配的指纹。25 款工具里,默认会校验这些哈希的不到一半。
按默认行为划分:9 款在存在锁文件时会校验,包括 npm、pnpm、Cargo、uv 和 Yarn;5 款能校验,但需要额外步骤;最后 9 款根本不校验锁文件哈希,或者这项检查对它们不适用。
完全不检查的工具是明摆着的失败。更隐蔽的是那些跑了检查、然后照样安装的:
- Pub(Dart 和 Flutter)检测到哈希不匹配,仍然安装,并把锁文件更新成匹配的版本——除非你传 --enforce-lockfile。部分 Flutter 命令也会跑 pub get,不加 --no-pub 就可能覆盖锁文件。
- pnpm 在版本 11.4(2026 年 5 月)之前,遇到不匹配会直接覆盖锁文件,被篡改的包就这样成了新的“真相”。
- Composer(PHP)锁定的是一个 Git 提交,下载的却是一个从未与该提交比对过的 ZIP 包。
- CocoaPods 对包规格做了哈希,取源码时却按 Git 标签拉取,被攻破的主机可以返回不同内容。
- cpanminus(Perl)默认仍通过明文 HTTP 连接仓库。
这些都不是隐藏行为,全都有文档记录。锁文件是为可复现安装而造的,Ryan 指出,用供应链的视角去读它,“是一种较新的解读,可能与它的原始设计相冲突”。严格钉版本也有代价:每次更新,包括安全修复,都要改动锁文件。
Go 展示了另一条路。它把每个哈希对照一个签名的校验和数据库检查,这个数据库的作用类似透明日志,让定向篡改难得多,代价是信任集中到一把私有密钥上。它是唯一一款默认校验每次下载并检查签名的工具。Ryan 的说法是:“包签名现在的处境,和十年前的 HTTPS 差不多。”
可以立刻做的几件事:
- 提交你的锁文件,至少对应用项目如此。库的惯例因生态而异。
- 在 CI 里用严格模式安装:npm ci、pnpm install --frozen-lockfile、uv sync --locked、pip install --require-hashes -r requirements.txt(哈希由 pip-compile --generate-hashes 生成),或 dart pub get --enforce-lockfile。
- 如果你的工具需要额外步骤,就去做:Conda 用 conda-lock 库,Gradle 用 verification-metadata.xml 文件,NuGet 用 RestorePackagesWithLockFile 属性。
- 如果你的工具落在最后一组,别把它的锁文件当安全控制。Maven 可以用第三方插件 pgpverify-maven-plugin 对照受信密钥检查签名。再退一步,Conan 开发者给出的兜底建议普遍适用:完整性至关重要时,自己跑一个仓库服务器。
然后测一下:故意改掉锁文件里的一个哈希,确认 CI 会失败。
需要说明的是,每款工具只测了一个包、一个版本、一个平台 Ubuntu,部分配置(比如 Ubuntu 上的 PowerShell 和 CocoaPods)并不反映典型用法。这项研究说明的是合理的默认设置可能让你暴露在外,而不是每个环境都如此。
校验发生在检测之前。多数供应链工具追查的是已知有问题的包,这项研究关心的是更前一步:确保你拿到的包,就是你要求的那个包。25 款工具里,大多数默认关掉了这项检查,或者压根没有。它存在的地方,打开它大概是你所能找到的最便宜的安全收益。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.