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

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

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

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

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

概述

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

发现 Cargo 从未实现此类检查,并且未对服务器的公钥进行任何验证,这使得 Cargo 用户容易受到 MITM 攻击。

受影响的版本

所有包含 1.66.1 之前版本的 Cargo 的 Rust 版本都容易受到攻击。

请注意,即使您没有明确使用 SSH 用于备用注册表索引或箱子依赖项,如果您已配置 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 执行,该 CLI 不受此漏洞影响。您可以通过将此代码段添加到您的 Cargo 配置文件 来实现这一点

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

致谢

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

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

于 2023 年 1 月 10 日协调世界时 21:30 更新,以包含其他缓解措施。