这是对官方安全公告的交叉发布。官方公告也包含我们 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 源代码 tar 包的补丁程序可在此处获取。
为了防止现有的缓存解压文件被利用,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 在披露过程中提供了建议。