
浏览器是重要的互联网入口,一旦受到漏洞攻击,将直接影响到用户的信息安全。作为攻击者有哪些攻击思路,作为用户有哪些应对手段?在本书中我们将给出解答,带你了解浏览器安全的方方面面。本书兼顾攻击者、研究者和使用者三个场景,对大部分攻击都提供了分析思路和防御方案。本书从攻击者常用技巧的“表象”深入介绍浏览器的具体实现方式,让你在知其然的情况下也知其所以然。
序 人类第一次大规模的接触互联网,就是从PC上的浏览器开始的。从它的诞生开始,浏览器安全就成为一个极其重要的安全领域。浏览器内核、网页、钓鱼、XSS,包括让人又爱又恨的网银插件,这些都和浏览器安全息息相关。随着移动互联网和互联网+时代的到来,浏览器已经变成了桌面端的互联网第一入口,而在移动端,虽然浏览器的入口地位受到了手机APP的分流,但依然是最重要的入口之一。浏览器安全问题,变得更加错综复杂。比如iOS越狱,用户只需要简单地访问一个特殊网页就能自动完成,也是利用了iOS Safari的安全漏洞。随着HTML5和HTTP 2标准的先后定稿,以微信、手机QQ为代表的开放平台迅猛发展,使得越来越多的HTML5内容在APP中的WebView里呈现。这些APP同样面临着广义的浏览器安全威胁。 无巧不成书,认识钱文祥也是缘于浏览器。2013年,在乌云上偶然看到几个关于浏览器漏洞的报告后,我在QQ上联系了他。通过几次交谈,发现他是一个对安全技术尤其是浏览器安全技术非常痴迷并且有想法的人。所以,我邀请他来腾讯浏览器产品部工作,负责PC浏览器的安全工作。他在浏览器安全方面的经验,很好地保证了QQ浏览器的安全性,得到了团队的一致认可。此外,他还发现了Microsoft IE的和Google Chrome浏览器的一些漏洞,并得到了这两家公司认可。 当拿到书稿后,我不由地一震。他在工作之余,系统地总结和归纳了自己这些年在浏览器安全方面的一些知识,并深入浅出地呈现出来。这些知识可以给希望了解和学习浏览器安全的人提供一份有益的营养套餐。 浏览器安全,其实涵盖了客户端、web、server等,给初学者一种雾蒙蒙的感觉,同时也给互联网罩上一层迷雾,就好似北京那令人百感交集的雾霾。希望《白帽子讲浏览器安全》一书,能像前几天的一场北风,吹走那迷雾,给读者带来一片清澈的蓝天。 边超,腾讯T4专家,PC浏览器技术负责人 2015/12/8 前言 2015年3月,我在乌云知识库中开始连载IE安全系列的文章(ID:blast)。博文视点的张春雨先生找到我,希望我写一本浏览器安全的书。 此时的浏览器市场已是一片红海——作为用户访问互联网的入口,无论是桌面还是移动端,各厂商争夺浏览器份额的形势,犹如多年前微软和网景的份额大战。这个过程中,他们留给互联网许多实用功能,制订了许多规范。 这些功能中,有一些也留下了不少安全隐患。我正好在从事浏览器安全工作,在日常问题处理中深知浏览器安全现有的资料非常分散,最大的问题便是不少人虽然兴趣浓厚,但是却不知道从哪里开始研究浏览器安全。 我的浏览器安全历程 1999年接触计算机开始,我就对这个庞然大物产生了浓厚的兴趣。2001年家中购买了电脑之后,由于最初的两年电脑没有联网,于是编程便成了我的另一个兴趣爱好。自学了几年编程之后,一直想做出一个有用的工具。 2007年加入卡饭论坛开始的那段时间,应当是我和浏览器安全最长时期的接触,我一直活跃在病毒分析板块。由于当时网马猖獗,对病毒分析爱好的我编写了一个自动化网马解码分析工具Redoce并坚持更新了6年,这段经历让我认识了许多志同道合的朋友,也让我掌握了许多病毒以及漏洞的分析技能。 2010年,我就读安徽理工大学信息安全专业,其间参阅了许多前辈的资料。2013年是我第一次尝试由分析转为漏洞挖掘,之后我便沉浸于此,并最终以一个契机加入腾讯QQ浏览器部门。在腾讯,我依然从事浏览器安全研究工作。 浏览器的用户量数以百万、千万甚至于亿计,这样一款处处都会接受用户输入的软件,一旦出现漏洞,产品口碑和用户的信息安全都会深受其害,这是所有产品相关人员和安全研究人员都不想看到的。在对浏览器代码和应用的安全审查和测试过程中,我也总结了许多浏览器安全的“坑”和补救措施,这些内容将在本书内详细叙述。 本书结构 对有兴趣致力于浏览器安全的研究者来说,不知从哪里入手是研究热情的一个拦路虎。我将日常的经验和历史上的浏览器安全事件结合,编写了本书的3篇共12章的内容。希望能够为浏览器安全研究爱好者提供一些参考。 第1篇 探索浏览器安全介绍了从浏览器的用户界面以及浏览器展示网页的整个过程,针对过程中可能出现的问题进行了探讨,详细地介绍了浏览器的特性以及基础安全概念。浏览器的漏洞挖掘和Fuzz工具密不可分,本篇中我们也将介绍Fuzzer的基本理念并制作出一个可用的Fuzzer。 本篇结合了Web安全与浏览器自身特性,就浏览器处理网页内容的原理及引发的安全问题展开讨论,希望能让读者对浏览器安全产生初步的印象,也打消从未涉及浏览器安全的读者的疑虑。 插件和扩展延伸了浏览器的功能,但是也带来了许多安全风险。 第2篇 实战网马与代码调试是过渡性的篇章,我们从插件和扩展安全说起,再通过几个网马的例子,将重点逐渐从Web向二进制调试转移。 插件部分将介绍逻辑漏洞的挖掘,以及在软件制作中规避风险的方法。网马部分则介绍恶意代码的混淆与加密方式,为恶意代码分析打好基础。代码调试部分则从二进制调试工具的用法开始,最后介绍Shellcode的调试。本章难度适中,希望能够带领读者探索浏览器中的二进制代码。 第3篇 深度探索浏览器漏洞对浏览器漏洞知识进行了更深入的挖掘和探讨。我们将从浏览器对网页元素的处理入手,分析网页元素在浏览器内存中创建时的过程并使用调试工具加以分析。我们还将从常见的漏洞入手,分析漏洞的成因并编写一个完整的浏览器漏洞利用程序。至此完成浏览器漏洞研究的最后一步。 编写历程 编写全书时工作繁忙,我每天只能够在业余时间抽出一至两个小时编写文章和调试代码。经历过后深知编写一本书的不易。在编写本书的过程中,我参考了大量资料。编写一本经验总结性质的书籍不仅仅是对自己过往的一个交待,更是为了促进对自己对浏览器认识的提高。如边超先生所言,通过将知识沉淀为文字,博文也好,书籍也好,都是一种重认识和再发现的过程。 在写一本介绍如此宽泛概念的书籍时,能够系统性地布局则是一大要事。在和乌云社区多个有兴趣研究浏览器安全的白帽子交流之后,最终我选择了本书这样一种先Web后底层深入的布局。但是,列大纲的时候我就发现,浏览器安全中每一部分都可以成为深入挖掘的方向,想在这一本薄薄的书中全部展现也是不切实际的。为了完整地涵盖安全的基础部分,本书挑选的更多是一些典型的例子,我希望通过这些典型例子起到抛砖引玉的作用——因为浏览器安全问题并不是单一因素引起的,更多的很可能是许多异常行为(也就是我们俗称的“BUG”)的组合。 相比于其他计算机科学相关的内容,浏览器安全研究的书籍资料并不多。但是互联网上仍然有许多专业研究人员提供了宝贵的数字资料,在遇到浏览器安全问题时,善用、勤用搜索引擎,是解决问题的一条捷径。 浏览器和浏览器标准的更新换代速度极快,在本书编写的过程中,就有许多新的浏览器标准和新的浏览器防御手段诞生。且本书编写时间仓促,又限于作者自身能力和水平的不足,书中不免会出现疏漏,烦请批评指正或留言宝贵意见。我提供了一个勘误表以及事件提单平台,本书的修订内容将在该平台上发布。平台的地址请见前言结尾的“联系方式”。 致谢 感谢我的公司腾讯科技有限公司和我的同事们,他们都愿意投入到浏览器中,以乐趣为出发点,在团队内部形成积极、友好讨论的氛围。 感谢边超先生为本书作序,边超先生在我开发和研究过程中细致耐心地提供了许多指导和帮助。 同时,也感谢边超、李普君、徐少培、张春雨等先生(排名不分先后)对本书章节布局的非常有建设性的建议。 协助本书内容审核的人员有:毛睿、关乃夫、丁川达、王连赢、李普君、周雨阳、梧桐雨(排名不分先后)等。毛睿先生是我在腾讯工作时的导师,感谢他为我提出了许多宝贵意见。 感谢我的家人,尤其是我的父母在编写本书的时候给予我的无尽的鼓励。 在编写本书时,同样受到了来自许多专家和前辈的指导和鼓励,无论列出与否,都由衷地感谢你们。 联系方式 邮箱:blastxiang@gmail.com 博客:http://nul.pw/ 勘误表:http://nul.pw/issues.html
目录 第1篇 初探浏览器安全 1 1 漏洞与浏览器安全 3 1.1 漏洞的三要素 3 1.2 漏洞的生命周期 4 1.3 浏览器安全概述 5 1.4 浏览器安全的现状 7 1.5 浏览器的应对策略 9 1.6 “白帽子”与浏览器厂商的联手协作 9 1.7 全书概览 10 1.8 本章小结 12 2 浏览器中常见的安全概念 13 2.1 URL 13 2.1.1 URL的标准形式 15 2.1.2 IRI 16 2.1.3 URL的“可视化”问题——字形欺骗钓鱼攻击 18 2.1.4 国际化域名字形欺骗攻击 19 2.1.5 自纠错与Unicode字符分解映射 20 2.1.6 登录信息钓鱼攻击 23 2.2 HTTP协议 24 2.2.1 HTTP HEADER 25 2.2.2 发起HTTP请求 26 2.2.3 Cookie 28 2.2.4 收到响应 29 2.2.5 HTTP协议自身的安全问题 31 2.2.6 注入响应头:CRLF攻击 31 2.2.7 攻击响应:HTTP 401 钓鱼 32 2.3 浏览器信息安全的保障 33 2.3.1 源 33 2.3.2 同源准则 34 2.3.3 源的特殊处理 34 2.3.4 攻击同源准则:IE11跨任意域脚本注入一例 35 2.4 特殊区域的安全限制 37 2.4.1 安全域 37 2.4.2 本地域 37 2.5 伪协议 38 2.5.1 data伪协议 38 2.5.2 about伪协议 40 2.5.3 javascript/vbscript伪协议 41 2.5.4 伪协议逻辑出错:某浏览器跨任意域脚本注入一例 42 2.6 本章小结 43 3 探索浏览器的导航过程 45 3.1 导航开始 45 3.1.1 浏览器的导航过程 46 3.1.2 DNS请求 46 3.1.3 DNS劫持和DNS污染 47 3.1.4 导航尚未开始时的状态同步问题 48 3.1.5 实例:针对导航过程发起攻击 49 3.2 建立安全连接 50 3.2.1 HTTPS 50 3.2.2 HTTPS请求中的Cookie 51 3.3 响应数据的安全检查——XSS过滤器 52 3.3.1 IE XSS Filter的实现原理 53 3.3.2 Chrome XSSAuditor的工作原理 55 3.4 文档的预处理 56 3.4.1 浏览器对HTML文档的标准化 56 3.4.2 设置兼容模式 57 3.5 处理脚本 59 3.5.1 脚本的编码 60 3.5.2 IE的CSS expression的各种编码模式 62 3.5.3 浏览器的应对策略:CSP 63 3.5.4 “绕过”CSP:MIME Sniff 65 3.5.5 简单的Fuzz:混淆CSS expression表达式 68 3.6 攻击HTML标准化过程绕过IE/Chrome的XSS Filter 71 3.7 本章小结 73 4 页面显示时的安全问题 75 4.1 点击劫持 76 4.1.1 点击劫持页面的构造 76 4.1.2 X-Frame-Options 78 4.2 HTML5的安全问题 80 4.2.1 存储API 81 4.2.2 跨域资源共享 83 4.2.3 基于FullScreen和Notification API的新型钓鱼攻击 84 4.2.4 组合API后可能导致的安全问题 87 4.2.5 引入新的XSS 攻击向量 87 4.2.6 互联网威胁 89 4.3 HTTPS与中间人攻击 92 4.3.1 HTTPS的绿锁 92 4.3.2 HTTPS有多安全? 94 4.3.3 HSTS 96 4.3.4 使用SSLStrip阻止HTTP升级HTTPS 97 4.3.5 使用Fiddler对PC端快速进行中间人攻击测试 99 4.3.6 使用Fiddler脚本和AutoResponse自动发起中间人攻击 101 4.4 本章小结 103 5 浏览器扩展与插件的安全问题 105 5.1 插件 106 5.1.1 ActiveX 106 5.1.2 ActiveX的安全问题 107 5.1.3 ActiveX的逻辑漏洞 108 5.1.4 NPAPI、PPAPI 111 5.2 定制浏览器的扩展和插件的漏洞 113 5.2.1 特权API暴露 114 5.2.2 DOM 修改引入攻击向量 114 5.2.3 Windows文件名相关的多个问题 115 5.2.4 NPAPI DLL的问题 116 5.2.5 同源检查不完善 117 5.2.6 Content Script劫持 118 5.2.7 权限隔离失败 118 5.2.8 配合切核策略+本地内部页XSS执行代码 118 5.2.9 下载服务器限制宽松 119 5.2.10 TLDs判定问题 119 5.2.11 经典漏洞 120 5.2.12 中间人 120 5.3 Adobe Flash插件与Action Script 121 5.3.1 Flash的语言——Action Script 121 5.3.2 Flash文档的反编译、再编译与调试 122 5.3.3 SWF的网络交互:URLLoader 124 5.3.4 crossdomain.xml与Flash的“沙盒” 125 5.3.5 ExternalInterface 126 5.3.6 FLASH XSS 126 5.3.7 Microsoft Edge中的Flash ActiveX 130 5.4 浏览器的沙盒 131 5.4.1 受限令牌 132 5.4.2 完整性级别与IE的保护模式 133 5.4.3 任务对象 134 5.5 本章小结 135 6 移动端的浏览器安全 137 6.1 移动浏览器的安全状况 138 6.2 移动端的威胁 141 6.2.1 通用跨站脚本攻击 141 6.2.2 地址栏伪造 142 6.2.3 界面伪装 143 6.3 结合系统特性进行攻击 144 6.3.1 Android一例漏洞:使用Intent URL Scheme绕过Chrome SOP 144 6.3.2 iOS的一例漏洞:自动拨号泄露隐私 146 6.3.3 Windows Phone一例未修补漏洞:利用Cortana显示IE中已保存密码 147 6.4 本章小结 149 第2篇 实战网马与代码调试 7 实战浏览器恶意网页分析 153 7.1 恶意网站中“看得见的”攻防 153 7.2 恶意脚本的抓取和分析 155 7.2.1 发现含攻击代码的网址 156 7.2.2 使用rDNS扩大搜索结果 156 7.2.3 下载攻击代码 157 7.2.4 搭建测试环境 158 7.2.5 初识网马反混淆工具 158 7.2.6 恶意脚本中常见的编码方式 159 7.3 一个简单的挂马代码的处理 169 7.3.1 快速判断挂马 169 7.3.2 JS代码的格式化 170 7.4 更为复杂的代码处理:对Angler网马工具包的反混淆 170 7.4.1 Angler EK的特征 170 7.4.2 推理:找出代码中的“解密-执行”模式 172 7.4.3 检证:确定“解密-执行”模式的位置和方法 175 7.4.4 追踪:使用浏览器特性判断用户环境 179 7.4.5 利用漏洞CVE-2014-6332发起攻击 188 7.5 本章小结 190 8 调试工具与Shellcode 191 8.1 调试工具的用法 191 8.1.1 调试符号 191 8.1.2 WinDbg的用法 192 8.1.3 IDA的用法 195 8.1.4 OllyDbg的用法 199 8.2 与Shellcode的相关名词 201 8.2.1 机器指令 201 8.2.2 控制关键内存地址 203 8.2.3 NOP Slide 204 8.2.4 Magic Number 0x8123 205 8.3 Shellcode的处理 205 8.3.1 实现通用的Shellcode 206 8.3.2 调试网马中的Shellcode 212 8.4 本章小结 218 第3篇 深度探索浏览器漏洞 9 漏洞的挖掘 221 9.1 挖0day 221 9.1.1 ActiveX Fuzzer 的原理 221 9.1.2 使用AxMan Fuzzer来Fuzz ActiveX插件 222 9.1.3 现场复现 225 9.2 DOM Fuzzer的搭建 229 9.2.1 搭建运行Grinder的环境 230 9.2.2 Fuzzer的结构与修改 231 9.2.3 现场复现 232 9.3 崩溃分析 233 9.3.1 哪些典型崩溃不能称作浏览器漏洞 233 9.3.2 ActiveX崩溃一例 236 9.3.3 IE11崩溃一例 238 9.4 本章小结 244 10 网页的渲染 245 10.1 网页的渲染 245 10.1.1 渲染引擎 245 10.1.2 DOM结构模型 247 10.1.3 IE解析HTML的过程 249 10.1.4 IE的Tokenize 251 10.1.5 Chrome解析HTML的过程 253 10.1.6 Chrome的Tokenize 254 10.2 元素的创建 256 10.2.1 IE中元素的创建过程 256 10.2.2 Chrome中元素的创建过程 257 10.2.3 元素的生成规律 258 10.3 实战:使用WinDbg跟踪元素的生成 260 10.4 实战:使用WinDbg跟踪元素的插入 263 10.5 实战:使用WinDbg跟踪元素的释放 264 10.6 本章小结 266 11 漏洞的分析 267 11.1 分析IE漏洞CVE-2012-4969 267 11.1.1 崩溃分析 268 11.1.2 追根溯源 270 11.2 分析JScript9漏洞CVE-2015-2425 271 11.2.1 跟踪漏洞 275 11.3 Hacking Team的Flash漏洞CVE-2015-5119 分析 276 11.3.1 静态阅读:成因分析 276 11.3.2 Vector的覆盖过程 278 11.4 本章小结 279 12 漏洞的利用 281 12.1 ShellCode的编写 281 12.2 CVE-2012-4969 的利用 284 12.2.1 DEP/ASLR绕过 287 12.3 CVE-2015-5119的Vector 296 12.4 本章小结 301 附录 303 附录A IE(Edge)的URL截断 303 附录B IE的控制台截断 304 附录C 表单中的mailto: 外部协议 305 附录D 危险的regedit: 外部协议 306 附录E IE XSS Filter的漏洞也会帮助执行XSS 307 附录F 更高级的策略保护——CSP Level 2 308 附录G 更快的执行速度——JScript5 to Chakra 309 附录H Chakra的整数存储 310 附录I 安全实践 311 参考资料 315
钱文祥(常用ID:blast),专职浏览器安全研究。安徽理工大学毕业后就职于腾讯科技(北京)有限公司,专注于PC浏览器安全研究和安全相关功能的开发。活跃于多个漏洞报告平台,曾报告过数十个安全漏洞,涵盖IE、Chrome及国产定制浏览器。参与过多个浏览器安全相关以及漏洞挖掘的项目,维护有网马解密工具Redoce。