个推sdk协议PushDown漏洞报告

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为例,其产生的推送流量如下图所示。

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

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

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

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

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

0x03漏洞验证

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

演示视频【密码:gossip】

0x0x4受影响的app列表

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

  • 新浪微博
  • 唱吧
  • 世纪佳缘
  • 宝宝树
  • in
  • 辣妈帮
  • kk唱响
  • 19楼
  • 课程格子
  • 优蓓通
  • PPTV
  • 暴风影音
  • 天天动听
  • 美拍
  • 芒果TV
  • 爱音乐
  • 手机电视
  • 虾米音乐
  • 风云直播
  • 喜马拉雅FM
  • 骑车之家
  • 今日头条
  • 掌阅
  • 新华社
  • 和阅读
  • 橘子娱乐
  • 浙江新闻
  • 四川新闻
  • 墨迹天气
  • Camera360
  • 美图秀秀
  • 春雨医生
  • 智联招聘
  • 酷划
  • 典典养车
  • 导航犬
  • 橙牛汽车管家
  • 安居客
  • 去哪儿
  • 滴滴出行
  • e代驾
  • 艺龙网
  • 布丁酒店
  • 蘑菇街
  • 微店
  • 口袋购物
  • 淘粉吧
  • 飞牛网
  • 一号药店
  • 敦煌网
  • 辣妈汇
  • 掌上生活
  • 随手记
  • 公牛炒股
  • 51信用卡
  • 平安陆金所
  • 铜板街
  • 银天下
  • 闪贷网
  • 博雅斗地主
  • 全民奇迹
  • 4399游戏盒
  • 联众游戏
  • 三国杀
  • 光宇游戏
  • LOL掌游宝
  • 凡跃德州

转载自:https://www.zybuluo.com/ensis/note/304959