这是官方安全公告的交叉发布。官方公告还包含使用我们的 PGP 密钥签名的版本。
Rust 安全响应工作组收到通知,Cargo 未能阻止提取从备用注册表下载的某些格式错误的软件包。能够将软件包上传到备用注册表的攻击者可以在 Cargo 下载该软件包时填充文件系统或破坏任意文件。
这些问题已被分配 CVE-2022-36113 和 CVE-2022-36114。对于备用注册表的用户,这些漏洞的严重性为“低”。依赖 crates.io 的用户不受影响。
请注意,根据设计,由于构建脚本和过程宏,Cargo 允许在构建时执行代码。本公告中的漏洞允许以更难追踪的方式执行可能造成的损害的子集。如果想防止攻击,您的依赖项仍然必须是可信的,因为可以使用构建脚本和过程宏执行相同的攻击。
任意文件损坏 (CVE-2022-36113)
下载软件包后,Cargo 会将其源代码提取到磁盘上的 ~/.cargo
文件夹中,使其可用于其构建的 Rust 项目。为了记录提取成功的时间,Cargo 会在提取所有文件后,将“ok”写入提取的源代码根目录下的 .cargo-ok
文件中。
发现 Cargo 允许软件包包含一个 .cargo-ok
符号链接,Cargo 将会提取它。然后,当 Cargo 尝试将“ok”写入 .cargo-ok
时,它实际上会将符号链接指向的文件的前两个字节替换为 ok
。这将允许攻击者使用 Cargo 提取软件包时损坏计算机上的一个文件。
磁盘空间耗尽 (CVE-2022-36114)
发现 Cargo 没有限制从压缩存档中提取的数据量。攻击者可以向备用注册表上传一个特制软件包,该软件包提取的数据量远大于其大小(也称为“zip 炸弹”),耗尽使用 Cargo 下载该软件包的计算机上的磁盘空间。
受影响的版本
所有版本的 Cargo 都存在这两个漏洞。将于 9 月 22 日发布的 Rust 1.64 将包含对这两个漏洞的修复。
由于这些漏洞只是实现恶意构建脚本或过程宏可以实现的功能的更有限的方式,因此我们决定不发布回溯安全修复的 Rust 次要版本。 Rust 1.63.0 的补丁文件可在 wg-security-response 存储库中找到,供自行构建工具链的人员使用。
缓解措施
我们建议备用注册表的用户谨慎选择他们下载的软件包,方法是只在他们的项目中包含可信的依赖项。请注意,即使修复了这些漏洞,根据设计,Cargo 仍然允许由于构建脚本和过程宏在构建时执行任意代码:恶意依赖项无论是否存在这些漏洞都能够造成损害。
crates.io 多年前就实施了服务器端检查来拒绝此类软件包,并且 crates.io 上没有任何利用这些漏洞的软件包。不过,crates.io 用户在选择依赖项时仍然需要小心,因为构建脚本和过程宏的相同问题也适用于此处。
致谢
我们要感谢 JFrog Security Research 的 Ori Hollander 根据Rust 安全策略负责任地向我们披露此事。
我们还要感谢 Josh Triplett 开发修复程序、Weihang Lo 开发测试以及 Pietro Albini 撰写此公告。此披露由 Pietro Albini 和 Josh Stone 协调。