[关闭]
@ensis 2016-03-21T04:13:33.000000Z 字数 5437 阅读 2600

个推sdk协议PushDown漏洞报告

gossip漏洞报告


0x00序

应用程序通过集成第三方推送sdk来达到给客户端推送消息的功能。目前国内的推送sdk比较流行的是个推,据其官网介绍,个推第三方推送市场的占有率达90%以上,其典型客户包括新浪微博、去哪儿、虾米音乐等应用。
但由于个推协议的密码学设计存在严重缺陷,导致整个通信的安全性完全遭到破坏,所有推送流量都可以被解析,中间人可对推送内容进行任意更改,我们将此漏洞命名为 PushDown,下面对其进行详细介绍。

0x01影响和危害

截止至本文发布之日,个推sdk的版本更新至2.8.1.0(发布时间2016-03-01)。经测试确认,此版本及之前可找到的版本均存在该问题,因此PushDown的影响范围为所有使用了个推sdk的应用。根据个推行业报告中的数据,其接入sdk用户数达67亿,覆盖独立终端9亿,日活跃用户6.5亿,日分发消息22亿,而所有这些应用以及每日分发的这些消息都会受PushDown漏洞的影响。
由于该漏洞能够在线实时解密并修改通信内容,其所能造成的危害包括但不限于以下几类:

  1. 用户识别与跟踪。每个集成了sdk的应用程序在屏幕点亮后,都会自动与个推服务器建立连接,表明身份(通过唯一标识符cid)并维持在线,等待服务器推送消息,因此通过跟踪特定cid对应的ip的变化,可能会泄露用户的行动轨迹。
  2. 流量劫持。有很大一部分推送消息,用户点击后会通过浏览器打开某一网页,恶意攻击者可通过篡改消息中的url,使用户打开恶意的网址。
  3. 推送协议中,收到推送后完成的一系列动作由推送消息中的action_chains字段中规定的一系列action组合完成,攻击者通过任意组合action(action的类型有goto , notification, startapp, null, wakeupsdk, startweb, checkapp, cleanext, enablelog, disablelog, reportext),并结合特定程序的特点,可达到诸如唤醒程序,打开网页等效果。

0x02漏洞分析

当打开app后,客户端会主动与igexin服务器的5224端口通信,建立长连接,并定时发送心跳包到服务器,表明在线。当服务器有消息要推送时,即通过之前建立的连接将内容发送给服务器。
整个通信过程使用了自定义的密码算法进行保护,经过逆向sdk,可以恢复出通信的加密过程。

以虾米音乐apk为例,其产生的推送流量如下图所示。

通过对协议的相应字段进行逆向解析,可得出密文消息的格式(字段和语义信息)。下面以第一条消息为例解析,

73ea68fb 14 05 34 01 10 cb680f5a8427784d2eeb0bd06cf34a01 0057 069e1a0f58c277698b275278044c875dd3f3e093f7aa1dd1671da5aa9f479d2932e5c062dd6947483c8998c89725d5f84f648468abc34af3ee9a4e23b00fa0b861673285d32196a4880e53fcf8a190921987d04e13b2f304

个推协议的每条消息均以0x73ea68fb开头,后面一个字节14为长度字段,05 34 01 10 cb680f5a8427784d2eeb0bd06cf34a01中053401与消息解密无关,10为长度字段,其后的16个字节cb680f5a8427784d2eeb0bd06cf34a01是客户端生成的会话密钥材料,经过一些固定变换后,作为生成流密钥的种子。0057为长度字段,其后的内容(069e1a0f58c2...)均为密文,是用自定义的类似流密码的加密算法进行加密后的结果。对密码算法逆向后,生成对应的解密算法,即可实时解密通信数据。
上面这条消息解密后的内容为

'\x0f460012182913413\x0f359786050198713\x1fA-359786050198713-1457335818899\x16UgM0PuGY4Z9hhSeWysmxz5'

对于解密出的消息,同样通过逆向程序得到消息的格式和语义信息。上条消息相应字段对应的语义信息为sim,imei,A-imei-timestamp和Appid,而密钥材料cb680f5a8427784d2eeb0bd06cf34a01即是经MD5(A-imei-timestamp)计算得到的。

下面是虾米音乐应用从屏幕点亮到收到一条推送消息的过程中所有消息解密后的情况,从中可以看到一个完整的推送过程。

Send '\x0f460012182913413\x0f359786050198713\x1fA-359786050198713-1457335818899\x16UgM0PuGY4Z9hhSeWysmxz5'
Recv '\x0f]\x91J\x13\x9fg\xaf\x1fA-359786050198713-1457335818899 921f7606f5a217900ea4e1e46d8e3e2c 8ffcc07d7c924c7aacd5ef76db0f014d'
注:客户端向个推服务器注册,其中包括sim,imei和AppID信息;服务器确认并返回该用户的cid(921f7606f5a217900ea4e1e46d8e3e2c)。这个交互只发生在应用第一次在设备上运行时。

Send '\x0f]\x91J\x13\x9fg\xaf\x00\x00\xff\x00\x00\x16UgM0PuGY4Z9hhSeWysmxz5'
Recv '@\x0f]\x91J\x13\x9fg\xaf'
注:客户端向服务器表明在线,服务器确认。这个交互发生在每次应用重新打开或屏幕点亮时。

Send '\xe6\xf2\x81\x00\x00\x00\x00\x00\x00\x00\x00\x0817258000\x824{"id":"1457335822066","action":"addphoneinfo","info":{"app":"MDP","model":"SM-N9006","cell":"","imei":"359786050198713","sim":"460012182913413","mac":"","type":"ANDROID","system_version":"android4.3","deviceid":"ANDROID-93ee89e0f06d47b8bd9b34741b71990f","channelid":"open:fm.xiami.main","version":"2.6.0.0"}}\x00 921f7606f5a217900ea4e1e46d8e3e2c'
Recv '\xe6\xf2\x81\x00\x00\x01SO\xfb\xf4\\\x0817258000*{"action":"received","id":"1457335822066"}\x00 921f7606f5a217900ea4e1e46d8e3e2c'

Recv '\xefy\x81\x00\x00\x01SP\x00\x85\'\x03OMP\x85^{"id":"ce5699d8-5457-4374-8e3d-71aa0c08c44e_OMP","condition":{"duration":""},"taskid":"OSA-0307_d1yBLcjHwb5HT3mR6idYl7","action_chains":[{"actionid":"1","do":"10030","type":"goto","is_withnettype":"false"},{"actionid":"10030","noinstall_action":"100","appid":"","do":"100","appstartupid":{"android":"","ios":"","symbia":""},"type":"startapp","is_withnettype":"false","is_autostart":"false"},{"actionid":"100","type":"null","is_withnettype":"false"}],"appkey":"jfY3OTRHNC9tSAvPTxK3F2","action":"pushmessage","appid":"UgM0PuGY4Z9hhSeWysmxz5","messageid":"ce5699d8-5457-4374-8e3d-71aa0c08c44e","push_info":{"message":"","action_key":"","launch-image":"","sound":"","loc-args":"","payload":"","action-loc-key":"","loc-key":"","badge":""}};{"title":"华晨宇新歌《横冲直撞》独家首发!","text":"邀你一起回忆我们滚烫炙热的青春!","exts":{"category":"system","category_id":86,"name":"虾小米","url":"xiami:\/\/open?url=http%3a%2f%2fwww.xiami.com%2fmarket%2fmusic%2fact%2fhuachenyu.php","scheme_url":"xiami:\/\/open?url=http%3a%2f%2fwww.xiami.com%2fmarket%2fmusic%2fact%2fhuachenyu.php","image":"http:\/\/img.xiami.net\/images\/common\/uploadpic\/68\/14573234681214.jpg","type":"artist"}} 921f7606f5a217900ea4e1e46d8e3e2c'
Send 'x"\x81\x00\x00\x00\x00\x00\x00\x00\x00\x0817258000\x82\x14{"action":"pushmessage_feedback","appid":"UgM0PuGY4Z9hhSeWysmxz5", "id":"1457336121378", "appkey":"jfY3OTRHNC9tSAvPTxK3F2", "messageid":"ce5699d8-5457-4374-8e3d-71aa0c08c44e","taskid":"OSA-0307_d1yBLcjHwb5HT3mR6idYl7","actionid": "0","result":"ok","timestamp":"1457336121378"}\x00 921f7606f5a217900ea4e1e46d8e3e2c'
注:收到服务器推送的消息,相应动作为打开应用;客户端确认收到,发送反馈消息。

通信过程中由于作为中间人可以解密、篡改和加密数据包,因此可以任意更改推送的内容,例如更改推送的文字、链接,甚至通过更改action_chains的动作属性,达到startapp,startweb等动作。

0x03漏洞验证

因为服务器推送时机不确定,因此我们给出两个演示。
第一个演示中使用个推给出的demo程序来验证个推协议的通信确实可以被在线实时解密和修改。demo程序集成了个推的sdk,可以接收推送来的消息。同时为了方便触发推送,程序也实现了以app管理者身份(拥有MasterSecret,可以生成提交给推送服务器的推送请求)推送消息给在线客户端的功能,因此在程序中点击“通知栏测试”时,程序会发起一个http连接,向个推服务器提交推送请求,之后由于该客户端用户在线,又会马上收到来自个推服务器的推送消息。可以看到,演示中原本推送来的消息是打开igexin.com网页,经我们的中间人后,变为baidu.com。
第二个演示以虾米音乐为例,想要说明的是该应用的确会使用个推协议进行消息推送,在恰当的时机收到推送,即可像演示一中那样做内容篡改。

演示视频【密码:gossip】

0x0x4受影响的app列表

根据个推官网的数据,理论上受影响的客户端包括下列app。
注:因涉及的app较多,并未全部测试。作者仅对手机里装的新浪微博、唱吧、虾米音乐、喜马拉雅、去哪儿和滴滴出行应用进行了验证,结果表明除新浪微博在推送时使用了自定义的协议以外,其他app均使用了个推sdk,推送流量均可被解开。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注