WEB安全第十七课 外围的网站特权 |
在讨论过各种值得注意的浏览器安全特性之后,本章会探讨若干由用户设置或浏览器开发者硬编码内置的站点,会享有哪些特权机制。
这些特权机制和我们在前述章节里谈到的各种策略形成鲜明的对比,之前的策略都是和浏览器显示内容自身的固有属性相关。正常来说,浏览器会查看文档的来源、页面所处的上下文环境,以及页面企图执行的操作,但除了这些检查结果之外,浏览器并不会针对单个普通网页的来源再做什么有倾向性的处理。 根据每站点进行特权设置其实相当粗暴地违背了无区别对待原则,这背后的部分原因的确值得商榷,当然更常见的情况是出于实用主义考虑。从便利的角度来说,很难抗拒不在浏览器里使用某些天生就非常危险的功能,但从程序的角度,又没有什么好的方法来确定哪些Web应用是值得信任的,也就难以确定是否该对它们开放这些危险功能。貌似把选择权交给用户是最好的办法。 🗺🧊🅾🦄 当然了,创建一个Web应用里的特权阶级只怕很有问题,因为从根源上来说两个Web应用之间的界限本来就不是很容易界定清楚,所以也很难精确地限制权限。而由于某些跨站交互里使用的边界机制已经不完美了,像XSS和XSRF这类漏洞更会雪上加霜。最后可能导致每站点权限许可机制的初衷与实际效果之间产生了严重的割裂。 1.浏览器和托管插件的站点权限 👃⛪🍭©🐟 在平衡安全、隐私和可用性各方面考虑时,浏览器厂商往往会发现自己正处于前是狼后是虎的位置上。譬如有些新功能貌似对日益发展的Web确实很重要,但如果允许互联网上每个网站都能使用这一功能又实在太危险了。此类有问题的机制包括访问视频摄像头或麦克风,允许网站查询用户的地理位置数据,安装浏览器扩展或主题,打开桌面通知等等。 为了给这个问题找到变通之道,以便让Web应用能够使用某些特权API,浏览器厂商们就要求用户来批准来自这些应用的申请。如果要使用这些受限制的功能,用户通常会看到一个提示,可能是个图标也可能是个模态提示框,上面有3个选择:忽略请求,只允许一次,授权请求的站点永久使用此API。在这些可选项中,最后一个是最有意思的:如果点了该选项,以后所有访问此主机的请求都会自动获得授权,有时甚至不会再出现任何额外的提示。 注意:大多数白名单只对比主机名,而不包括协议和端口。所以这些许可列表里的条目可不止匹配单一的SOP源。特别是,允许 站点访问你的摄像头也会授予非加密站点 同样的权限。 👌🗺🍚♂🦋 对网站授予和隐私以及安全相关的功能时一定要万分谨慎,因为如前提到的那样,获得这些特权的可并不只有白名单上的这些应用。只要能和设置的源信息匹配上,在此环境中的内容就能获得执行的许可权限,而不管payload是怎么提交过来的,因此极大地加剧了这一缺陷的危害(从长期来说,也是不可避免的)。在一个有特权的源站点上如果有脚本注入漏洞,那暴露的可能就不止站点自身的数据,甚至有可能泄漏从客户端提交过来的敏感数据。 2.表单密码管理 🧑🚀🛍🪥🤬👍 想不到本节会谈论这个内容?千万别惊讶。密码管理好像的确不应该出现在这儿,但其实很有必要把表单密码管理当做一种间接的站点特权绑定形式。在详细解释之前,让我们先来简要回顾一下为什么浏览器里会需要用到密码管理器以及密码管理器的工作机制。 第一个问题的答案相当简单:当下大部分主流网站都会或者至少会极力促使访问者创建自己的帐号。使用者为了能自定义站点外观或与其他注册用户交互,登录步骤通常都是必不可少的。 遗憾的是,这些站点的授权系统并不能彼此同步(除了某些试验性质的有限度的“联合登录”机制,如OpenID),这使得一个普通人可能要创建并记住几十个复杂度颇高的密码,每个密码对应一个要访问的站点。这种做法实际上很不现实,会导致猖獗和危险的密码重用。 👃🚤🥭™ 这使得浏览器厂商决定引入表单密码管理器,对于越来越多的每站点授权问题,这套机制尽管不优雅但颇为实用。在碰到可能是登录表单的地方,浏览器就会先进行一些简单的猜测,如查找<inpu ttype=password>字段,然后再检查表单字段的名称是否为user和pass等等。如果发现这确实是个登录表单,浏览器就会征询用户的意见,是否需要把相关的登录信息永久地保存到硬盘上,如果用户同意,日后再碰上适用的表单,浏览器会自动取回密码和并复制到表单字段里去。 (用户的密码数据可能以明文方式保存在硬盘上,也可能被编码成一串简单的混淆字符串又或者在使用前需要先输一个“主”密码,数据会经过较为严格的编码加密。这三种方法对于能接触到本地文件系统,又有恒心的攻击者来说都是可以被破解的,但明文的方式是尤其不可取,因为即使是好奇的非技术人员也能轻易把密码弄到手。)详见帖子: 密码管理器的设计的确很脆弱,但有一个好处:它完全不需要网站的官方支持就直接可用(或者换句话,完全不需要网站的同意)。Web应用如果不喜欢这个功能,可以在要保护的密码字段里加人一个命名得很差劲的参数autocomplete=off,浏览器就不会自动保存密码,而除此之外,整个流程几乎是完全无缝的。 各浏览器内置的密码管理器对密码数据的保护方式都是,只有在碰到和当初输人密码完全同源的站点时,才会自动返回用户的身份信息——主机名、协议和端口必须都一致。某些浏览器还会需要双重验证信息,如检查表单字段的顺序和命名,表单提交的URL路径,或者要填入身份信息的页面地址(由于同源策略的工作方式,从安全的角度来说这种范围的计算并不是特别可靠)。 👌🧳🍖🚷🐞 对那些完全无需人工干预,就能自动填充登录表单的浏览器来说,把这种机制视为一种特权形式的API是非常合理的:因为在合适的源里的任何可执行内容,只要浏览器会自动在表单里填人登录数据,就可以构造一个貌似可信的表单以获得浏览器存储的用户授权信息。要读取到这些信息,此时脚本只需要检查一下和密码字段相关的DOM元素的value值即可。 注意:如果能取消客户端脚本对密码字段的值的读取,貌似对提高这条策略的安全性有一定帮助,但这个办法其实并不好。也就是说,数据仍然能被偷走,譬如在浏览器自动填充了密码之后,如果脚本把数据提交的方式从POST改为GET,然后再调用登录表单的submit()方法,就能把密码明文地显示在页面的location.search字符串里(另外,许多网站应用也确实需要让客户端合法地读取到密码字段,譬如在提示用户密码强度是否符合要求时)。 🧑🎤👗🪣😡👈 所以很清楚,与密码管理相关的大部分风险都和更严重的XSS漏洞利用有关系。在使用httponly Cookie机制的网站里,被成功利用的XSS漏洞使得攻击者能临时访问用户的帐号,但相同的漏洞,在涉及密码管理机制时,却能直接窃取到用户的密码,后果显然更可怕和持久。 密码管理器还有一些更隐晦的利用方式。例如,任何允许用户自己构造表单项目的应用里,都需要严格限制用户不得创建自己的表单布局,否则,这个功能就有可能沦为密码收割机了。 3.IE浏览器的区域模型 👁🌡🍟🅾🐶 IE浏览器的区域模式是其特有的一项功能,目的是解决用户(或系统管理员)对不同类型的网站应用在安全上的需求差异,例如,银行页面和在线游戏肯定会有不同的安全需求。微软的做法是预先定义了几类网站类型——也就是所谓的区域(zones)——每类区域对应不同的权限设置。IE浏览器里支持五种区域: ●我的电脑(也就是本地计算机)这个隐藏的区域对所有的本地file:资源(只有一个例外,稍后再详述)有效。用户不能在这个集合里删除或添加任何元素,也不能通过常规的用户界面,去修改这个区域相应的安全设置。当然了,管理员和开发人员可以通过修改注册表或使用urlmon.dll钩子的方式去覆盖该类别的安全设置。 🤌🪐🧊❌🐴 ●本地Intranet:这个区域包括用户本地网络上的一些受信应用。默认来说,本地Intranet享有的许多特权都是有风险的,如不受限制地访问系统剪贴板,打开没有地址栏的浏览器窗口,或绕过框架跳转的安全检查( )。 有几种自动检测访问地址是否属于本地Intranet区域的机制,当然这些机制也是可配置的,譬如目标地址为非完全限定的主机名(non-fully qualified hostname)、或者该地址位于HTTP代理服务的例外列表里,又或是通过fne:URL形式访问SMB资源时,都被归到这个区域。也可以手工地把网站添加到这个区域里(在内置的自动猜测机制之外,可以再附加或替代某条设置)。 (如果把浏览器配置成访问本地网络需要使用HTTP代理,而访问互联网不需要,则可能带来超出预期的吓人结果,因为自动检测策略就会把整个互联网当成本地Intranet区域了。🧑🌾🩲⌨😊👂 注意:本地Intranet区域这个划分,其实隐含地认为本地网络就相当于受信任的环境。这种默认关联在现下实际情况里其实颇可质疑,特别是现在以非加密Wifi方式访问公网非常普遍:使用这些网络的危险性完全和随便访问一个互联网上的站点相差无几。 ●受信任的站点:这个区域通常是空白的,在安全设置上和Intranet区域大致相当,但完全是由用户管理。没有自动检测机制,所有的条目都由手工创建。 👄🏝🔪➡🦖 ●受限制的站点:受限站点的区域通常也是空白的,用户可以添加“不信任”的目标地址。这些站点的默认设置往往会去掉返回网页的某些基本功能,这些功能往往也是无害的(例如不能使用Refresh头域),而真正在安全上带来的好处其实很少。 这个区域的可用性也实在叫人疑惑。因为用户得明确设定每个不受信任的站点,显然我们没有办法提前预知互联网上哪些站点有问题,所以完全不能把这个区域的设置当成浏览时可依赖的默认安全设置。 ●Internet:没有包含在以上类别里的站点都属于这个默认类别。本书之前讨论的常规浏览器安全模型,对应的也就是这个类别的默认设置。👳🩳🦯😡👊 区域的概念再配合某些安全控制功能,看起来倒也像是浏览器安全的一个正确方向。例如,系统管理员可以对file:文档微调权限,而不会影响正常浏览时的安全性和方便性——或者禁止Internet区域的站点跳转到本地的内部系统(这项区域设置使用的描述语为“特权较少的Web内容区域中的网站可以定位到该区域”)。遗憾的是,区域模型的具体实现非常缺乏重点,导致被误用的可能性只怕还大于它的功效。 对任何一个想了解区域机制的人,碰到的首要问题就是晦涩的术语和很多复杂到几乎可笑的设置。每个区域设置都有超过100个复选框;有些会严重修改浏览器的安全模型;而另一些则可能完全无关紧要。(之前提过的Refresh设置就属于没啥大用的,而禁止表单则属于有重大影响的)。 🖕🚐🍓♀🦖 但我们在表面上却无法区分这两类功效很不同的设置,乍看之下甚至无法理解许多设置的实际含义。例如,有个选项叫“二进制和脚本行为”,可以设置为“启用”或者“禁用”,而帮助里根本没有提到这两个设置项的实际作用是什么。 唯一的解释在微软官方的开发人员文档站点里——但即使读了这个文档,也依然令人摸不着头脑。小伙伴请自行阅读: IE浏览器包含动态二进制行为:为HTML元素指定封装特定功能的组件,这些特定功能可作用于设定的HTML元素。任何IE浏览器的安全设置都不能控制这些二进制行为,所以在受限站点的网页上也仍然能成功地运行二进制行为。 👨🎨👜💳😊💪 在Windows Server 2003 Service Pack 1里,IE浏览器的安全设置就增加了二进制行为这一项。并且在受限站点区域里,这个新设置默认是禁用的。结合本地计算机的锁定安全(lockdown security)功能,默认情况下本地计算机的二进制行为也会需要管理员的许可。新的二进制行为安全机制对IE浏览器里的二进制行为漏洞提供了安全保障。 还有许多类似的例子,往往需要付出极大努力才能搞明白它们到底是什么意思。例如,即使最有经验的管理员,大概也不知道调整“通过域访问数据源”或“跨域浏览窗口和框架”是什么意思。这些令人极度困惑的提示也带来了若干有趣的后果:某些令人信任的机构也会无意中给出一些有问题的建议。 🧑⚕️👗🖨😫👍 例如,著名投行嘉信理财(Charles Schwab)就建议用户禁用框架浏览的继承模式,这么做不但会令嘉信理财网站上的HTML框架浏览变得不安全,也会拖累/其他站点的安全性。美国国家税务局(Internal Revenue Service)的一个子站点也提出了类似的非常欠考虑的建议。 除了IE浏览器区域设置的复杂度和缺乏有效的文档之外,区域模型的另一个问题是聚合了一大堆完全无关的权限。譬如本地Intranet和信任站点区域启用了很多受信任站点可能需要的功能——但任何一个受信任站点,都不会用到这个区域设置里的所有权限。由于这种设计,一旦把站点放进特权区域,原本很不起眼的XSS漏洞,导致的后果就有可能远超预期。 Web标记和域标识符👨🦱🥾📮👻👌 为了保持下载文件的域模型信息,IE浏览器更进一步实现了两种功能上有重叠的机制,以保证任何保存下来的外部文档仍能跟踪到文档原本的区域信息: ●Web标记(Mark of the Web,MotW)通过IE浏览器下载HTML文档时,浏览器会自动地在文档的头部添加一个简单的伪HTML标签,以标识文档的最初来源。 🥷🩲🖥🤤👁 MotW标签的例子如下: <!-- saved from url=(0024) --> 这个下载的HTML文档就会属于标签里记录的URL所对应的区域;打开该下载文档时,其权限相当于在该区域权限里的一个独一无二源。这么做最明显的效果是,该下载文档就不会和其他常规的file:URL权限混淆起来。 🤛🍞♀🐅 注意:由于MotW直接写在文档的内部,这其实是一个短板。因为使用非IE浏览器或电子邮件客户端下载HTML文档或IE浏览器下载一个非HTML文档时(当然这个还会受到文档自动检测系统的控制),恶意站点其实可以提前插入伪造的标签。但老实说,保存下来的不带任何MotW标签的file:文档的权限就已经够大的了,所以攻击者一般也不会处心积虑地把文件权限从“我的电脑”区域提升到“本地Intranet”区域。 ●备用数据流的域标识符(Alternate Data Stream(ADS)Zone Identifier)这是IE浏览器(和Chrome)给每个下载文件追加的NTFS元数据,以一串数字型的代码来标识文档来自哪个区域。域标识符机制的可移植性比MotW差,如果文件被保存到非NTFS文件系统,这串信息就丢失了。当然,由于可以用于非HTML文档,这套机制也更灵活。 🥷🧣🛋☠👊 域标识符兀数据只能被IE浏览器、Windows GUI外壳程序(Shell)和其他一些微软产品识别,而第三方软件基本上都会忽略此类数据。如果程序支持这种格式,那在打开这个文件的时候就会应用更严格的安全策略;最常见的是,仅仅弹出一个安全警示窗口,提醒这个来自互联网的数据可能会带来未知的风险。 当Web应用要求提升权限时 请谨记于心:要访问地理位置数据、视频或麦克风提供的信息以及其他特权API,都是需要承担责任的。如果站点可能有XSS的风险,允许权限提升不但是在拿应用的数据赌博,同时也会搭上用户的隐私。对特权功能要提前计划好并划分清楚。不要请求用户降低IE浏览器的安全设置以适应具体的Web应用,也不要听从任何人降低浏览器权限的要求——无论他们是什么身份。 💍🧻😷👀 当创建会需要用到特权源的插件或扩展时 由于无法避免的Web应用安全缺陷,这么做会增加用户的安全风险。设计的API要可靠,尽量使用辅助的安全手段,譬如加密算法,以进一步加固和服务器的通信。不要对非加密源设置白名单,因为非加密站点在公开的无线网络里很容易受到攻击。 👍🎢🧊💲🐢
帖子热度 8381 ℃
|
|
研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这句话后,才发这现里的字全是都乱的。#375:
|