【漏洞分析】利用Web Cache Deception Attack实现对ChatGPT的账号接管
去年2月份 @naglinagli 发表了 Shockwave Identifies Web Cache Deception and Account Takeover Vulnerability affecting OpenAI's ChatGPT ,利用Web缓存欺骗攻击实现了对ChatGPT的账号接管。
首先 @naglinagli 先是识别到接口 https://chat.openai.com/api/auth/session 会返回当前用户会话的上下文信息,包括用户的邮件、姓名、头像图片以及访问令牌等:
且从该接口的响应头CF-Cache-Status
的值为 DYNAMIC
可以看到该接口正常情况下是不会命中缓存的:
(注:CF-Cache-Status
这个是CloudFlare CDN特有的,表示是否命中缓存的响应头)
由于CDN主要缓存的是一些静态资源文件,如CSS、JS、图片文件等。且CloudFlare官方文档提供了一个默认情况下会作缓存处理的文件的后缀名列表,且仅根据文件后缀名来作缓存处理,而不是根据MIME类型:
于是 @naglinagli 尝试攻击发现 chat.openai.com/api/auth/session/test.css 依旧会返回用户的会话信息,且响应头CF-Cache-Status
的值为 HIT
,成功命中缓存。
因此整个攻击流程如下:
(1) 攻击者构造能被缓存的 url,如:https://chat.openai.com/api/auth/session/victim.css
(2) 攻击者分发url,诱导用户访问;
(3) 用户访问到该url,响应被CDN缓存;
(4) 攻击者再次访问该url,窃取到其他用户的会话信息,从而实现账号接管。
另外,作者在文章最后提到了OpenAI的修复方案:
1. Manually instruct the caching server to not catch the endpoint through a regex - (this is the fix @OpenAI chose)
这种错误的修复方式导致了bypass的可能,来自 @ayoubfathi,具体可见:https://twitter.com/_ayoubfathi_/status/1639639529987403782
OpenAI选择正则方式的修复,所以当访问 chat.openai.com/api/auth/session/test.css ,则会被正则拦截。
这种时候一般的思路是通过插入各种空白字符对正则进行fuzz,从而观察正则的缺陷。
@_ayoubfathi_ 发现 %0A%0D
没奏效,于是又添加了制表符 %09
,成功bypass了正则拦截,成功命中了缓存,从而再次实现了ChatGPT的账号接管。
除了 /api/auth/session
接口,其他还有若干接口,可以用此方式bypass正则,从而命中缓存,具体见上面的推特链接。
正确的修复方案:
需要将 Content-Type 与 URL 文件扩展名进行比较,Cloudflare 上有一个名为“Cache Deception Armor”的模块可以准确执行此操作。