这是对 官方安全公告 的交叉发布。官方公告也包含我们 PGP 密钥的签名版本。
Rust 安全响应工作组收到通知,Cargo 在提取从备用注册源下载的一些格式错误(malformed)的包时,未能阻止此类操作。能够将包上传到备用注册源的攻击者,可以在 Cargo 下载该包时填满文件系统或破坏任意文件。
这些问题已被分配 CVE-2022-36113 和 CVE-2022-36114。对于使用备用注册源的用户,这些漏洞的严重性为“低”。依赖 crates.io 的用户不受影响。
请注意,设计如此,Cargo 由于构建脚本(build scripts)和过程宏(procedural macros),允许在构建时执行代码。本公告中的漏洞允许以更难追踪的方式执行部分可能的破坏。如果您想免受攻击,您的依赖项仍然必须是可信的,因为可以使用构建脚本和过程宏执行相同的攻击。
任意文件损坏 (CVE-2022-36113)
包下载后,Cargo 会将其源代码提取到磁盘上的 ~/.cargo
文件夹中,供其构建的 Rust 项目使用。为了记录提取成功的时间,Cargo 在提取完所有文件后,会向提取出的源代码根目录下的 .cargo-ok
文件写入 "ok"。
发现 Cargo 允许包包含一个 .cargo-ok
符号链接,Cargo 会提取它。然后,当 Cargo 尝试向 .cargo-ok
写入 "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 安全研究的 Ori Hollander 按照 Rust 安全政策 负责任地向我们披露了此问题。
我们还要感谢 Josh Triplett 开发了修复程序,Weihang Lo 开发了测试,以及 Pietro Albini 撰写了此公告。此披露由 Pietro Albini 和 Josh Stone 协调。