主要发现
百度浏览器是微软和安卓平台上的一种网络浏览器,个人用户在向服务器传数据时进行加密,就算加密了也很容易被解密。浏览器更新时可能很轻易地被中间攻击者利用,执行任意代码。
安卓版本的百度浏览器传的个人可识别数据,包括用户的GPS坐标、搜索内容和访问时的URL,这些内容都是没有进行加密的。不仅如此,在传用户的IMEI和附近无线网络列表时也只是使用了简单、易于破解的加密。
Windows版的百度浏览器在传个人可识别数据点的时候也没有进行加密,或者是进行了简单的加密。这些数据包括了用户的搜索词、硬盘序列号模型、MAC网络地址、URL和访问历史,还有CPU型号。
无论是Windows版还是安卓版的百度,都没有使用代码签名来保护软件更新,提高其安全性,也就是说,更新路径上随便一个恶意攻击者都可以让该应用程序下载执行任意代码,这是一个重大的安全风险。
微软版本的百度浏览器有一个功能:可以将一个请求转向特定的网站,这就允许用户可以访问一些在中国被墙的网站。
对百度的全球版本进行分析之后发现,数据泄露是因为百度共享了它的软件开发工具包(SDK),这影响了数百个由百度和谷歌应用商店的第三方共同开发的应用程序,以及中国某个广泛使用的应用商店里的数千个应用。
介绍
百度浏览器是由中国最大的科技公司百度公司开发的,向Windows和安卓平台免费提供。它提供的功能不仅仅是一般浏览器的功能,包括了视频音频下载工具和内置的种子下载。
本篇报告针对百度浏览器在操作过程中是如何管理和传用户数据做出了详细的分析。报告指出,Windows和安卓版本的百度浏览器都有着一定的安全隐患,都有可能泄露个人用户数据,包括用户地理位置、硬件标示符、附近的无线网络、网页浏览数据和搜索词。这些数据的传在两种版本的浏览器中都没有进行加密或是进行了简单的加密,这也就是说,任何攻击者都可以通过手机路径并进行一定的解密手段来获得此类数据。此外,两种版本的应用都没有使用数字签名来保护其软件更新,这就意味着恶意攻击者可以让浏览器下载并执行任意代码。
这份报告是我们之前工作的延续,在此之前我们已经审查了在亚洲流行的移动应用程序的安全和隐私状况。我们之前的研究报告就发现UC浏览器有着类似的问题,这个浏览器是由中国电子商务巨头阿里巴巴公司开发的。那份报告记录了UC浏览器对于用户的敏感信息没有进行加密传,这些信息包括了IMSI、IMEI、安卓ID、无线网络MAC地址、地理定位数据和用户的搜索查询。UC浏览器的安全问题是在 Edward Snowden 泄露出来的文件中确定的,该组织是五眼情报联盟,包括了加拿大、美国、英国、澳大利亚和新西兰的情报机构,他们就是利用这些漏洞来识别用户的。
在过去的工作中,我们已经分析了热门的第三方软件的自动更新机制。我们发现攻击者利用百度浏览器自动更新机制来进行远程代码执行的漏洞和那些第三方软件的漏洞很是相似。
此外,我们也对TOM-Skype和新浪UC信息平台的关键字审查进行了调查,不仅如此,我们还对亚洲流行的手机聊天应用程序进行了比较分析,比如微信、LINE和Kakao Talk。
我们还发布了一份关于移动通信隐私安全问题的概述,标题叫做《 The Many Identifiers in Our Pockets》。对于本篇报告中的一些技术问题来说,那份概述中关于移动技术标示符的说明是个很好的背景介绍。另外,我们还在 OpenEffect上发表了一篇关于健身追踪器上隐私和安全问题的分析。
负责任的披露和通知
我们在2015年10月26日向百度通知了我们的发现和我们发表这份报告的意图。我们表示不会按照国际对于披露漏洞的惯例在刊登前45天通知。百度最初表示会在2016年1月24日发布的更新中解决我们所确定的问题。然而百度发现这些安全问题已经影响了其他的产品,所以他们要求我们推迟到2016年2月14日之后再发表。为了给百度足够的时间来修复所有漏洞,我们同意了。
在这之后,百度表示他们会在2月14日发布Windows和安卓客户端的更新版本。为了确定他们真的解决了问题,我们对两种更新版本进行了分析。分析结果在报告结尾部分的“更新:对百度最新版本的分析”。
我们在2月16日向百度的国际通信主任发送了一封关于百度浏览器安全隐私问题的电子邮件,22日我们收到了回复。
在本报告的结尾附录有我们和百度关于这些安全问题交涉的所有信件。
百度浏览器:简单背景介绍
百度浏览器是由中国互联网巨头百度公司专为Windows和安卓系统研发的浏览器。首次发布是在2011年,主要基于谷歌Chromium,它拥有大量功能,包括集成的视频音频下载工具、内置种子下载和鼠标手势支持。该浏览器是百度提供的许多服务之一,其他还有搜索引擎、大规模的广告平台和百度百科(类似于维基百科)。根据“中国互联网观察”的调查,到2015年,百度浏览器的网民渗透率达到了29.2%。
作为中国占主导地位的高科技公司之一,加上没有来自被屏蔽的谷歌搜索引擎的竞争压力,百度已经成为了中国最常用的搜索引擎。在世界范围网页访问量排名的Alexa名单上,百度排名第四,在中国排名第一。公司2014年的收入是79.6亿美金。
2014年7月,百度和互联网流量管理公司CloudFlare建立了合作,该公司总部设在美国。二者达成合作,利用百度公司的数据中心和CloudFlare的流量管理服务来提供中国网站的访问速度。这项服务被称为百度云加速,主要针对希望加快在中国效率低下、审查严苛的网络中运行速度的企业。本报告的第二部分将介绍了百度浏览器的另一个功能,即对境外特定网站的流量进行代理来提高性能。
技术分析
我们使用逆向工程技术分析了两种版本的百度浏览器。为了分析程序行为,我们使用了机器码、字节码反汇编程序、反编译器和调试器,包括了JD、JADX和IDA。我们还使用了 tcpdump和Wireshark来捕获分析网络流量。
分析分为三部分。第一部分介绍了两种版本的中文版百度浏览器是如何向百度服务器发送未加密或是易破解个人信息的。第二部分描述了百度浏览器Windows中文版的一种特别功能,即对境外特定网站的流量进行代理来提高性能。第三部分讨论了中文版和全球版共有的漏洞,以及有多少漏洞是因为百度软件开发工具包的使用,在其他百度或是第三方应用中都可以找到该工具包。
“易破解”的加密
报告中,在谈到百度浏览器使用的加密的时候我们会用到“易破解”这个短语。在这里,我们来讨论一下我们所说的这句话,以及如何正确执行百度浏览器的加密术。
当我们说加密术是“易破解”的时候,并不是说加密本身的算法是有缺陷或是不安全的(尽管有时候百度浏览器使用的算法的确是这样)。相反的,我们的意思是该算法使用不当。顾名思义,百度浏览器的分析师可以利用该算法编写一个解密工具。
加密数据有两种基本方法:对称加密或是非对称加密。对称加密(如图一所示)相比于非对称加密的优点是加密速度快。缺点就是只要你知道使用的算法和某个键,你就能破解任意的密码。利用简单的算法,做到这点易如反掌。当加密术只使用了对称算法的时候,只要对程序稍加分析就可以写出一个破解工具来。
像RSA这样的非对称算法(如图二所示)就是被开发来解决这一问题的。虽然这种算法明显慢于对称算法,但优势就是用于解密的密钥不同于加密密钥。这两个密钥必须是数学相关的,通过算法设计生成一个密钥对,但是从加密密钥到解密密钥的派生过程要通过复杂的计算。这就意味着一个程序可以使用一个硬编码的加密密钥,但是解密密钥只能保存在收件人那里。虽然数据接收方可以使用保密的解密密钥,但数据仍有可能被窃取,只要解密密钥存在于程序当中,第三方就有可能写出破解工具。
为了改善性能劣势的非对称加密,通常会使用结合了以下技术的对称加密。要想对数据进行加密,会随机生成一对对称密钥来加密数据。然后会使用非对称密钥来加密随机生成的加密密钥。之后被非对称加密的对称密钥和被对称加密的数据会一起发送给收件人。收件人可以使用私人的解密密钥来解密对称密钥,然后再用它来解密数据。因为只有加密密钥是被非对称加密的,其存储空间远小于整个数据,所以这项技术要远快于非对称加密所有数据,因此是结合了两种加密技术的优点。这是网络上使用的加密术的基本技术,比如SSL。
我们之所以说百度浏览器的加密是易破解的,是因为它使用的加密完全是硬编码编写的对称密钥。使用这种办法加密的通信很容易被破解。我们建议百度或是任何希望通过互联网安全发送敏感信息的人使用一个知名并且行之有效的协议来使用非对称加密技术(比如SSL),也不要试图自制加密协议。SSL是经得起考验的协议,解决了许多非专业译电员认为不可能解决的安全问题。
第一部分:个人信息的不安全传送
安卓版本
我们分析了6.2.18.0版本的浏览器,这是从 http://mb.baidu.com/ 下载的。关于不安全的个人信息传送,我们还是发现了一些隐私安全问题。表1总结了通过该应用收集加密或易加密传送的个人数据。
关于安卓版本的收集传个人数据功能,我们发现了以下几个安全缺陷:
A.启动时泄露敏感数据
在应用程序启动时,我们观察到百度浏览器向https://hmma.baidu.com/app.gif 发送的HTTP POST 请求。这个HTTP请求的正文是一个压缩的JSON文件。该文件包含了电话和用户的多种细节,有的是纯文本,有的是加密的。
JSON文件中未加密的字段有:
o:用户操作系统(比如,安卓)
n:百度浏览器版本
w, h:屏幕像素
Gl:GPS位置和最近更新时间
有的字段是用硬编码ASCII编码键的AES+ECB进行加密的
h9YLQoINGWyOBYYk
然后再用Base64编码。这些字段有:
Dd:IMEI编号
Ii:包含手机IMEI编号倒序的字串符和安卓软件版本信息的MD5哈希值
Wl2:范围内所有无线网络列表以及它们的MAC地址和信号强度。
根据硬编码键知识,这些字段很容易被破解。用于解密这些字段的python脚本源代码在这。
B.键入地址栏时泄露敏感数据和地址栏内容
和其他浏览器一样,用户可以在百度浏览器地址栏中入文本来访问一个给定的URL或是执行搜索。以这种方法在地址栏中入文本时,该文本是不进行加密的,只是作为一个有多个GET参数的HTTP请求访问下面的URL:http://uil.cbs.baidu.com/sug/rich
比如说,在地址栏中键入这样的文本“some address bar contents”:http://uil.cbs.baidu.com/sug/rich?wd=some+address+bar+contents&ua=I4Ly8_OLL8_lPvC0tpwbqkrywN0sCFzKkhF6q9pvANIr5wj0_hHQNgCcvCgnhvId_OXNiyJuvNvrCUdsB&cuid=ga2Pfgal2u0ca28Yg8vkugu0-uYBiSiAlP2Nf_8ZS88Pa28g_a2q8_aq28_qa28qA&cfrom=1200a&from=1200a&crp=0&it=0&ctv=2&st=00000000&nw=3g&cen=ua_cuid
这些GET参数包括:
Wd:地址栏内容
Ua:屏幕分辨率、手机型号、安卓版本和百度版本
Cuid:安卓版本信息的md5哈希值和手机IMEI号倒序的字符串
Wd参数值的发送没有加密;ua和cuid参数值的加密很不规范,使用的是很容易被破解的算法,如下所述。UTF8编码的每个32字节都被解释为一个小端字节序列整数,然后循环移位字节到右三位,以及使用硬编码0x2D382324的XOR。最后,生成的32位字段会和下面的自定义64个字符字母进行base64编码:
qogjOuCRNkfil5p4SQ3LAmxGKZTdesvB6z_YPahMI9t80rJyHW1DEwFbc7nUVX2-
典型的base64字母表是这样的:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
利用这些算法和自定义字母表,就可以很容易地破解这些字段,解密这些字段的python脚本的源代码在这里。这种算法由百度浏览器的本机代码在libchiperencoder_v1_3_1_browser中执行(chiper可能是拼写错误,实为cipher)。
C.手机包含了每个页面视图中的敏感数据
在浏览器浏览了某个页面后,会有一个GET请求被发送到这个URL:http://t5.baidu.com/kw
这个 HTTP Referer 标题包含了访问过网页的完整URL,并且没有加密。即便是通过HTTPS进行了常规加密,报告发现其实并没有加密。其 etag GET 参数值是使用有ASCII编码的五位字节密钥的RC4进行加密的:HR2ER
进行加密时,标签包含了许多其他的参数,比如说cuid(含有手机IMEI的倒序值)和许多时间信息(加载网页所需时间和步骤,包括DNS查找、创建链接和加载DOM)。
D.软件更新的不安全检查
当应用想要检查更新时,就会发送一个HTTP请求给这个URL:
http://uil.cbs.baidu.com/update
这项请求含有多项GEL参数,包括上一节提到的被加密的ua和cuid参数。服务器以一种未加密,但是被zlib压缩的自定义二进制格式进行响应。如果有可用的更新,服务器会在响应中包含对更新的描述以及一个APK的URL。百度浏览器会显示这个描述,并询问用户是否需要进行升级。如果用户确认升级,APK文件会进行下载并自动打开,通过典型的安卓用户安装或升级应用的界面进行提示。(如图三)
百度没有用任何的数字签名验证APK文件,所以中间攻击者就可以通过发送特别编写的响应来实施有效攻击。中间攻击者可以发送任意URL给任意的APK文件,然后这个文件和相关描述还是会被呈现给用户。如果APK文件拥有的数字签名和当前安装的应用不符,那么安卓系统不会允许这种文件来升级应用。所以不能用这种技术来用任意的APK文件替换百度浏览器。但是仍旧可以用一个不同的恶意APK文件(使用百度浏览器的名称和标识)欺骗用户安装一个新的应用程序(如图三所示)。
微软版本
我们分析了 7.6.100.2089 版本的微软版百度浏览器,这是从 http://liulanqi.baidu.com/ 下载的。这种版本也还是有一些隐私安全漏洞。表2 总结了通过该应用收集加密或易加密传送的个人数据。
关于微软版本的收集传个人数据功能,我们发现了以下几个安全缺陷:
A.入地址栏时泄露地址栏内容
和安卓版本类似,当用户在地址栏入文本来搜索时,该文本会以HTTP GET请求的形式不加密地发送给这个URL:http://uil.cbs.baidu.com/sug/rich ,地址栏内容会存储在wd参数值中。
B.以一种易破解的协定和百度服务器通信
我们还观察到,在应用程序启动和浏览时,百度浏览器会向 *.br.baidu.comdomain的各子域发送多个HTTP POST请求。这些POST请求的主体始终坚持以这种特定的形式:标题加上加密的有效负载。标题是没加密的两个字符串。第一个是浏览器的GUID,这是这些参数的哈希值:
1、硬盘序列号
2、硬盘型号
3、硬盘控制器版本
4、网络MAC地址
5、BDM字符串
再加上#字符,比如md5(“VBf952409b-973833b1#VBOXHARDDISK#1.0#080027f2c8cf#BDM”).
第二个字符串是浏览器的SupplyID,是HKEY_LOCAL_MACHINE\SOFTWARE\Baidu\BaiduBrowser\SupplyID的检索值。这可能是与浏览器版本相关的注册表。
加密的有效负载,在解密时包含使用谷歌协议缓冲区(也称为protobuf)的序列化数据。这种数据是用一种改编的TEA密码进行加密的,我们称为MTEA。百度用MTEA使用的密码模式块是CBC的一种非标准修改,叫做MCBC。(见图四)
为了加密解密所有的protobuf信息,百度浏览器使用含有下列硬编码ASCII密钥的MTEA+MCBC:vb%,J^d@2B1l’Abn。使用的都是零字节初始化向量。用于解密这些请求的python脚本源代码在这里。
C.手机里含有每个浏览界面信息,包括硬件序列号
我们解密了浏览器发出的protobuf请求,发现这样的请求(我们称作Page Report请求)会发送用户浏览的每个界面,包括HTTP和HTTPS界面,还有界面和用户的下列信息:
1、界面的完整URL
2、界面的HTTP状态代码
3、界面的HTML标题
4、浏览器存储网络跟踪器的域名(名叫BAIDUID)以及跟踪器的内容(百度使用这个名称的网络跟踪器)
5、机器的CPU型号
6、机器的硬盘序列号
7、文件系统序列号
8、机器的网络MAC地址
9、浏览器的GUID
D.对软件更新的不安全审查
当浏览器要查找更新时,会发出一个protobuf请求,我们称之为 Update Info 请求,这是为了获得百度浏览器的最新版本。加密的响应会包含最新发布的版本号、升级的描述、升级到最新版本的URL和文件的md5哈希值。这个可执行文件没有受到任何数字签名的保护,只在加密的请求中有md5哈希值。通过加密并发送protobuf响应,任何的中间攻击者都可以向任何的可执行文件和其md5哈希值中发送URL,这样会导致浏览器下载执行任意代码。
E.更新域列表中的网站会触发代理
浏览器启动时,它会发送一个我们称之为代理信息请求的protobuf请求。在解密该请求时,包括了不同资源的版本号码,这些资源和百度自动代理的境外网站有关,这在本文的第二部分有具体的解释。如果服务器确定这些资源中有需要更新的部分,protobuf响应中会包含资源的最新版本或是最新版本的链接,一起的还有新版本的MD5哈希值和用于解密的密钥。
第二部分:国外网站代理
中国的网络用户面对的是世界上最严格的互联网审查制度之一。在中国最有名的审查制度可能是”长城防火墙“,这是一种网页过滤的综合体系,阻止中国境内对禁止访问内容的访问。因为这种系统限制中国网络用户对境外网页内容的访问,很多用户都在寻求方法来规避这种审查。其中一种方法就是使用国际代理,它会掩盖和重定位网络流向来逃避检查。
除了中国审查制度规定对于信息的访问限制,长城防火墙还会在跨境传时表现出明显的低效和慢速。代理服务器可以绕开这些网络瓶颈来提高性能。
我们对于百度浏览器Windows版的分析表明,该软件有一个功能,可以自动将请求代理到境外某些网站。百度在其网站中宣传了这种服务,并描述了潜在的性能改进。(见下图)
除了可以提高性能,我们还发现这种代理可以允许访问一些被禁止的网站,比如www.wordpress.com。
kv_auth 资源
该资源包含了不同代理服务器的信息。如果浏览器版本没有更新,那么在代理请求的响应中会包含新版本。资源中含有代理域的md5哈希值,每个哈希值含有用户名和密码salt,这会用于计算获得代理的用户名和密码,这会在之后进行解释。
目前的列表含有13个条目;然而,因为只有哈希值,所以我们还不能用这个列表要求代理的完整目录。
fg_pac 资源
该资源包含了测试代理网站的标准。同样的,如果浏览器不是最新版本,在代理信息请求的响应中也会包含新版本的下载文件,以及该文件的md5哈希值和加密密钥。目前提供的URL是http://dlsw.br.baidu.com/odin/201509/808996d05fb8fbb43ab4db44a5429058.e。
我们有上述文件的解密版本,以及用来解密的脚本源代码。值得注意的是,由于在URL的文件名是文件内容的md5哈希值,对该文件的任何更新版本都不会是同一个URL,所以不能用上面的URL来跟踪更新。
解密时,此文件是一个代理服务器自动配置或是PAC文件,里面是JAVA代码,用来确定哪些是代理网站的,或是具体使用那个代理,以及是否用HTTP或是HTTPS与该代理服务器进行通信。
kv_report 资源
该资源用于确定是否访问会向百度发送额外信息的代理网站。同样的,最新的版本会包含在响应中。此资源还包含域的列表,如果查看的网页和其中之一匹配,浏览器会另外发送一个加密的protobuf请求。我们在前面描述过网页的请求,这些请求包括:
1、网页的完整URL
2、网页的HTTP引用字段
3、网站的IP地址
4、用来指向网页的HTTP重定向列表
5、网页DNS查询时间、TCP连接时间、SSL连接时间以及完整的请求时间
6、是否使用了代理网站
分析
我们编写了一个python脚本,该脚本会进行有身份验证的代理并下载任意URL请求。首先,我们用它来测试百度是否会访问 fg_pac文件之外的网站。我们发现两个代理服务器都显示出页面错误,表明访问受控制。我们用一个中国VPS对Alexa前100排行榜进行了测试,发现了46个没有出现在fg_pac文件的额外域可以通过这两个代理服务器访问。
第三部分:其他百度产品和第三方应用中的漏洞
为了确定百度浏览器中敏感信息的泄露是否会通过共享的代码机制等方式感染到其他的百度产品,我们进行了初步调查。百度为微软和安卓两种版本的浏览器都开发了全球版,关于该版本的具体分析在下面。我们发现安卓版本浏览器中泄露敏感信息的这个漏洞作为分析软件开发工具包(SDK)的一部分不仅存在于百度其他安卓产品中,还存在在大量的第三方应用中。
结论
许多情况下,移动设备会在不向用户提供任何通知的情况下生成、收集和传种类繁多的个人标示符和用户数据。关于这一主题,我们题为《The Many Identifiers in Our Pockets》的论述重点介绍了与收集传标示符有关的风险。
本篇报告中提到的问题引起了人们对于百度浏览器用户个人隐私安全的广泛关注。大量的标示符和数据点都是使用易破解的加密术进行传的。
如果个人数据不使用正确的加密手段传,很有可能导致用户数据遭到监视。其中可能包括用户的ISP、无线网络运行商等。更可怕的是,中间攻击者解密你进行加密的通信,这种拦截会暴露你的地理位置等信息。如果用户使用这种应用程序进行含有敏感信息的通信,那么这样的信息泄露将会是致命的。
人们对于百度收集存储用户数据的方式也产生了一定的质疑。向百度这样提供网络服务的大公司,需要遵循中国法律来保护数据的。网络公司通常是收集这些数据来进行更有效的日常服务的,那为什么百度浏览器会收集传如此大量的敏感数据点?这还不得而知。
除了会泄露用户敏感信息之外,两种版本的浏览器都没有使用代码签名,这允许攻击者强制应用程序下载执行任意代码。
与百度的交涉
我们在2016年2月16日像百度发送了信件,告知百度我们确定的额外安全漏洞,并且说明我们会公开他们的回复。
百度在2月22日做出了相关回应。