发生了什么
太平洋时间2023年3月20日凌晨1点,OpenAI对ChatGPT服务器进行了一项变更,导致Redis请求取消操作激增。OpenAI使用Redis缓存用户信息,以避免每次请求都查询数据库,其Python服务器通过redis-py库与缓存通信,该库会在请求之间复用连接。
在使用Asyncio时,如果一个请求在排队后但在响应到达前被取消,就会损坏连接;下一个无关请求可能会收到连接中残留的数据。在某些情况下,返回的数据与请求者预期匹配,导致一个用户看到另一个活跃用户的聊天历史标题——在九个小时的时间窗口内,一些ChatGPT Plus订阅者可以看到其他用户的姓名、电子邮件、支付地址、卡类型、过期日期和卡号后四位。完整卡号从未暴露。
OpenAI将ChatGPT下线,修复了redis-py中的bug,增加了冗余的逐请求数据检查,改进了日志记录,并通知了受影响的用户。据估计,受影响的计费信息涉及该时间段内活跃的ChatGPT Plus订阅者的1.2%,且实际数据被他人看到的用户数量极低。
付出的代价
ChatGPT曾被迫下线;在九个小时内,1.2%的活跃ChatGPT Plus订阅者的支付相关信息被暴露——但完整卡号未泄露。
为什么发生
共享连接池假设已取消的请求不会污染后续响应——即redis-py的竞态条件。
3月20日的变更导致取消操作激增,将罕见漏洞变成了实际风险。
ChatGPT的缓存中存储了个人和支付数据,因此缓存漏洞成了隐私事件。
缓存路径上没有任何机制在提供服务前验证返回数据是否属于请求用户。
可以学到什么
当池化缓存连接服务多个用户时,每个响应都必须针对请求者进行验证——而引发取消操作激增的变更可能意味着隔离被破坏,而不仅仅是中断。
后续
OpenAI在几天内恢复了聊天历史记录(除几小时外),Redis维护者也发布了补丁。该事件立即引起了监管关注:3月31日,意大利的Garante临时禁止了ChatGPT,理由包括3月20日的数据泄露等问题,OpenAI随后在意大利暂停了服务,并面临高达2000万欧元或全球营业额4%的罚款。此案成为AI服务缓存层如何迅速将扩展问题转化为数据保护危机的参考案例。
从这里,追溯依据
参考来源
- March 20 ChatGPT outage: Here's what happened web.archive.org
- A bug revealed ChatGPT users' chat history, personal and billing data helpnetsecurity.com
- Italy curbs ChatGPT, starts probe over privacy concerns tech.yahoo.com