【漏洞分析】利用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 会返回当前用户会话的上下文信息,包括用户的邮件、姓名、头像图片以及访问令牌等:

image

且从该接口的响应头CF-Cache-Status 的值为 DYNAMIC 可以看到该接口正常情况下是不会命中缓存的:
image

(注:CF-Cache-Status 这个是CloudFlare CDN特有的,表示是否命中缓存的响应头)

由于CDN主要缓存的是一些静态资源文件,如CSS、JS、图片文件等。且CloudFlare官方文档提供了一个默认情况下会作缓存处理的文件的后缀名列表,且仅根据文件后缀名来作缓存处理,而不是根据MIME类型:
image

于是 @naglinagli 尝试攻击发现 chat.openai.com/api/auth/session/test.css 依旧会返回用户的会话信息,且响应头CF-Cache-Status的值为 HIT,成功命中缓存。
image

因此整个攻击流程如下:

(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的账号接管。
image
image

除了 /api/auth/session 接口,其他还有若干接口,可以用此方式bypass正则,从而命中缓存,具体见上面的推特链接。

正确的修复方案:
image
需要将 Content-Type 与 URL 文件扩展名进行比较,Cloudflare 上有一个名为“Cache Deception Armor”的模块可以准确执行此操作。
image

posted @ 2025-02-21 21:08  wh03ver-momo  阅读(20)  评论(0)    收藏  举报