Adblock Plus订阅列表机制漏洞,可在网页中执行任意代码

  • 发表于
  • Vulndb

国外安全专家Sebastian近日发现Adblock PlusAdBlockuBlock浏览器扩展的广告拦截过滤器列表存在漏洞,攻击者可以利用该漏洞运行恶意代码,可窃取用户的cookie、登录凭据、进行页面重定向或其他恶意行为。受影响的扩展拥有超过1亿活跃用户,并且该功能可以轻松利用以攻击任何足够复杂的Web服务(如Google服务),而攻击很难检测并且可以在所有主流浏览器中实现。

“$ rewrite”语法

一个广告屏蔽插件通常分为两个部分:插件本身和订阅列表。订阅列表包含对于各类恶意网址、广告或者插件的屏蔽信息,大多都支持正则表达式。而插件本身则在读取这些订阅列表后进行相应的操作,比如浏览器连接到列表中的网址或者阻止恶意广告和脚本。

举个例子,下方是热门的订阅过滤器EasyList的内容:

2018年,Adblock Plus 3.2发布时,添加了一个名为$ rewrite 新语法,允许列表维护者将与特定正则表达式匹配的Web请求替换为另一个URL。替换字符串必须是相对应的URL,不包含主机名,并且在重写时必须与原始请求位于同一域中。

举个例子,在订阅列表中添加以下过滤规则可将example.com/ad.gif的所有请求都替换为example.com/puppies.gif。因此,页面上的对应位置不会显示广告,而是更换为小狗照片。

||example.com/ad.gif$rewrite=/puppies.gif

由于重写的URL必须与原始URL位于同一源,并且必须是相对URL,因此以下$ rewrite 实例是无效的。

||example.com/ads.js$rewrite=https://evilsite.tk/bwahaha.js

在新增该语法之处,开发者考虑到了可能引发的安全隐患,所以当重写的对象为SCRIPTSUBDOCUMENTOBJECTOBJECT_SUBREQUEST时,该语法失效。

那么在这些限制的加持下,如何利用该语法运行恶意代码?

XMLHttpRequest和Fetch

当使用XMLHttpRequest或Fetch下载代码并执行时,可以利用此过滤器语法使用Web服务,同时允许请求任意来源并于服务器端开放重定向。这样的攻击难以检测,因为该扩展插件会定期更新过滤器列表,只要该列表的维护人员为恶意过滤器列表设置一个较短的过期时间,然后将其替换为没问题的过滤器列表。

要利用该漏洞需要满足以下条件:

  • 页面必须使用XMLHttpRequest或Fetch加载JS字符串并执行返回的代码;
  • 页面不能严格部署了CSP策略,或者在执行下载的代码之前不能验证最终请求URL;
  • 获取代码的来源必须支持服务器端的重定向或者内容托管。

关键就是使用XMLHttpRequest或Fetch来下载脚本和打开重定向功能,使得攻击者能够从远程站点通过XMLHttpRequest读取脚本,而此时对于插件而言看起来仍是同一个来源。

比如访问量非常大的Google Maps站点就可以利用XMLHttpRequest加载脚本,因为它的搜索结果页面中包含一个开放重定向:

根据上述规则,当用户访问www.google.com/maps/时,过滤规则将使用Google开放重定向来读取https://majestic-ramsons.herokuapp.com/的内容。

Adblock Plus订阅列表机制漏洞,可在网页中执行任意代码

运行远程脚本

由于打开的重定向url位于同一个源或域中,允许读取字符串并将其作为JavaScript执行,导致警报:

远程脚本显示警报

风险与后续

虽然更改过滤器页表的方法有很多,这不是最严重的一个,但Sebastian担心别有用心的列表维护者会利用该漏洞发起难以检测的针对性攻击,比如2018年,一个不署名的列表维护者因为政治原因该写了某个订阅列表,导致大量声援抗议活动的工会网站在该广告屏蔽插件的作用下出现问题。

Sebastian向谷歌报告了该漏洞,但谷歌坚称开放重定向是他们一贯的立场:

Google已收到有关此漏洞的通知,但该报告已作为”预期行为“被关闭,因为他们认为潜在的安全问题仅存在于上述浏览器扩展中。

实际上该漏洞可以用于一系列供应链攻击,Sebastian建议网站使用CSP标头和connect-src选项来指定可以从中加载脚本的站点的白名单,以降低安全风险。

建议

广告拦截扩展应考虑放弃对$ rewrite过滤器选项的支持。即使只允许重定向图像或样式表,也总是可以在某种程度上滥用该功能。

用户也可以切换到uBlock Origin。它不支持$ rewrite过滤器选项,并且不容易受到所描述的攻击。

via