OpenAI 3 月 20 日 ChatGPT 中断事情
由于开源库中的一个错误,我们本周早些时候将 ChatGPT 下线,该错误允许一些用户看到另一个活跃用户的聊天记录中的标题。如果两个用户大约同时处于活动状态,那么新创建的对话的第一条消息也可能在其他人的聊天记录中可见。
该错误现已修补。除了几个小时的历史记录外,我们能够恢复 ChatGPT 服务以及后来的聊天记录功能。正如承诺的那样,我们将在下面发布此问题的更多技术细节。
经过更深入的调查,我们还发现,同样的错误可能导致 1.2% 的 ChatGPT Plus 订阅者在特定的 9 小时窗口内处于活跃状态,从而无意中看到了与支付相关的信息。在周一我们让 ChatGPT 离线之前的几个小时里,一些用户可能会看到另一个活跃用户的名字和姓氏、电子邮件地址、支付地址、信用卡类型和信用卡号码的最后四位数字(仅),和信用卡有效期。完整的信用卡号码在任何时候都不会暴露。
我们认为,其数据实际泄露给其他人的用户数量极少。要访问此信息,ChatGPT Plus 订阅者需要执行以下操作之一:
- 打开太平洋时间 3 月 20 日星期一凌晨 1 点到 10 点发送的订阅确认电子邮件。由于该错误,该窗口期间生成的一些订阅确认电子邮件被发送给了错误的用户。这些电子邮件包含信用卡类型和另一个用户信用卡号的最后四位数字,但没有显示完整的信用卡号。在 3 月 20 日之前,可能有少量订阅确认电子邮件被错误地处理,尽管我们尚未确认任何此类情况。
- 在太平洋时间 3 月 20 日星期一凌晨 1 点到 10 点之间,在 ChatGPT 中单击“我的帐户”,然后单击“管理我的订阅”。在此窗口中,另一个活跃的 ChatGPT Plus 用户的名字和姓氏、电子邮件地址、付款地址、信用卡类型和信用卡号的最后四位数字(仅)以及信用卡有效期可能是可见的。这也可能发生在 3 月 20 日之前,尽管我们尚未确认任何此类情况。
我们已联系受影响的用户通知他们的付款信息可能已被泄露。我们相信用户数据不会持续存在风险。
OpenAI 的每个人都致力于保护我们用户的隐私并确保他们的数据安全。这是我们非常认真对待的责任。不幸的是,本周我们没有达到这一承诺,也没有达到用户的期望。我们再次向我们的用户和整个 ChatGPT 社区致歉,并将努力重建信任。
技术细节
该错误是在 Redis 客户端开源库 redis-py 中发现的。一旦我们发现了这个错误,我们就联系了 Redis 维护者并提供了一个补丁来解决这个问题。这是错误的工作原理:
- 我们使用 Redis 在我们的服务器中缓存用户信息,因此我们不需要为每个请求检查我们的数据库。
- 我们使用 Redis Cluster 将此负载分布到多个 Redis 实例。
- 我们使用 redis-py 库从使用 Asyncio 运行的 Python 服务器与 Redis 交互。
- 该库在服务器和集群之间维护一个共享连接池,并在完成后回收连接以用于另一个请求。
- 使用 Asyncio 时,使用 redis-py 的请求和响应表现为两个队列:调用者将请求推送到传入队列,然后从传出队列弹出响应,然后将连接返回到池中。
- 如果在请求被推送到传入队列之后,但在响应从传出队列中弹出之前,请求被取消,我们会看到我们的错误:连接因此被破坏,并且为不相关请求出队的下一个响应可以接收遗留的数据在连接中。
- 在大多数情况下,这会导致不可恢复的服务器错误,用户将不得不再次尝试他们的请求。
- 但在某些情况下,损坏的数据恰好与请求者期望的数据类型相匹配,因此从缓存中返回的数据看起来是有效的,即使它属于另一个用户。
- 太平洋时间 3 月 20 日星期一凌晨 1 点,我们无意中对服务器进行了更改,导致 Redis 请求取消数量激增。这为每个连接返回错误数据创造了一个小概率。
此错误仅出现在 Redis Cluster 的 Asyncio redis-py 客户端中,现已修复。
我们采取的行动
随着我们调查的结束,支持和通知我们的用户是我们的首要任务。
我们采取了以下措施来改进我们的系统:
- 广泛测试了我们对潜在错误的修复。
- 添加了冗余检查以确保我们的 Redis 缓存返回的数据与请求用户匹配。
- 以编程方式检查我们的日志,以确保所有消息仅对正确的用户可用。
- 关联多个数据源以准确识别受影响的用户,以便我们通知他们。
- 改进了日志记录以识别何时发生并完全确认它已停止。
- 提高了我们的 Redis 集群的稳健性和规模,以减少在极端负载下出现连接错误的可能性。
我们从这里去哪里
Redis 开源维护者是出色的合作者,他们迅速解决了错误并推出了补丁。Redis 和其他开源软件在我们的研究工作中发挥着至关重要的作用。它们的重要性不可低估——如果没有 Redis,我们将无法扩展 ChatGPT。我们致力于不断支持和贡献 Redis 社区。