CVE-2026-82090 · CVSS 9.2 严重 · Mozilla Pocket 中的 0-click 存储型 XSS — 所有版本(v0 → v8.33.0.0)· 18 年永久漏洞 · 无补丁 · MITRE 已发布
作者: Ing. Zampier Zago(FUNFACTOR1) 部门: 第 1 分部 — 网络安全部,PS 1978 Limited 联系方式: [email protected] 网站: www.ps1978ltd.it 分类: 安全漏洞分析 — CVE-2026-82090
两用内容免责声明: 本仓库包含针对一款生命周期终止(EOL)产品的漏洞分析和概念验证(PoC)。所提供的信息和代码严格用于教育目的、防御性分析以及官方 CVE 文档。作者对任何滥用此信息的行为不承担任何责任。
https://github.com/user-attachments/assets/e2b0aa46-df64-452b-afbf-fa31dd8c650d
在 Pocket Android 版本 8.33.0.0(包名 com.ideashower.readitlater.pro)中已确认存在一个基于 DOM 的跨站脚本(XSS)漏洞,该版本是 Mozilla / Read It Later, Inc. 在 2025 年 7 月服务终止前发布的最终版本。该漏洞允许攻击者在应用程序的 WebView 中注入并执行任意 JavaScript,除了一次“保存到 Pocket”操作外无需任何用户交互——在内容投递后即构成 0-click 漏洞利用。
根本原因是:在随资源打包的文件 assets/html/j/articleview-mobile.js(第 95–99 行)中,通过 jQuery 的 .html() 方法($(document.body).html(content))将来自外部的 HTML 内容未经净化直接注入 DOM。内容由 com.pocket.sdk.offline.DownloadingService 在后台自动获取并渲染,无需任何用户交互。
该应用程序还暴露了一个原生 Java 到 JavaScript 的桥接接口(PocketAndroidArticleInterface),通过 addJavascriptInterface 注册,并已在 classes2.dex 中确认,可由在 WebView 内执行的 JavaScript 调用。
厂商披露记录: 该 XSS 漏洞已于 2024-07-10 正式报告给 Mozilla Security,分类为 CWE-79,并附有完整技术细节。Mozilla 于 2024-07-11 确认收到,并明确拒绝修复,宣布 Pocket 不在其范围内。Mozilla 随后于 2025 年发布了 v8.33.0.0,其中存在漏洞的代码完全未作改动。对 v8.33.0.0 的取证分析确认,articleview-mobile.js 第 95–99 行存在完全相同的易受攻击调用。
沿革: 同一行代码——$(document.body).html(content),位于同名文件 articleview-mobile.js 中——也存在于 iOS 对应版本的资源包 ReadItLaterPro.app(Pocket iOS v4.5.2)中,其年代可追溯至 2012 年 4 月 17 日 Read It Later 更名为 Pocket 之前的时期。该 CVE 涵盖从 v0 到 v8.33.0.0 的所有版本——该缺陷在产品整个 18 年生命周期中一直被持续发布且从未修改(见 §7)。通过可获取的最早资源包(iOS v4.5.2)进行的代码级取证确认,将这一相同缺陷点追溯至至少 2012 年。
目前没有可用的补丁。该产品已被弃置。所有已安装的实例将永久处于易受攻击状态。
| 字段 | 值 |
|---|---|
| CVE | CVE-2026-82090 — 发布于 2026-08-28 — CNA:MITRE Corporation |
| 漏洞类型 | 基于 DOM 的 XSS(0-click)+ JavaScript Bridge 滥用 |
| CWE | CWE-79、CWE-116 |
| 利用状态 | 0-click、0-day — 无可用补丁;产品已停止支持(End-of-Life) |
| 厂商回应 | 2024-07-11 — “Pocket 不在范围内”(Frida,Mozilla 安全团队) |
| 受影响产品 | Pocket Android v8.33.0.0(最终版本) |
| 包 ID | com.ideashower.readitlater.pro |
| 厂商 | Mozilla Corporation / Read It Later, Inc. |
| CVSS v4.0 评分 | 9.2 — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| 严重程度 | 严重(CRITICAL) |
| 首次向厂商报告 | 2021-04-19(付费墙绕过) |
| XSS 正式报告至 Mozilla Security | 2024-07-10 |
| 最终 APK 发布时漏洞仍存在 | 2025 — v8.33.0.0 |
| 服务终止 | 2025-07-08 |
| 代码传承 | 18 年 — 所有版本(v0 → v8.33.0.0,2007 → 2025)。来自 2012 年 iOS 包的取证代码确认。 |
com.ideashower.readitlater.procom.ideashower.readitlater.pro_8.33.0.0.apkhttps://play.google.com/store/apps/details?id=com.ideashower.readitlater.pro 访问,但该应用已不再可供下载。| 字段 | 值 |
|---|---|
| 类型 | 基于 DOM 的跨站脚本(Cross-Site Scripting) |
| CWE | CWE-79 — 网页生成期间输入中和不当 |
| 次要 CWE | CWE-116 — 输出编码或转义不当 |
| 攻击向量 | 远程,0-click(投递后零用户交互) |
| 所需权限 | 无 |
| 作用域 | 已改变 — WebView 上下文跨越信任边界进入原生 Android bridge |
文件: assets/html/j/articleview-mobile.js
第 95–99 行:
// article content was retrieved
loadCallback : function(content)
{
// TODO : 3.0 : If file was missing, handle that correctly
$(document.body).html(content);
根本原因: 来自外部的 HTML 被直接传入 jQuery 3.4.1 的 .html() 方法,且未做任何净化处理。jQuery 3.4.1 会执行内嵌的 <script> 标签和内联事件处理器(onerror、onload)。在这个 1,836 行的文件中,任何地方都不存在对 DOMPurify、sanitize()、escapeHtml() 或等效方法的调用。content 变量来自 Java 层,没有经过 JS 侧的过滤。
紧接在易受攻击的调用之前的 // TODO : 3.0 : If file was missing, handle that correctly 注释表明,这段代码从未经过生产环境加固。该注释存在于该应用的每一个版本中,直至最终发布版 v8.33.0.0。
文件: assets/html/j/articleview-mobile.js,第 11–14 行:
// Android comm object
if (typeof PocketAndroidArticleInterface == 'undefined')
PocketAndroidArticleInterface = false;
isAndroid = !!PocketAndroidArticleInterface;
已通过 DEX 字符串分析确认(classes2.dex):
PocketAndroidArticleInterface
setJavaScriptEnabled
addJavascriptInterface
已从 JS 调用点确认的桥接方法:onReady()、onError()、onScrollChanged()、setFrozen()、placePageBlockers()、toggleFullscreen()、setViewType()、scrollToPosition()、onTextSearch()、onRequestedHighlightPatch()、updatePageSwipingDisabledAreas()、getHorizontalMargin()、getMaxMediaHeight()、isConnected()。
AndroidManifest.xml 确认:
<service
android:name="com.pocket.sdk.offline.DownloadingService"
android:permission="android.permission.FOREGROUND_SERVICE_DATA_SYNC">
在注册了 BOOT_COMPLETED 接收器的情况下,该服务会在设备启动和网络可用时自动获取并渲染文章内容,在隐藏的 WebView 中触发 loadCallback,无需任何用户交互。
Phase 1 — Content Injection [CONFIRMED]
Attacker hosts page with XSS payload.
Victim saves URL via "Save to Pocket".
Malicious HTML stored in local Pocket database.
Phase 2 — Zero-Click Background Sync [CONFIRMED]
DownloadingService auto-starts on boot (BOOT_COMPLETED).
Fetches article content silently, no user interaction.
Phase 3 — Automatic WebView Rendering [CONFIRMED]
Pagination engine (updatePaging) triggers hidden WebView render.
No user opens the article.
Phase 4 — JavaScript Execution [CONFIRMED]
loadCallback calls $(document.body).html(content).
jQuery 3.4.1 executes embedded scripts and event handlers.
Phase 5 — Native Bridge Reachability [PARTIAL]
Bridge object PocketAndroidArticleInterface is reachable from
the XSS execution context (confirmed via classes2.dex string
analysis and JS call-site inventory). Full native method
surface and downstream impact pending complete JADX
decompilation.
<!DOCTYPE html>
<html>
<body>
</body>
</html>
复现步骤:
DownloadingService 自动获取内容。loadCallback → $(document.body).html(content) → 载荷触发。关于 PoC 平台范围的说明: 上述可执行的概念验证针对的是 Android 版本,即 0 点击场景(后台
DownloadingService)。iOS 对应版本(Pocket iOS v4.5.2 /ReadItLaterPro.app)在同名文件中共享完全相同的易受攻击的loadCallback()汇聚点,但通过不同的桥接机制(由UIWebView委托拦截的x-ril-cmd:URL scheme)到达原生代码,并降级为 1 点击场景(用户必须打开已保存的文章)。iOS 证据通过对已发布应用包的静态分析确立,并完整记录在本仓库的iOS_forensic_analysis_v4.5.2.md中。未发布单独的可执行 iOS PoC;共享代码库分析证明了该汇聚点在两个平台上的等价性。
完整向量:CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
| 指标 | 值 | 理由 |
|---|---|---|
| 攻击向量 (AV) | 网络 (N) | 载荷通过互联网投递并执行 |
| 攻击复杂度 (AC) | 低 (L) | 无需绕过竞态条件或内存保护 |
| 攻击要求 (AT) | 存在 (P) | 用户必须在攻击前至少保存过一篇文章以触发后台同步 |
| 所需权限 (PR) | 无 (N) | 目标无需身份验证 |
| 用户交互 (UI) | 无 (N) | 保存后通过后台服务自动执行 |
| 漏洞机密性 (VC) | 高 (H) | 会话令牌、文章数据库、阅读习惯暴露 |
| 漏洞完整性 (VI) | 高 (H) | JS 可通过原生桥接方法更改应用状态 |
| 漏洞可用性 (VA) | 高 (H) | 后台服务可用性可被破坏 |
| 后续影响 (SC / SI / SA) | 无 (N) | 已证明的影响局限于 Android 应用沙箱 / WebView 信任边界内。未证明可转向独立的后续系统;SC/SI/SA 保守设为无,以避免过度声明 |
| 修复级别 (RL) | 不可用 (U) | 产品已废弃;无补丁发布 |