Cargo 安全公告 (CVE-2022-36113, CVE-2022-36114)

2022 年 9 月 14 日 · Rust 安全响应工作组

这是 官方安全公告 的交叉发布。官方公告还包含使用我们 PGP 密钥签名的版本。

Rust 安全响应工作组收到通知,Cargo 无法阻止从备用注册表下载某些格式错误的包。能够将包上传到备用注册表的攻击者可以在 Cargo 下载包时填充文件系统或破坏任意文件。

这些问题已分配 CVE-2022-36113 和 CVE-2022-36114。对于备用注册表用户,这些漏洞的严重程度为“低”。依赖 crates.io 的用户不受影响。

请注意,根据设计,Cargo 允许在构建时执行代码,因为存在构建脚本和过程宏。本公告中的漏洞允许以更难追踪的方式执行部分可能的破坏。如果您想免受攻击,则仍然必须信任您的依赖项,因为可以使用构建脚本和过程宏执行相同的攻击。

任意文件损坏 (CVE-2022-36113)

下载包后,Cargo 会将其源代码提取到磁盘上的 ~/.cargo 文件夹中,使其可供其构建的 Rust 项目使用。为了记录提取是否成功,Cargo 在成功提取所有文件后,会在提取的源代码根目录中的 .cargo-ok 文件中写入“ok”。

发现 Cargo 允许包包含一个 .cargo-ok 符号链接,Cargo 会提取该链接。然后,当 Cargo 尝试将“ok”写入 .cargo-ok 时,它实际上会用 ok 替换符号链接指向的文件的前两个字节。这将允许攻击者使用 Cargo 提取包来破坏机器上的一个文件。

磁盘空间耗尽 (CVE-2022-36114)

发现 Cargo 没有限制从压缩档案中提取的数据量。攻击者可以将一个经过特殊设计的包上传到备用注册表,该包提取的数据量远远超过其大小(也称为“压缩炸弹”),从而耗尽使用 Cargo 下载该包的机器上的磁盘空间。

受影响的版本

所有版本的 Cargo 都存在这两个漏洞。将于 9 月 22 日发布的 Rust 1.64 将包含这两个漏洞的修复程序。

由于这些漏洞只是以更有限的方式实现了恶意构建脚本或过程宏可以完成的操作,因此我们决定不发布回溯安全修复的 Rust 点版本。Rust 1.63.0 的补丁文件可供 wg-security-response 存储库 中的人员构建自己的工具链使用。

缓解措施

我们建议备用注册表用户谨慎选择要下载的包,只在项目中包含受信任的依赖项。请注意,即使修复了这些漏洞,根据设计,Cargo 由于存在构建脚本和过程宏,允许在构建时执行任意代码:恶意依赖项将能够造成损害,无论是否存在这些漏洞。

crates.io 多年前就实施了服务器端检查,以拒绝此类包,并且 crates.io 上没有利用这些漏洞的包。不过,crates.io 用户仍然需要谨慎选择依赖项,因为构建脚本和过程宏的相同问题也适用于此。

致谢

我们要感谢 JFrog 安全研究的 Ori Hollander,他根据 Rust 安全策略 负责任地向我们披露了此事。

我们还要感谢 Josh Triplett 开发了修复程序,Weihang Lo 开发了测试,以及 Pietro Albini 撰写了本公告。披露由 Pietro Albini 和 Josh Stone 协调。