crates.io 安全公告

2020 年 7 月 14 日 · Rust Security Response WG

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


Rust 安全响应工作组最近收到了关于 crates.io Web 应用程序中令牌生成相关的安全问题的通知,在调查该问题时,我们发现了另一个影响 crates.io API 令牌的漏洞。

我们没有证据表明此问题已被利用,但出于谨慎考虑,我们决定撤销所有现有 API 密钥。您可以在 crates.io/me 生成新的密钥。

概览

直到最近,crates.io 的 API 密钥都是使用 PostgreSQL 的随机函数生成的,它不是一个密码学安全的随机数生成器。这意味着理论上,攻击者可以通过观察足够多的随机值来确定随机数生成器的内部状态,并利用这些信息来确定在上次数据库服务器重启之前创建的 API 密钥。

在调查此问题时,我们还发现 API 密钥以明文形式存储。这意味着如果我们的数据库被某种方式泄露,攻击者将获得所有当前令牌的 API 访问权限。

缓解措施

我们已在生产环境中部署了代码变更,以使用密码学安全的随机数生成器,并且我们在数据库中存储令牌时实现了哈希处理。

实际上,利用任一问题都极其不切实际,而且我们没有发现证据表明此问题已被利用。但是,出于谨慎考虑,我们已决定撤销所有现有 API 密钥。您可以通过访问 crates.io/me 生成新的 API 密钥。对于由此造成的任何不便,我们深表歉意。

致谢

感谢 Jacob Hoffman-Andrews 根据 我们的安全策略 负责任地披露了随机数生成器问题。感谢来自 crates.io 团队的 Siân GriffinJustin Geibel 帮助安全响应工作组解决这两个问题。感谢来自安全响应工作组的 Pietro Albini 协调了关于此漏洞的工作。

事件时间线

所有时间均以 UTC 列出。

  • 2020-07-11 17:43 - 问题报告至 security@rust-lang.org
  • 2020-07-11 20:56 - 问题得到确认, crates.io 团队的负责人被加入讨论
  • 2020-07-11 23:48 - 问题得到确认并商定计划的修复方案
  • 2020-07-13 08:00 - 开始开发修复方案
  • 2020-07-14 12:53 - 在 staging 环境中测试修复方案
  • 2020-07-14 19:03 - 修复方案部署,现有令牌被撤销,并公开披露此问题