10月15日星期一,大约协调世界时20:00开始,crates.io 遭遇了一次运营事故。您可以在此处找到状态页报告,在此处找到我们关于此事的推文。
根本原因
一个名为 cratesio 的用户在 crates.io 上创建,并开始上传使用常用短名称的包。这些包除了 Cargo.toml 文件和 README.md 外不包含任何内容,后者指示用户如果想使用该名称,应在 crates.io 问题追踪器上提交问题。
该用户上传包的速度最终导致我们的服务器受到 GitHub 的限制,从而导致所有包上传或撤回(yank)操作变慢。不涉及更新索引的端点未受影响。
我们决定对这种行为采取行动,因为
- 上传包的内容似乎是试图冒充 crates.io 团队(通过用户名
cratesio以及在 crate 的Readme文件中将人们导向 crates-io 问题追踪器) - 上传速率影响了服务的稳定性
已采取的行动
该用户的 IP 地址立即被封禁。随后,我们回溯了用户的包,将其从主页移除。我们还将 cratesio 用户页面重定向到 404。
最后,cratesio 用户及其上传的所有 crate 都被删除。该用户已向 GitHub 举报,并已被 GitHub 封禁。
事件时间线
- 协调世界时 20:09:GitHub 用户
cratesio注册账户 - 协调世界时 20:13:该用户开始上传包,速率约为每2秒一个包
- 协调世界时 20:17:所有更新索引的请求开始耗时10秒以上
- 协调世界时 20:41:发送电子邮件给 Rust 审核团队报告该用户
- 协调世界时 20:46:报告转发给 crates.io 团队
- 协调世界时 20:50:在 crates.io 团队 Discord 中报告该用户。
- 协调世界时 21:00:该用户的 IP 地址被阻止访问网站
- 协调世界时 21:20:该用户的包从 crates.io 主页移除
- 协调世界时 21:20:在 status.crates.io 上宣布事故
- 协调世界时 22:49:该用户在 crates.io 上的账户页面被移除。
- 协调世界时 23:58:包、所有相关数据以及用户账户从 crates.io 删除
- 协调世界时 00:40:包从索引中移除。
未来措施
单个用户或 IP 地址在短时间内上传如此多包本应不可能。我们将在此端点引入速率限制,以限制脚本未来能够上传的包的数量。
我们还在考虑禁止可能冒充官方 Rust 团队的用户名。我们将更新政策以明确说明不允许这种形式的冒充。我们将在未来几周内确定此政策的确切措辞。
虽然无法确定用户的意图,但包括团队在内的许多人推测,此行为与最近社区对 crates.io 政策、特别是抢注政策的沮丧情绪加剧有关或直接相关。
无论此事件是否有此意图,cratesio 团队重申,采取像我们在周二所经历的那样行动,并非参与关于 crates.io 政策对话的恰当或有效方式。我们将新增一项政策,明确说明试图扰乱 crates.io 以提出或进一步强调某个观点是不恰当的,并将被视为恶意攻击。我们将在未来几周内确定此政策的确切措辞。
如果您认为某项政策存在问题,提出更改的正确途径是创建 RFC 或通过 help@crates.io 联系团队。
我们还看到很多人感到沮丧,认为 crates.io 团队没有听取在官方和非官方 Rust 论坛上提出的担忧。我们同意应该改进与社区的沟通,并打算制定更多流程供大家与我们交流,以及团队向普通社区传达信息。
背景
社区中关于我们的抢注政策以及我们不采用命名空间的决定,讨论日益增多。
原始的抢注政策于2014年发布,其中包含比目前我们网站上更多关于该政策背后理由的信息。原始政策全文如下:
没有人喜欢“抢注者”,但要找到能够机械应用的良好抢注定义规则,却是众所周知地困难。如果我们要求包中至少包含一些内容,抢注者就会插入随机内容。如果我们要求定期更新,抢注者会确保定期更新,而这条规则可能会过于严格地应用于相对稳定的包。
一个更逐案处理的政策将非常难以制定得当,并且几乎肯定会导致严重的错误和持续的争议。
相反,我们将坚持先到先得的系统。如果有人想接管一个包,并且原所有者同意,现有维护者可以将其添加为所有者,新维护者可以移除原所有者。如有必要,团队可以联系不活跃的维护者,协助调解所有权转移过程。我们知道这意味着,在实践中,某些受欢迎的名称会被早早占据,并且那些早期用户可能不会以最优方式使用它们(无论是被抢注者占有还是仅仅是低质量的包)。其他生态系统通过使用更多彩的名称来解决这个问题,我们认为这实际上是这个系统的一个特性,而不是一个 bug。我们将在下面进一步讨论这个问题。
我们将讨论是否将部分信息包含在我们网站上发布的政策中,以帮助更多人理解我们政策背后的理由,而无需团队成员回复每一个想要重新讨论已充分讨论过的内容的论坛帖子。
结论
我们想尽快分享事件的细节以及 crates.io 团队为何选择快速采取行动。我们描述的政策变更将在接下来的几次团队会议中讨论。在团队有机会进一步讨论之前,没有任何决定是最终确定的,但我们想分享我们正在讨论的可能变更,以限制对我们未来计划采取的行动的猜测。
提醒一下,如果您想举报有关 cratesio 的事件,可以通过 help@crates.io 联系团队。您可以在 https://crates-io.statuspage.io/ 查看服务状态,或通过在 Twitter 上关注 @cratesiostatus 获取信息。