这是 官方安全公告 的交叉发布。官方公告还包含使用我们的 PGP 密钥签名的版本。
Rust 安全响应工作组收到通知,Cargo 在类 Unix 系统上解压缩 crate 存档时没有遵守 umask。如果用户下载的 crate 包含任何本地用户可写的文件,另一个本地用户可以利用此漏洞更改当前用户编译和执行的源代码。
此漏洞已分配 CVE-2023-38497。
概述
在类 Unix 系统中,每个文件都有三组权限:拥有该文件的用户、拥有该文件的组以及所有其他本地用户。大多数系统上配置的“umask”用于在文件创建期间限制这些权限,删除危险的权限。例如,macOS 和大多数 Linux 发行版上的默认 umask 仅允许拥有文件的用户写入该文件,防止拥有该文件的组或其他本地用户执行相同的操作。
当 Cargo 下载依赖项时,其源代码必须在磁盘上解压缩,以便 Rust 编译器在构建过程中读取。为了提高性能,此解压缩仅在第一次使用依赖项时发生,并将预解压缩的文件缓存以供将来调用。
不幸的是,发现 Cargo 在解压缩期间没有遵守 umask,而是按原样传播了存储在 crate 存档中的权限。如果存档包含系统上任何用户可写的文件(并且系统配置没有通过其他安全措施阻止写入),系统上的另一个本地用户可以替换或调整依赖项的源代码,从而在下次编译项目时可能实现代码执行。
受影响的版本
类 Unix 系统(如 macOS 和 Linux)上所有早于 1.71.1 的 Rust 版本都受到影响。请注意,在本地系统上配置的额外系统相关安全措施可能会阻止利用此漏洞。
Windows 和其他非类 Unix 系统上的用户不受影响。
缓解措施
我们建议所有用户更新到 Rust 1.71.1,该版本将在今天晚些时候发布,因为它通过在解压缩 crate 存档时遵守 umask 来修复漏洞。如果您构建自己的工具链,则可以在 此处 获取 1.71.0 源代码包的补丁。
为了防止现有的缓存提取被利用,Rust 1.71.1 或更高版本中包含的 Cargo 二进制文件将在尝试访问由旧版 Cargo 版本生成的缓存时清除这些缓存。
如果您无法更新到 Rust 1.71.1,我们建议您配置系统以防止其他本地用户访问 Cargo 目录,该目录通常位于 ~/.cargo
中。
chmod go= ~/.cargo
致谢
我们要感谢 Addison Crump 按照 Rust 安全策略 向我们负责任地披露了此漏洞。
我们还要感谢帮助我们披露此漏洞的 Rust 项目成员:Weihang Lo 开发了修复程序;Eric Huss 审查了修复程序;Pietro Albini 撰写了此公告;Pietro Albini、Manish Goregaokar 和 Josh Stone 协调了此披露;Josh Triplett、Arlo Siemen、Scott Schafer 和 Jacob Finkelman 在披露过程中提供了建议。