
CVE-2026-82090 · CVSS 9.2 クリティカル · Mozilla Pocket における 0-click ストアド XSS — 全バージョン (v0 → v8.33.0.0) · 18年間の forever-day · パッチなし · MITRE 公開
著者: Ing. Zampier Zago(FUNFACTOR1) 部門: セクション1 — サイバーセキュリティ部門、PS 1978 Limited 連絡先: [email protected] Web: www.ps1978ltd.it 分類: セキュリティ脆弱性分析 — CVE-2026-82090
デュアルユースコンテンツに関する免責事項: 本リポジトリには、サポート終了(EOL)製品の脆弱性分析および概念実証(PoC)が含まれています。提供される情報およびコードは、教育目的、防御的分析、および公式の CVE 文書化に厳密に限定されます。著者は、本情報のいかなる悪用についても責任を負いません。
https://github.com/user-attachments/assets/e2b0aa46-df64-452b-afbf-fa31dd8c650d
DOM ベースのクロスサイトスクリプティング(XSS)脆弱性が、Pocket Android バージョン 8.33.0.0(パッケージ com.ideashower.readitlater.pro)で確認されました。これは、2025年7月のサービス終了前に Mozilla / Read It Later, Inc. が提供した最終リリースです。この脆弱性により、攻撃者は「Save to Pocket」を1回実行する以外のユーザー操作を必要とせずに、アプリケーションの WebView 内で任意の JavaScript を注入・実行できます。つまり、配信後の 0クリックエクスプロイト です。
根本原因は、アセットにバンドルされたファイル assets/html/j/articleview-mobile.js(95〜99行目)において、外部から取得した HTML コンテンツが jQuery の .html() メソッド($(document.body).html(content))を介して DOM に直接、サニタイズされずに注入されることです。コンテンツは com.pocket.sdk.offline.DownloadingService によってバックグラウンドで自動的に取得・レンダリングされ、ユーザー操作は一切不要です。
また、このアプリケーションはネイティブの Java-to-JavaScript ブリッジ(PocketAndroidArticleInterface)を公開しており、addJavascriptInterface を介して登録され、classes2.dex 内で確認されています。これは WebView 内で実行される JavaScript から呼び出し可能です。
ベンダーへの開示記録: この XSS は 2024-07-10 に CWE-79 分類および完全な技術的詳細とともに Mozilla Security へ正式に報告されました。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)にも存在しており、これは Read It Later が Pocket にリブランドされた 2012年4月17日の直前の時期に遡ります。この 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クリック)+ JavaScriptブリッジの悪用 |
| CWE | CWE-79、CWE-116 |
| 悪用状況 | 0クリック、0-day — 修正パッチなし。製品はEnd-of-Life |
| ベンダーの対応 | 2024-07-11 — 「Pocketは対象外」(Frida、Mozilla Security Team) |
| 影響を受ける製品 | 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(ペイウォール回避) |
| Mozilla SecurityへのXSS正式報告 | 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ベースのクロスサイトスクリプティング |
| CWE | CWE-79 — Webページ生成時の入力の不適切な中和 |
| 二次的CWE | CWE-116 — 出力の不適切なエンコードまたはエスケープ |
| 攻撃ベクトル | リモート、0クリック(配信後のユーザー操作ゼロ) |
| 必要な権限 | なし |
| スコープ | 変更あり — WebViewコンテキストが信頼境界を越えてネイティブAndroidブリッジに到達 |
ファイル: 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) → ペイロードが発火する。