首页 网络安全 安全学院 查看内容

QQ浏览器隐私泄露报告

2016-6-7 12:22 6198 0

摘要: 0x00 简介QQ浏览器是腾讯开发的一款网络浏览器,面向Android,Windows,Mac和iOS等平台。相较于内置浏览器,QQ浏览器提供了更丰富的功能,例如,增加了标签窗口,并且整合了聊天平台等。报告中详细的分析了Windows和 ...

0x00 简介

QQ浏览器是腾讯开发的一款网络浏览器,面向Android,Windows,Mac和iOS等平台。相较于内置浏览器,QQ浏览器提供了更丰富的功能,例如,增加了标签窗口,并且整合了聊天平台等。

报告中详细的分析了Windows和Android版本的QQ浏览器是如何传输用户数据。这两个版本的QQ浏览器在传输用户的身份数据时,要么直接不使用加密,要么使用的加密算法简直形同虚设。完整的讨论内容请参阅我们的报告 《Baidu’s and Don’ts: Privacy and Security Issues in Baidu Browser》 。

由于这种数据传输方式非常不安全,所以只要能介入数据传输路径(比如,用户的ISP,连接了咖啡店的WiFi网络,或入侵了相应网络的黑客),收集并解密数据流量,就能够截获到这些个人数据。

除了数据传输方式不够安全,这两版QQ浏览器的更新方式也有漏洞,会导致任意代码执行。也就是说,攻击者可以伪造一个软件更新,将恶意代码安装到用户的设备上。

这份报告属于 《Privacy and Security of Mobile Applications in Asia》 系列。此前,我们已经确认了移动版的UC浏览器和百度浏览器也存在类似的问题。斯诺登也曾经曝光说,五眼情报联盟(NSA,GCHQ,CSE,ASD,GCSB)利用了UC浏览器中的安全问题来识别和跟踪用户身份。在已经公布的 《The Many Identifiers in Our Pockets》 报告中,我们列出了哪些个人数据是经常被收集和传输的。

另外,我们研究了TOM-Skype和UC上的密码审核机制,对比分析了一些在亚洲风靡的移动聊天工具,包括微信,LINE和KakaoTalk。除此之外,我们还检查了微信上的密码审核机制。这次研究的主要目的是通过一种综合性的方法,包括逆向工程和其他技术分析方法,让用户意识到这些应用中的安全和隐私问题,同时,希望相关的软件公司,承担起应有的责任,保护用户的权益。

2016年3月17日,我们询问了腾讯为什么要收集用户数据,并且还要通过一种不安全的方式将这些数据传输到QQ服务器。 这里 是我们提出的具体问题。直至截稿,我们没有收到任何答复。在最后,我们讨论了一些可能的深层原因,为什么中国的这三款浏览器会出现类似的问题。

0x01 技术分析

我们分析了两个版本的QQ浏览器,分别是安卓版6.3.01920和Windows版9.2.5478。在分析过程中,我们使用了大量的工具。比如,我们使用了tcpdump和Wireshark来捕捉和分析网络流量,也使用了机器代码和字节码反汇编工具,反编译器和调试工具来分析程序行为,包括,JD, JADX和IDA。

我们发现这两个浏览器都使用了一种通用机制与服务器通讯,而这种机制会导致个人信息的泄露,并且,这些浏览器的更新过程中也存在多个安全漏洞。

我们的技术分析分为三部分,第一部分介绍了一个基本结构,这两个版本的QQ浏览器都会通过这个结构向QQ服务器传输数据。第二部分分析了被采集的个人用户数据,以及安卓版的软件更新过程。第三部分分析了相应的Windows版功能。

0x02 第一部分:QQ浏览器的数据传输

安卓和Windows版的QQ浏览器都使用了一种WUP请求与QQ服务器通讯。

WUP请求

WUP请求是一种二进制格式,可以包含不同类型的值,例如,整数,浮点数,列表,字符串和递归结构。有时候,这些请求首先要经过加密,然后再嵌入到一个HTTP POST请求的主体中,最后,随着这个HTTP POST请求发送到目的URL。我们写了一个 Python脚本 来解密并解析这些请求,从而将其转换成人类可读格式。在这个脚本的代码中,还包含了在接下来解密数据时需要用到的其他脚本。

Q-GUID,Q-UA和Q-UA2字段

Q-GUID,Q-UA和Q-UA2字段出现在WUP请求的HTTP标头中。在接下来介绍WUP请求时,如果某个字段的对应值出现在了WUP请求的有效载荷中,我们就用这个字段来代指一个相应的实例。在HTTP标头中,这些字段都不会经过加密,但是,当这些字段出现在WUP请求中时,其格式会发生变化。

Q-GUID字段中填充的值是在初始化时,通过一个WUP请求从QQ服务器上获取的,并且在接收到这个值后,浏览器就会保留这个值,并且将其添加到后续请求的HTTP标头中,没有加密。在很多WUP请求的有效载荷中,也包含有这个值。下面就是一个Q-GUID:caed22d728efa6127d53bc0412f888cb

GUID可能表示的是“全局唯一标示符”,是一个128位数字,通常是随机生成的。

Q-UA和Q-UA2值中包含有与QQ浏览器版本和硬件平台相关的硬编码信息。虽然,UA很可能指的是“User Agent”,并且包含有与HTTP user agent字符串相似的信息,但是其格式却不同于QQ浏览器在HTTP标头中使用的user agent HTTP字段。

0x03 第二部分:分析安卓版QQ浏览器

我们分析的安卓版QQ浏览器是6.3.01920版本,下载于 http://mb.qq.com/ 。在启动后,或执行了某些事件时,比如,浏览网页或检查更新,浏览器就会向http://wup.imtt.qq.com:8080/ 发送WUP请求。这些请求使用了下面的这种加密方式。

对于每个加密的WUP请求,会根据下面的Java代码来生成一个AES秘钥:

#!java
int i = 10000000 + new Random().nextInt(89999999);

    int j = 10000000 + new Random().nextInt(89999999);

    return (String.valueOf(i) + String.valueOf(j)).getBytes();

所以说,这个秘钥是一个128位秘钥,由16个ASCII数字组成。而且,第1个和第9个字节永远不可能是0,前8个和最后8个字节不可以全都是9,所以,秘钥空间并不是常规的 2^128 ,而是 89999999^2 < 2^53 。

随后,这个秘钥会用于通过AES+ECB模式来加密WUP请求。AES秘钥会使用一个128位的RSA公钥加密,系数:245406417573740884710047745869965023463,指数:65537。加密后的AES秘钥会被纳入到HTTP请求的qbkey HTTP标头中。

RSA是一种非对称加密算法,也就是说,在解密时需要使用另一个不同的私钥,上面提到的RSA秘钥无法直接用于解密AES秘钥和WUP请求。但是,RSA的安全程度取决于加密秘钥的系数分解难度。一旦分解,解密秘钥就很容易获得了。上述的RSA公钥只有128位,分解起来并不难。(RSA秘钥一般建议至少2018位)。使用Wolfram Aplpha这个在线计算引擎,用不了1秒就可以分解秘钥的系数:

http://www.wolframalpha.com/input/?i=factor+245406417573740884710047745869965023463

分解后,得到了下面两个质因数:

14119218591450688427 x 17381019776996486069

有了这些质因数,任何在监控流量的中间人都可以解密出每个WUP请求使用的AES秘钥,然后再使用AES秘钥解密WUP请求。

我们一直监控着浏览器发送的流量,并且使用这个秘钥解密了所有的WUP请求。多数WUP请求中传输的是一些很容易解密的个人信息。在图1中,是一个解密后的WUP请求,通过我们的脚本,可以将其解析成可读的形式。

图1-解密后的WUP请求。我们用“#”替代了敏感数字。

下面是我们识别出的一些重要请求,以及每个请求传输的个人信息:

WUP请求发送时间加密程度
profileInfo.profileInfo浏览器启动时简单加密
hotword.getAssociationalWords输入地址栏时不加密
Security.doSecurityReqest [sic]浏览网页时简单加密
proxyip.getIPListByRouter浏览器启动时简单加密
pkgcenternew.checkUpdate检查更新时简单加密
数据点数据点描述加密程度WUP请求
IMEI国际移动设备标识码,每台设备对应一个唯一的字符串简单加密profileInfo.profileInfoSecurity.do SecurityReqest proxyip.getIPListByRouter pkgcenternew.checkUpdate
IMSI国际移动用户标识码,每个用户对应一个唯一的数字简单加密profileInfo.profileInfo
Q-GUIDQQ浏览器使用这个唯一字符串来识别用户身份不加密hotword.getAssociationalWords Security.doSecurityReqest proxyip.getIPListByRouter
Q-UA2QQ浏览器使用这个值来识别应用版本和硬件平台的类型不加密hotword.getAssociationalWords Security.doSecurityReqest
QQ usernameQQ用户名简单加密profileInfo.profileInfo
Screen pixel dimensions用户设备的屏幕尺寸简单加密profileInfo.profileInfo
WiFi MAC address媒体访问控制地址,识别无线传输器的唯一标识,比如,设备上的蓝牙芯片和WiFi芯片简单加密profileInfo.profileInfo*
In-range WiFi access point MAC addresses所有周边WiFi访问点的媒体访问控制地址简单加密profileInfo.profileInfo proxyip.getIPListByRouter
SSID of connected WiFi access point用户连接的WiFi名称简单加密proxyip.getIPListByRouter
Android ID在OS首次运行时,生成的一个唯一数字,用于追踪用户简单加密pkgcenternew.checkUpdate
Address bar contents用户在地址栏中输入的内容(比如,搜索请求)不加密hotword.getAssociationalWords
Full page URL每个访问页面的完整URL简单加密Security.doSecurityReqest

WiFi MAC地址通过DES+ECB模式加密,使用的秘钥是“\x25\x92\x3c\x7f\x2a\xe5\xef\x92 ”。

WUP请求的响应也很容易解密。WUP响应并没有使用前面提到的非对称加密算法,而是单纯使用了一种对称性算法,所以我们不需要分解任何秘钥的质因数。换句话说,其加密模式是MTEA+MCBC,使用的硬编码ASCII加密秘钥是:“sDf434ol*123+-KD ”

很有趣的是,QQ浏览器的加密过程是非标准的MTEA+MCBC模式,和百度浏览器一样(见图4)。

因为这种算法是对称的,所以这些响应的加密和解密秘钥是同一个。任何中间人都可以利用这个秘钥,主动伪造一个来自QQ服务器的响应。我们通过攻击QQ浏览器的更新过程证实了这一点。

软件更新过程存在漏洞

通过pkgcenternew.checkUpdate请求的存在来看,软件更新是可用的。在这个请求的响应中可能会包含有下载新APK文件的链接,APK的MD5哈希和更新日志。在安卓上,如果APK更新使用的签名与当前安装的版本不符,那么APK更新就会失败;虽然,这种攻击方式无法将QQ浏览器替换成任意的APK;但是,这种方法可以用来安装新App,通过使用QQ浏览器的名称和图标,诱骗用户安装恶意的APK。

图2-中间人攻击QQ浏览器的更新过程。在左图中,我们可以插入任意的更新日志。在右侧,更新下载完成后,浏览器会提示用户安装愤怒的小鸟APK(攻击者可以将这个App的名称修改为“QQ浏览器”,使用与QQ浏览器相似的图标,从而诱使用户安装这个APK)

目前,由于Google Play商店无法在中国使用,所以中国的安卓用户必须通过其他途径来更新应用。因为无法使用Google Play商店的更新过程,所以,开发者必须自己实现自动更新机制,而这样则会导致程序的更新过程出现漏洞。据称,中国版的Google Play商店会在2016年上线。

0x04 第三部分:分析Windows版QQ浏览器

我们分析的Windows版QQ浏览器是9.2.5478版本,下载于 http://browser.qq.com/。虽然,Windows版的QQ浏览器也是通过WUP请求与服务器通讯,但是,采用了不同于安卓版本的加密方式和加密时间。而且,Windows版本使用了MTEA+MCBC算法来加密WUP请求,这是一种对称加密算法,而不是安卓版本上的非对称RSA算法(WUP响应都是采用了MTEA+MCBC算法进行加密,无论是安卓版本还是Windows版本)。

我们还发现,安卓版本的WUP请求都是发给了 http://wup.imtt.qq.com:8080/,而Windows版本则是向多个URL发送了WUP请求,包括http://qbwup.imtt.qq.com , http://wup.html5.qq.com 和http://wup.imtt.qq.com:8080 。

通过WUP请求来看,Windows版QQ浏览器还会跟踪设备的硬件指纹。这里的硬件指纹指的是下列项目的MD5哈希:

  1. 网络MAC地址
  2. 硬盘序列号
  3. 硬盘型号
  4. 硬盘控制器版本号

比如: md5(“080027B09CC2” + “VB7c666e15-ef97c40b” + “VBOX HARDDISK” + “1.0”)

因为MTEA+MCBC是完全对称的,所以,任何能观察到流量的中间人都可以利用硬编码的加密秘钥,轻易地解密所有的WUP请求。和前面一样,我们监控了浏览器发送的流量并解密了所有的WUP请求。其中有多个WUP请求会泄露可解密的个人信息。下面是我们识别出的一些重要请求,以及每个请求传输的个人信息:

WUP请求发送时间加密程度
devicesniffer.DeviceSnifferHandle浏览器启动时简单加密
login.login浏览器启动时简单加密
qbkpireportbak.stat浏览器启动时简单加密
qbpcstat.stat浏览器启动时简单加密
qbindexblacklist.testUrl在地址栏中发起搜索请求或输入URL时不加密

WUP请求本身是没有加密的,但是其中的WUP有效载荷使用了DES+ECB算法进行加密(一种对称性的加密算法,解密起来很简单),使用的秘钥是“\x62\xe8\x39\xac\x8d\x75\x37\x79 ”。

数据点数据点描述加密程度WUP请求
Hardware fingerprint网络MAC地址,硬盘序列号,硬盘型号,硬盘控制器版本号的哈希不加密login.login qbkpireportbak.stat qbpcstat.stat qbindexblacklist.testUrl
Q-GUIDQQ浏览器使用这个唯一字符串来识别用户身份不加密devicesniffer.DeviceSnifferHandle login.login* qbkpireportbak.statqbpcstat.stat qbindexblacklist.testUrl
Q-UAQQ浏览器使用这个值来识别应用版本和硬件平台的类型不加密login.login qbindexblacklist.testUrl
Machine IP Address用户设备的互联网协议地址简单加密devicesniffer.DeviceSnifferHandle
Machine hostname用户的Windows主机名称简单加密devicesniffer.DeviceSnifferHandle
Gateway MAC address用户计算机上,网关的媒体访问控制地址。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论