Adblock Plus授权绕过漏洞CVE-2026-7686
Adblock Plus 是一款开源广告拦截浏览器扩展广告,作为拦截领域的标杆级工具,该扩展插件免费、开源、跨平台,功能全面且易用。
一、基本情况
Adblock Plus 适合追求纯净浏览、隐私保护与高效上网的用户,这款插件默认设置兼顾用户与网站利益,可以自定义适配个性化需求。

Adblock Plus 由德国 Eyeo GmbH 于2006年开发,全球用户超 5000 万,主打去广告、防跟踪、提网速,适配全平台浏览器与移动端。
栋科技漏洞库关注到位于 Adblock Plus v4.36.1 版本的源校验缺失漏洞,该漏洞现已经被追踪为CVE-2026-7686,CVSS 4.0评分6.9。
二、漏洞分析
CVE-2026-7686 是位于 Adblock Plus 受影响版本中的授权绕过漏洞,导致任何网站可通过伪造postMessage消息激活Premium授权。
受影响版本premium.preload.js的activation_onMessage函数未验证event.origin属性,仅检查消息结构便处理payment_success命令。
同时 background.js 的 premium.activate 处理器未将 userId 与支付会话绑定即进行持久化,
运行于 accounts.adblockplus.org 域内的任意 JavaScript 代码,
均可伪造 payment_success 跨文档通信事件,在无需实际付款的前提下激活高级会员订阅。
插件后台未对提交的用户 ID 与合法支付会话进行绑定校验,攻击者仅需一行 JS 代码,约 30 秒即可完整绕过整套高级权限鉴权流程。
(一)该漏洞由三层独立的鉴权失效共同导致:
第一层 — 前端(premium.preload.js:368):缺失来源校验
内容脚本注册了一个 window.message 监听器,仅校验消息数据格式,却完全忽略了关键安全校验项:
event.origin(消息来源域名)
event.source(消息发送窗口)
会话绑定
随机数 / 令牌校验
// premium.preload.js:368 — actual source code
function activation_onMessage(event) {
const { data } = event;
if (data.version !== 1 ||
data.command !== "payment_success" ||
!data.userId) {
console.error("Received invalid message");
return;
}
window.removeEventListener("message", activation_onMessage);
void activateLicense(data.userId, event.origin);
// ❌ event.origin is passed along but never validated
}
async function activateLicense(userId, origin) {
try {
const isSuccess = await activate(userId);
if (!isSuccess) {
throw new Error("Error in background page");
}
const payload = { ack: true };
window.postMessage(payload, origin);
} catch (ex) {
console.error("Failed to activate Premium license", ex);
}
}
第二层 —— 插件后台(background.js:6788):用户 ID 未与支付会话绑定
后台脚本在接收 premium.activate 指令后,仅校验 userId 非空,便直接将该用户 ID 持久化写入本地配置,并触发许可证校验流程;
全程未验证该用户 ID 是否源自合法的支付流程。
随后,位于 background.js:6671 的 checkLicense() 函数会直接使用这个未经校验的持久化用户 ID执行许可证校验。
// background.js:6671 — actual source code
const userId = prefs.Prefs.get("premium_user_id");
if (!userId) { return; }
const requestData = {
cmd: "license_check",
u: userId, // any userId from any source reaches this point
v: "1"
};
const requestUrl = prefs.Prefs.get("premium_license_check_url");
const response = await fetch(requestUrl, {
method: "POST",
cache: "no-cache",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(requestData)
});
const newLicense = (await response.json());
if (newLicense.status !== "active") {
throw new InvalidLicenseError(...)
}
activateLicense(oldLicense, newLicense);
双重失效叠加
该漏洞的核心在于两层独立的校验机制同时失效:
前端内容脚本(premium.preload.js)不校验消息来源,导致攻击者可伪造支付成功事件。
后台脚本(background.js)不校验用户 ID 是否与真实支付会话关联,导致伪造的 ID 可直接被系统接受。
这意味着,整个授权流程没有任何一道有效的 “关卡” 能阻止攻击者,最终形成了一个几乎无成本、易利用的权限绕过漏洞。
(二)攻击向量
1、前置条件
浏览器中已安装 Adblock Plus 扩展(普通用户默认配置即可满足)
可访问 https://accounts.adblockplus.org(公开可访问,无需登录)
具备在浏览器控制台执行 JavaScript 的能力(现代浏览器的标准功能)
2、攻击流程
访问 accounts.adblockplus.org 页面,或在任意可执行 JS 的环境中打开该域名页面
利用浏览器控制台执行恶意 JavaScript,伪造 payment_success 跨文档通信事件,绕过前端来源校验
伪造的事件将被扩展的内容脚本接收并传递给后台脚本
后台脚本未校验用户 ID 与支付会话的绑定关系,直接将伪造的用户 ID 持久化存储
扩展将该用户 ID 视为已付费的合法用户,完成 Premium 订阅授权激活
攻击者无需任何支付行为,即可永久解锁高级功能
(三)流程解读
1、正常(合法)流程
用户完成支付
支付系统触发 postMessage 事件
扩展校验消息(仅校验内容,不校验来源)
后台脚本持久化 userId,并调用 license_check
服务器确认支付有效 → Premium 高级订阅激活
2、攻击流程
攻击者访问 https://accounts.adblockplus.org(无需登录)
premium.preload.js 内容脚本被注入页面
攻击者打开浏览器开发者工具控制台
执行一行 JavaScript 代码(POC 见下文)
扩展接收伪造消息,不校验消息来源
后台脚本持久化任意 userId,并调用 license_check
服务器未拒绝伪造的 userId → Premium 高级订阅被成功激活
3、核心差异与漏洞点
正常流程依赖支付系统触发事件,但扩展仅校验消息格式,不校验发送者身份;
攻击流程直接在页面内伪造 postMessage,绕过支付环节;
服务器未校验 userId 与真实支付的绑定关系,导致伪造的 ID 也能通过校验。
三、POC概念验证


1、POC代码
管理员已设置登录后刷新可查看2、复现步骤
从 Chrome 网上应用店安装 Adblock Plus 扩展(扩展 ID:cfhdojbkjhnklbpkdaibdccddilifddb)
访问页面:https://accounts.adblockplus.org
打开开发者工具 → 控制台面板(快捷键 F12)
粘贴上方的漏洞验证代码(PoC)并按下回车
打开 Adblock Plus 设置页面:
chrome-extension://cfhdojbkjhnklbpkdaibdccddilifddb/options.html
验证结果:高级版(Premium)已成功激活,页面显示 “欢迎使用 Adblock Plus 高级版”,所有付费功能全部解锁
四、影响范围
Adblock Plus ≤ 4.36.1
五、修复建议
Adblock Plus > 4.36.1
六、参考链接
管理员已设置登录后刷新可查看