WEB安全第十四课 其他的安全边界 |
在前里谈到的基于源的内容隔离策略,以及随之而来的运行环境的继承机制、页面的跳转逻辑,一起构成了浏览器的安全模型。这套模型既费解又脆弱,而且也并不完整:还有诸多有趣的犄角旮旯区域,它们已经完全不属于源机制的控制范围内了。
仅仅调整之前讨论过的那些安全机制,不可能解决这些边缘领域里的安全风险。实际上,还得在此之外再从头创建一套额外的安全边界,尽管这套机制也不可能做到很完美。 譬如,这个新的边界机制必须进一步限制某些恶意网页控制URL跳转的行为。 👮♂️🧥⚒☠🤟 本章主要研究同源模式之外的一些显著漏洞,以及浏览器厂商们是如何应对这些问题的。 ![]() 1. 跳转到敏感协议 🥷👓📱😷👍 过去,浏览器厂商认为任由互联网页面以file:协议的方式打开用户的本地文件,或打开一个指向特权资源如Firefox里about:config页面的新窗口,都属于合理的情况。毕竟,这时候发起跳转的页面和最终的目标页面肯定不会是同源的,因此,这么做也就不会导致对敏感数据的直接访问。 多年来,基于这种想法,浏览器都允许这些跳转。好嘛,这个决定实际上不但非常令人困惑,而且非常危险。因为很多程序包括浏览器自身,都会把来自互联网的各种内容存放在本地文件系统里;最常见的例子就是临时文件和缓存文件了。 👵🛍📟😔👍 在许多情况下,攻击者对创建此类文件以及里面的内容,都有某种程度的控制权,而如果文件是创建在一个可预测的路径里,之后浏览器又能正确打开这个file:URL地址的话,攻击者就可以在这个被控制的源里,执行自己的攻击数据,进而得以访问硬盘上的任意文件,甚至还能访问互联网上的任意站点。 各种特权或由内部处理的URL都有可能带来颇为重大的安全隐患。如能直接跳转到类似about:config(Firefox)这样的页面,意味着不但有可能利用到特权脚本的潜在漏洞(对这种漏洞浏览器开发商当然是难辞其咎的),而且能导致系统被攻破,因为URL字符写法上的相近,所以浏览器会天真地把about:config和about:blank当做同源页面。 从过往的血泪经验里吸取了教训之后,现在的浏览器通常根据以下三类URL策略进行跳转控制: 🖕🎠🍟🚷🪰 • 完全不受限制 这个类别包括各种真实的网络协议,例如HTTP、HTTPS和FTP;大多数被封装过的伪协议,如mhtml:和jar:,还有各插件及外部程序注册的各种第三方协议。跳转到这些协议不受任何限制。 • 部分受限 这个类别包括几种在安全上比较敏感的协议,如file:和特殊的伪URL如javascript:和vbscript:。并没有完全禁止跳转到这类协议,但要遵从额外的基于策略的安全检查。例如,通常只允许从一个file:页面去访问另一个file:地址,后者需要以手工的方式打开. 🧥🗡😪🤙 • 完全禁止 这个类别包括about:、res:和chrome:这些特权页面以及类似的浏览器相关命名空间。普通的非特权HTML页面在任何情况下都不能跳转到这些协议的页面。 #f472: 2. 访问内部网络 👴🩴📡😛👎 前面这些敏感协议引起的麻烦还仅是更严重问题的前奏,因为在某些情况下,同源策略的创建者们也有疏漏之处。问题在于,源的概念是来自DNS域名的,它和实际的网络边界并没有什么关系——更无法区分网络边界在不同时间段里的变化。即使有网络防火墙阻止了攻击者直接与内部网站进行交互,但恶意脚本仍然有可能获得受害者本地网络里内部站点的同源访问权限。 这些攻击至少有以下3个明显的作用点。 a.对源的渗透 🙏🌦🌰♂🦕 当用户接入有问题的网络——例如机场或咖啡店里未加密的无线网络时——潜伏在该网络里的攻击者就有可能诱使受害人的浏览器打开类似 http://us_payro11/ 这样的URL。成功后,攻击者就可以给用户提供一个假冒的站点内容。令人担心的是,如果用户之后再用同一个浏览器去访问公司的内部网络,那之前的注入内容就会和真实的 http://us-payroll/ 网站具有同源访问权限了,并且拥有了用户的全局身份信息。 有好几种办法使注入的内容具有持久性。最基本的一个方法是攻击者简单地给用户访问过的每个页面都提供一个隐藏的http://us-payroll/ 子框架,期望用户在不用时会直接把笔记本合起来,使得浏览器仍然保持运行的状态只是暂时被挂起,当笔记本被带进公司网络里会继续使用。 ✌🚤🍽🆘🐕 另一个技术是缓存污染(cache poisoning^创建持久的缓存对象,浏览器会使用缓存的内容而不会重新从目标站点获取更新。还有其他若干种更隐晦的做法。 b.域名重绑定 它不算特别严重,但会比较容易碰到。简单来说,由于同源策略只查看主机的域名而非IP地址,假设攻击者持有bunnyoutlet.com这个域名,一开始返回给用户的域名查询结果为外部IP,如213.134.128.25,然后切换为内部保留地址,如10.0.0.1。从这两个来源加载的页面会被认为是同源的,使攻击者得以和受害者的内部网络进行交互。 🤳🏦🎂♀🐟 让人稍许放心的是,这种情况下受害者通常不会向目标站点发送自己的全局身份凭证:因为从浏览器的角度来说,它仍然是在和bunnyoutlet.com交互,而非前文说的那个内网的us-payroll站点。然而,攻击者还是有可能利用这个方法窥视内部网络和并尝试暴力破解找出可利用的身份或寻找其他的系统弱点,也会带来一些困扰。 c.简单地利用XSS或XSRF漏洞 🧒🧢📷🤔👃 即使撇开同源策略不谈,仅仅是能跳转到内部网络的URL就意味着攻击者有可能尝试(可能是盲猜性质)针对已知或可能有的漏洞来攻击运行在本地的软件。由于通常认为内部应用是不会被恶意用户访问到的,所以开发和维护的标准与外部网站的会不太一样。 此类问题的一个瞩目例子就是多年来发现了无数家用路由器的内部Web管理界面里的漏洞,产品覆盖 Linksys(Cisco)、Netger、D-Link、Motorola 和西门子等厂家。在极端的情况下,通过这些应用的跨站请求伪造漏洞,有可能使攻击者得以访问这些路由设备,拦截或窜改经由这些设备的所有网络流量。 到目前为止,浏览器安全机制和网络分区(network segmentation)之间的割裂仍然是浏览器开发领域里一个悬而未解的问题。若干种浏览器都会把DNS响应缓存一段预定时间,来限制DNS重绑定的影响——这种做法叫DNS pinning(域名锁定)——但这种防护也并不完美,仍然留有攻击的余地。👴💄⚔🙃🦴 注意:和往常不同,IE浏览器在这方面的安全防护领先了一步。微软IE浏览器的用户只要在本地Intranet网络的区域设置选项里,把其中某条写得甚为玄妙难懂的“特权较少的Web内容区域中的网站可以定位到该区域”设置改为“禁用”,就能得到一定程度的防护。但遗憾的是,IE浏览器的区域模型也存在某些出人意表的问题。 #f472: 3. 禁用的端口👳👔🛋🥱👂 安全研究人员以前就曾警告过,浏览器可以跨域提交几乎不受限制的数据,其中一种做法是通过<form method="POST" enctype="text/plain">的表单提交,这可能会干扰到某些具有容错能力的非HTTP服务。 例如主流的邮件传输协议SMTP:当SMTP碰到傻乎乎的浏览器时,由于无法识别浏览器发过来的信息,大多数SMTP服务器通常都会耐心地忽略掉浏览器最先发过来的前面几行HTTP头域,最后再把HTTP请求数据体里的内容当成SMTP命令执行。所以实际上浏览器甚至能用作转发垃圾邮件的代理。 ✊🌕🦞🆘🐢 在前面提到过的一个相关但未做深人讨论的问题,就是浏览器和目标Web应用域名上的非HTTP服务交互时,攻击者可以诱使浏览器解析某些由非HTTP服务返回的内容,认为这些内容只是以HTTP/0.9协议传输的HTML网页。这种做法有可能会暴露用户在目标站点的Cookie和其他的身份信息。HTTP的设计里没有什么特别可靠的方法来解决这个问题。而浏览器开发商们的应对之道也很难让人放心:他们指望通过禁用一堆TCP端口来阻止这类请求的发送。对IE浏览器6和7来说,会禁用以下端口号: ![]() 到了Internet Explorer8和9,更进一步禁用了端口220(imap3)和993(sslimap3) 其他浏览器通常会禁用以下端口: ![]() ![]() 当然,针对不同的协议,这些规则还是会有例外的。譬如ftp:这样的URL就明显需要访问到端口21,因为它是FTP协议的默认端口。 现在的这个解决方式在好几方面有问题,最主要的一点是,这两个列表里都有许多重大的遗漏,而且以现下网络协议数量之多,也是完全没办法穷尽的。例如,这里面就没有规则阻止浏览器与Internet Relay Chat(IRC)服务器的通信,而IRC协议的容错度颇高并且也是基于文本的,与SMTP颇有几分相似之处。 而且这些列表往往不太更新,既没有体现几乎废置的过期协议,也没有跟进新的协议。最后,如果系统管理员为某个服务选择了非标准端口,使得浏览器原本被禁止访问的服务现在能被访问了,这套机制会不公平地指责管理员的做法有问题并可能还要为此付出意外的代价:这么做使得浏览器级别的端口防护机制无效了。👨🚒👙✏☠✍ #f472: 4. 对第三方Cookie的限制 自诞生之日始,HTTP Cookie就一直被误解为一种侵犯用户隐私,给在线广告商助纣为虐的工具。历年来经过各主流媒体的不断报道和渲染,也放大了这种情绪。🧑🌾🪖🩺😆👌 例如,在2001年,《纽约时报》就发表了一篇长文,指控HTTP Cookie带来的隐私风险,甚至援引著名法律专家和政治活动家的Lawrence Lessig的说法: 在Cookie出现之前,Web隐私基本上是有保障的。但自从有了Cookie,Web的世界就受到了严密的监控。 🧑🌾👗📠😔🤟 在过去10年来,一直充斥着对Cookie这个HTTP请求头的严厉攻击,而且随着时间的推移,争论的焦点逐渐集中到了第三方Cookie身上。第三方Cookie的定义是,该Cookie的作用域与当前访问的主页面所对应的域名不一致,这个Cookie就是第三方Cookie,它们通常是在加载第三方图片、框架或插件小程序时引起的。 第三方Cookie广受关注的原因是,广告运营商可以很方便地用这种Cookie来标记跟踪用户,譬如用户在访问fuzzybunnies.com网站时被内嵌的广告页面设置了Cookie,之后又访问了playboy,com,就可以通过内嵌的广告把用户甄别出来。 这种明显有问题的跨域追踪,现在都错误地被归咎到第三方Cookie头上了,使得浏览器厂商的压力也日渐增加。华尔街日报就曾粗暴地指责微软和广告商狼狈为奸,所以不愿意在他们的浏览器产品里消除第三方Cookie。👴🎒⚔😡👍 我们自然能认识到这种对HTTP Cookie的死板印象其实是被误导了。确实有些人用Cookie来做一些不可告人的事,但实际上也并非只有Cookie才能实现这样的效果;事实上有许多同等的方式来记录访问者计算机的独一无二身份信息。 另外,如果两个网站之间是互相通气的,那更是无法阻止通过每个浏览器独特的指纹特征(从JavaScript的对象模型或Flash等插件里获得的浏览器信息),然后按照站点的需要来关联和挖掘跨域浏览的模式了。那些要嵌入广告而获利的站点,肯定会非常愿意为钱干这种事情的。 👨🎨🧥💾😰🖐 实际上,使用HTTP Cookie通常给用户提供了莫大的好处:和其他能获得同等效果的机制不同,Cookie的用途很固定,目标很明确,对隐私的控制也相对较好,粒度也比较细。把Cookie赶走也并不能阻止隐私被跟踪,完全只是给用户带来一种虚假的透明感而已。 另一位知名的隐私和安全活动家EdFelten曾说过:“如果要跟踪我的上网行为,请用Cookie吧。” 那些寡廉鲜耻的线上跟踪行为的确是个重大的社会问题,可能需要引进新的机制让用户只和可信的站点打交道。为了应对那些可能会作恶的Cookie,可能还需要一个常规的技术框架。 👂🌕🍭✡🦬 由于暂时还没有这样的框架,所以微软试验性地在IE9里引入了一个针对有问题Cookie的黑名单列表,该列表可人工管理,但这一措施对这个行业里各种鬼祟的做法并没有带来什么威吓的作用。 不管怎么说,尽管没什么实际的好处,但由于公众反对第三方Cookie的呼声愈演愈烈,几大浏览器厂商也顺势推出了各种很容易被绕过的半成品,这样他们就能号称自己尽过力了。 🧒🦺📬😡👊 • 在IE浏览器里,设置和读取第三方Cookie默认是被禁止的,除非会话的Cookie还相应地有符合要求的P3P响应头。P3P(Platform for Privacy Preferences,隐私首选项平台)机制需要构造一个机器可读,具备法律约束力的站点隐私策略,它可以是个XML文件,也可以是直接设置在HTTP响应里的P3P响应头。 例如,在HTTP响应头里设置关键字TEL,就意味着该站点会把收集到的信息用在电信营销市场里(确实没什么技术手段来阻止站点在P3P响应头里撒谎,这就得靠违反法律的后果来约束了。) 注意:这份长达111页的P3P规范实在是目标太远大了,结果P3P自身的庞大反而限制了人们对这套解决方案的接受度。大的机构通常会因为这份规范的法律约束范围,而对P3P作为解决跨域Cookie的技术方案非常犹豫,而小公司和个人站点则对P3P响应头能带来什么好处知之甚少或完全不了解。 👊💈🎂❎🐢 • Safari里 也是默认阻止第三方Cookie,但之前已有的Cookie则可以不受限制地被读到。然而如果用户已经和设置Cookie的那些页面打过交道,这个表现就会被覆盖掉,也就是说不再阻止第三方Cookie了。 这种处理可能是故意为之,但更有可能是无意间造成的:在前面描述过的点击劫持相关手段也适用于这个场景。 🙏🌧🍍🆎🦖 • 在其他浏览器里,第三方Cookie默认是允许的,但也有相应的配置选项可以改掉这种处理。启用这一选项就不能设置第三方Cookie了,但已经存在的第三方Cookie还是能被读到。由于要进行这些检查,所以从完全无关的域名过来的Cookie就会被认作是第三方Cookie。例如,在fbzzybunnies.com页面里某个子框架指向bunnyoutlet.com这个地址,就符合第三方Cookie的标准,但wwwl.fUzzybunnies.com和www2.fUzzybunnies.com的域名则会被认为是第一方的关系。这种逻辑处理其实也是脆弱的,和Cookie的域名范围面临同样的困境。 例如,在IE6和7里,对某些国家域名的对比就执行得不太准确。👨⚕️🧦🪣🤪👎 注意:的确,这场对第三方Cookie的圣战虽然没啥大的坏处,但也还是带来了一些负面的后果。禁用第三方Cookie,会使得浏览器没有办法根据Cookie来对内嵌的组件页面和其他类型的混搭应用进行身份验证,也很难利用“沙盒”域名的机制,把不信任但仍属隐私的内容和主应用隔离开来,以限制脚本注入的影响。
帖子热度 7703 ℃
|
|
看完楼主的帖子,我的心情竟是久久不能平静。正如老子所云:大音希声,大象无形。我现在终于明白我缺乏的是什么了,正是楼主那种对真理的执着追求和楼主那种对理想的艰苦实践所产生的厚重感。面对楼主的帖子,我震惊得几乎不能动弹了,楼主那种裂纸欲出的大手笔,竟使我忍不住一次次地翻开楼主的帖子,每看一次,赞赏之情就激长数分,我总在想,是否有神灵活在它灵秀的外表下,以至能使人三月不知肉味,使人有余音绕梁、三日不绝的感受。楼主,你写得实在是太好了。我惟一能做的,就只有把这个帖子顶上去这件事了。
|