Cargo 安全公告 (CVE-2022-46176)

2023 年 1 月 10 日 · Rust 安全响应工作组

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

Rust 安全响应工作组被告知,Cargo 在通过 SSH 克隆索引和依赖项时未执行 SSH 主机密钥验证。攻击者可以利用此漏洞进行中间人 (MITM) 攻击。

此漏洞已被分配 CVE-2022-46176。

概述

当 SSH 客户端与服务器建立通信时,为防止 MITM 攻击,客户端应检查过去是否已与该服务器通信过,并核对当时的服务器公钥。如果自上次连接以来密钥已更改,则连接必须中断,因为很可能正在发生 MITM 攻击。

经发现,Cargo 从未实现此类检查,也未对服务器的公钥执行任何验证,导致 Cargo 用户容易受到 MITM 攻击。

受影响的版本

所有包含 Cargo 且版本低于 1.66.1 的 Rust 版本都受到影响。

请注意,即使您没有明确使用 SSH 获取备用注册表索引或 crate 依赖项,如果您已配置 git 将与 GitHub 的 HTTPS 连接替换为 SSH(通过 git 的 url.<base>.insteadOf 设置),您也可能受到此漏洞的影响,因为这将导致您通过 SSH 克隆 crates.io 索引。

缓解措施

我们将于今天,即 2023 年 1 月 10 日,发布 Rust 1.66.1,其中将更改 Cargo 以检查 SSH 主机密钥,并在服务器的公钥尚不受信任时中断连接。我们建议所有人尽快升级。

Rust 1.66.0 的补丁文件也已在此处提供,用于自定义构建的工具链。

目前,Cargo 在首次连接时不会询问用户是否信任服务器的公钥。相反,Cargo 将显示一条错误消息,详细说明如何将该公钥添加到受信任密钥列表中。请注意,如果您克隆依赖项或索引的主机尚不受信任,这可能会破坏您的自动化构建。

如果您暂时无法升级到 Rust 1.66.1,我们建议配置 Cargo 使用 git CLI 而非其内置的 git 支持。这样,所有的 git 网络操作都将由 git CLI 执行,而 git CLI 不受此漏洞影响。您可以通过将此片段添加到您的 Cargo 配置文件中来实现:

[net]
git-fetch-with-cli = true

致谢

感谢 Julia 安全团队根据我们的安全政策向我们披露了此漏洞!

我们还要感谢为解决此问题做出贡献的 Rust 项目成员。感谢 Eric Huss 和 Weihang Lo 编写和审查补丁,Pietro Albini 协调披露和撰写此公告,以及 Josh Stone、Josh Triplett 和 Jacob Finkelman 在披露期间提供的建议。

于 2023-01-10 协调世界时 21:30 更新,包含额外的缓解措施。