这是官方安全公告的交叉发布。官方公告还包含使用我们的 PGP 密钥签名的版本。
Rust 安全响应工作组收到通知,Cargo 在通过 SSH 克隆索引和依赖项时未执行 SSH 主机密钥验证。攻击者可以利用这一点执行中间人(MITM)攻击。
此漏洞已分配 CVE-2022-46176。
概述
当 SSH 客户端与服务器建立通信时,为了防止 MITM 攻击,客户端应检查它是否过去与该服务器通信过,以及当时服务器的公钥是什么。如果自上次连接以来密钥发生更改,则必须中止连接,因为很可能正在发生 MITM 攻击。
经发现,Cargo 从未实现此类检查,并且未对服务器的公钥执行任何验证,这使得 Cargo 用户容易受到 MITM 攻击。
受影响的版本
所有包含 Cargo 1.66.1 之前版本的 Rust 都容易受到攻击。
请注意,即使您没有明确使用 SSH 用于备用注册表索引或 crate 依赖项,如果您已配置 git 将 HTTPS 连接到 GitHub 替换为 SSH(通过 git 的 url.<base>.insteadOf
设置),您也可能受到此漏洞的影响,因为这会导致您通过 SSH 克隆 crates.io 索引。
缓解措施
我们将于今天,2023-01-10,发布 Rust 1.66.1,更改 Cargo 以检查 SSH 主机密钥,如果服务器的公钥尚未被信任,则中止连接。我们建议大家尽快升级。
Rust 1.66.0 的补丁文件也可在此处获取,用于自定义构建的工具链。
目前,Cargo 不会在首次连接期间询问用户是否信任服务器的公钥。相反,Cargo 将显示一条错误消息,详细说明如何将该公钥添加到受信任的密钥列表中。请注意,如果您从中克隆依赖项或索引的主机尚未被信任,这可能会破坏您的自动化构建。
如果您还不能升级到 Rust 1.66.1,我们建议配置 Cargo 以使用 git
CLI 而不是其内置的 git 支持。这样,所有 git 网络操作都将由 git
CLI 执行,它不受此漏洞的影响。您可以通过将此代码片段添加到您的Cargo 配置文件中来完成此操作
[net]
git-fetch-with-cli = true
致谢
感谢 Julia 安全团队根据我们的安全策略向我们披露此漏洞!
我们还要感谢为修复此问题做出贡献的 Rust 项目成员。感谢 Eric Huss 和 Weihang Lo 编写和审查补丁,Pietro Albini 协调披露并撰写此公告,以及 Josh Stone、Josh Triplett 和 Jacob Finkelman 在披露期间提供的建议。
于 UTC 时间 2023-01-10 21:30 更新,以包含其他缓解措施。