Cargo 安全公告 (CVE-2023-38497)

2023 年 8 月 3 日 · Rust 安全响应工作组

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

Rust 安全响应工作组收到通知,Cargo 在类 UNIX 系统上提取 crate 存档时,没有遵循 umask。 如果用户下载了一个包含任何本地用户都可写入的文件的 crate,则另一个本地用户可以利用此漏洞来更改当前用户编译和执行的源代码。

此漏洞已被分配 CVE-2023-38497。

概述

在类 UNIX 系统中,每个文件都有三组权限:文件所有者的权限、文件所属组的权限以及所有其他本地用户的权限。 大多数系统都会配置 “umask” 来限制文件创建期间的这些权限,从而删除危险的权限。 例如,macOS 和大多数 Linux 发行版上的默认 umask 仅允许文件所有者写入文件,从而防止文件所属组或其他本地用户执行相同的操作。

当 Cargo 下载依赖项时,必须将其源代码提取到磁盘上,以便 Rust 编译器读取以作为构建的一部分。 为了提高性能,此提取仅在第一次使用依赖项时发生,并将预提取的文件缓存以供将来调用。

不幸的是,人们发现 Cargo 在提取期间没有遵循 umask,而是按原样传播存储在 crate 存档中的权限。 如果存档包含系统上任何用户都可写入的文件(并且系统配置没有通过其他安全措施阻止写入),则系统上的另一个本地用户可以替换或调整依赖项的源代码,从而在下次编译项目时可能实现代码执行。

受影响的版本

所有 1.71.1 之前的 Rust 版本在类 UNIX 系统(如 macOS 和 Linux)上均受影响。 请注意,本地系统上配置的附加的系统相关安全措施可能会阻止该漏洞被利用。

Windows 和其他非类 UNIX 系统上的用户不受影响。

缓解措施

我们建议所有用户更新到 Rust 1.71.1,该版本将于今天晚些时候发布,因为它通过在提取 crate 存档时遵循 umask 来修复该漏洞。 如果您构建自己的工具链,则 1.71.0 源代码 tarball 的补丁在此处可用

为了防止现有的缓存提取被利用,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 在披露期间提供建议。