注册过ChatGPT API的朋友知道,新注册的用户,OpenAI免费赠送了5美元的使用额度。
一个账号5美元,100个账号可就是500美元啊,可以用很久了!
于是,有人就打起了坏主意,能不能找到OpenAI的bug,然后可以批量注册账号,薅OpenAI的羊毛呢!
最近看到一篇国外的文章,有安全团队发现了OpenAI的一个漏洞,基于这个漏洞,攻击者可以无限白嫖ChatGPT的免费额度,只要一个手机号就能注册很多账号。
漏洞详情
在讲述如何利用这个漏洞之前,让我先介绍一下ChatGPT的大致注册过程:
-
注册一个电子邮件
-
点击电子邮件激活链接
-
输入电话号码
-
输入通过短信接收到的验证代码
其中,电子邮件和电话号码都必须是唯一的,否则用户将被告知该账户已经存在,而且不会获得免费赠送的5美元资源。
绕过验证
了解了这个过程之后,来深入研究一下OpenAI的注册过程中的API。
在使用Burp代理拦截流量后,注意以下请求:
这个安全团队最初的想法是对手机号略微修改一下,让它看起来像是一个新的号码,比如添加国家代码(00351):
来看服务器的响应:
看起来服务器并没有识别出来这点小伎俩,按照这个思路,我们还可以继续在手机号前面添加0,来创建更多的手机号的变种。
然而,零的数量可能是有限的,不可能无限制加啊,还有什么办法可以搞到更多账号呢?
这就该开源工具REcollapse派上用场了。这个工具可以用来进行输入Fuzz、绕过验证、发现Web应用程序和API中的问题。
经过一些初步测试,还真给他们发现了问题。在某些非ASCII字节上使用Unicode编码后,就能绕过手机号检查的逻辑,比如:
因为手机号前面添加了0或者非ASCII字符,OpenAI服务器收到后在检查是否有相同手机号的时候把它们当成了不同的手机号,而到后续要发送验证码的环节后,OpenAI又会清除前缀零和不需要的字节,以便能发送验证码。
这样的设计可能会导致大量甚至无限的不同值(例如,0123、00123、12\u000a3、001\u000a\u000b2\u000b3等)被视为唯一标识符,在使用时折叠为一个值(123),从而完全绕过初始验证机制。
想要解决这个问题,可以在处理手机号这个字段之前进行一个预处理,将其标准化,以便在后续的模块使用时保障它是相同的手机号字符串。
漏洞披露
安全团队将该漏洞反馈给OpenAI后,收到了OpenAI的反馈:
再次感谢您提供详细的报告。我们已验证了这个发现并修复了问题。
我们感谢您向我们报告此事,并遵守OpenAI的协调漏洞披露政策 (https://openai.com/policies/coordinated-vulnerability-disclosure-policy)。
下面是整个事件的时间轴:
2022年12月2日 - 向OpenAI发送报告
2022年12月6日 - OpenAI回复称正在调查此问题
2023年2月28日 - 我们请求有关此问题的更新
2023年3月1日 - OpenAI回复称问题已解决
2023年5月4日 - 全面披露
这个漏洞如今既然已经公开了,OpenAI自然是已经修复好了,看到标题点进来以为有羊毛可薅的朋友们想法可就落空了!