X41浏览器安全白皮书 Web安全部分翻译

X41最近发布的浏览器安全handbook, 提到了浏览器的许多方面, 其中11章是与Web安全有关的部分, 主要是当前浏览器的基本防护机制的科普(SOP, CSP), 以及HTML5新引入的特性和技术会带来的安全隐患

我们开始重点考虑浏览器在Web安全中的同源策略, 端口禁止, 内容安全策略(CSP)以及一些HTML5的特性等方面, 因为新功能每年都会出现, 这里不会分析得很全面, 我们(X41)会主要考虑一些高安全风险的特性

在我们开始分析这些特性前, 理解IE浏览器和其他两个浏览器的区别是非常重要的: IE浏览器是唯一一个提供向后兼容的浏览器, 并且还兼容一些古老的技术例如VBScript和VML, 虽然这些功能默认被禁止了, 但是能在32位的IE浏览器中通过降低文档模式来开启:

<meta http-equiv="X-UA-Compatible" content="IE=9" />

在网页的头部添加上面这个元标签可以在IE中启用VBScript和VML, 并将文档模式降低到IE9

一些旧的技术能够降低已经在高文档模式渲染好的页面为低文档模式, 例如iframes, 但这些已经不再能够使用, 这意味着要将IE降低文档模式需要服务端返回的内容中要有一个元标签或者是一个X-UA-Compatible的返回头. IE浏览器的这个特性意味着如果在VBScript中发现了新的漏洞, 那么只要将IE的文档模式降低到能够使用VBScript的版本即可在IE浏览器中触发漏洞, 2014年发现的一个VBScript的漏洞将受影响的IE版本从3个提高到112个, 这是一个经典的例子可以说明一些古老技术的使用可以让攻击者轻松很多, 因为同样的漏洞会影响许多不同的浏览器版本, Chrome和Edge不支持向后兼容的模式, 因此不会出现这样的问题.

同源策略

同源策略(SOP)限制不同源之间的网页的互动, 其中被定义为由协议, 主机名和端口的唯一组合, 如果这三个属性中有一个不相同那么就不是同源, 而如果资源的提供者与接受者拥有相同的源, 那么就可以无限制的进行交互.

SOP保护一个网站的数据不会被另一个网站检索和修改, 例如,除您的在线电子邮件网站之外,您访问的任何网站都不能读取您的电子邮件或使用您的帐户发送电子邮件.

大多数SOP的绕过都是由UXSS带来的, 一个UXSS允许攻击者将javascript嵌入任何网站, 一些情况下SOP对javascript的限制十分严格, 但是仍然可以用多个漏洞相组合来绕过SOP, 他们可以用来窃取用户的信息或者控制用户访问任何网站, 特别是当用户已经登录到当前网页的情况下.

当存在UXSS缺陷的时候, 攻击者可以影响任何源, 即使那个源并没有XSS漏洞, 就像SOP所期望的那样, 利用这样的缺陷(UXSS), 攻击者可以忽视SOP从而攻击任何源, 例如一些社交站点, 攻击者可以窃取网站上所储存的所有用户信息, 并更改受害者在网站上的设置或者发送消息. 利用类似BeEF的工具甚至能将浏览器变成一个有效的代理

我们所分析的所有浏览器都有绕过SOP的历史, 并且其中仍有运行着受影响的版本

为了比较这些浏览器, 我们定制了一个模仿不同源的Ruby脚本, Main用于加载测试用的JS代码, Second源则用来存储从第一个源加载的内容, 此外, 一些SOP绕过可能依赖重定向或者是response中的content-types头, 因此, 对服务端的完全控制对分析是十分必要的.

一个有趣的SOP绕过是由Manuel Caballero发现的至今仍然影响着Edge15.15063

这个针对SOP的绕过创建了一个源为空白的指向data伪协议的iframe, 并且其中渲染了一个refresh的meta标签, 这利用了一个事实是大多数源(twitter也在其中)会渲染一个空白源的iframe, 从而导致可以被利用一个空白源的页面来执行JS代码, 例如twitter有一个空白源的iframe为dm-post-iframe POC:<html> <body> Make sure you have a tab open on Twitter using Edge 15.15063 <br><br><br> <iframe width="300" height="150" src= ⌋ → "data:text/html,<meta http-equiv=refresh content=%220;url=data:text/html,<br><br>about:blank origin. \ click the button below:<br><br><input type=button onclick= \ window.open('javascript:alert(parent.document.domain)','dm-post-iframe') \ value='about:blank on Twitter PoC' />%22>"></iframe> </body> </html>

Chrome并不会收到影响因为他的SOP正确执行, 并且会抛出一个跨源(协议不同)的错误

SOP绕过漏洞通常是非常具体的逻辑错误,很难直接进行比较。因此,我们(X41)决定比较不同厂商对SOP绕过的处理方式, 由Manuel Caballero发现的至今仍能使用的SOP绕过在Edge和IE上的数量比Chrome要多, 这代表谷歌的处理更好, 另外有一些其他的绕过方式来源于JS框架的漏洞, 并且不能由浏览器修补, 它们会影响所有的浏览器.

端口限制策略

端口限制策略是现代浏览器的一种安全措施, 拒绝连接到非标准的TCP端口, 它不允许对特定端口的请求, 比如21, 25, 110, 143, 试图阻止浏览器向Telnet, 简单邮件传输协议(SMTP), Post Office协议, POP3和Internet消息访问协议(IMAP)等服务发出请求. 这些都是基于基于ASCII的协议, 比如HTTP协议, 这意味着如果给定的服务器实现对错误有足够的容忍度, 那么可以在HTTP POST请求的明文正文中封装实例IMAP命令. 这一技术也被称为协议开发, 在浏览器安全的Handbook5中已经详细讨论过。

为了测试浏览器对端口限制的程度, 一个定制的Ruby TCP服务端监听一个端口, iptables用来转发任意端口的流量给Ruby处理, 用几行JS脚本循环执行从1-7000端口的GET请求, 该脚本的代码可以从附录A中找到.

在对浏览器的测试中, 对端口限制的实现是不一致的, Edge和IE只禁止了8个端口, 而Chrome限制了63个端口, 因此, 微软的浏览器更加宽容, 这意味着想通过JS进行内网操作的攻击者更喜欢Edge和IE, 因为可以探测到更多的端口, 没有理由为什么浏览器需要连接X11, IRC, SSH或者其他的端口, 如IRC NAT phinng6这样的漏洞已经被发现许久了, 除非在浏览器上实行缓解措施, 否则现在仍然可能被滥用, Chrome采用了一个更安全的方法, 它禁止的端口数量是微软的浏览器禁止数量的八倍.

内容安全策略(CSP)

CSP由HTTP响应头设置, 用来限制在网页中加载的脚本来源, 这可以减少XSS和其他形式的数据注入的危害, 它通过严格的白名单来限制哪些来源的脚本能够加载, 由于它主要用来防御XSS, 所以内联代码和一些危险的函数调用(例如eval)是默认不允许的, 在下一章中有一些浏览器扩展的例子, 它们确实可以缓解CSP的限制, 但是对于一些开发者来说这是非常坏的一个习惯, 下面一个例子是一个较为宽松的CSP策略, 它只允许加载来源是白名单中网页的脚本, 并且允许eval函数的调用, 同时对象不能从不同源的脚本中加载

script-src 'self' 'unsafe-eval' https://api.penitenziagite.club; object-src 'self'

历史上出现过很多次对于CSP的绕过, 同时, 在2017年四月的OWASP 20177上, Michele Spagnuolo 和 Lukas Weichselbaum 像google提交了8个CSP绕过的案例

我们(X41)对这些CSP绕过的方法进行了复现, 发现13个方法中有4个仍然能在Chrome中使用, 9个仍能在Edge中使用

值得注意的是, 其中一些漏洞依赖JS的内部框架, 这些框架在设计时并没有安全的评估DOM中的安全性, 所以在浏览器层面去修复是困难的, 此外, Edge和Chrome之间的区别大多是由于Edge缺乏对一个新的CSP指令(strict-dynamic)的支持

以下的CSP绕过案例仍能在Chrome上实现:Aurelia(2017-03-21) Polymer1.7.1 Underscore1.8.3/backbone Dojo1.12.2

这可以证明CSP仍然不是现代浏览器对抗XSS的灵药

HTML5特性和新的浏览器技术

自从2011年发布了浏览器安全白皮书后, 新的技术已经出现并且已经应用到浏览器当中, 这些新技术提供了新的攻击面并且可能暴露更多的危险功能, 例如Web/Object(RTC)有一个设计上的安全问题, 会导致内部IP地址泄露, WebRTC服务需要内部IP以确定NAT的类型, 以及后续进行NAT遍历的方法

如我们在下一节讨论的那样, WebRTC允许攻击者可以在不经过与用户交互的情况下获取所有的内网ip, 甚至包括tun/tap这样的虚拟接口, 这样的技术对隐藏自己身份或者是用JS进行内网渗透的攻击者非常方便, 由于java的运行环境(JRE)的改变以及现代浏览器中Click-to-Play插件的改变, 以前利用未签名的java applet或者其他的浏览器插件进行攻击的方法已经不再可行, 但是浏览器中增加的新特性可以帮助攻击者完成更复杂的攻击, WebRTC和Service Workers是两个例子

新特性带来了更多的代码, 因此也带来了更多的安全问题, 当然这并不意味着那些拥有较少新特性的浏览器(如IE)会更安全, 或者说Chrome比Edge更不安全因为它支持了更多的新特性, 以下我们分析的新特性都有潜在被攻击的可能性

Service Workers

WebRTC和ORTC

浏览历史管理

WebAssembly

Handling of Application Level Invalid Actions and Error Cases

Arithmetic Overflows and Truncation

WASM Mitigations and Exploit Primitives

WebGL

Web Notifications

Battery Status API