
CVE-2026-82090 · CVSS 9.2 حرج · XSS مخزّن بدون نقر في Mozilla Pocket — جميع الإصدارات (v0 → v8.33.0.0) · ثغرة عمرها 18 عامًا · لا يوجد إصلاح · نشرتها MITRE
المؤلف: Ing. Zampier Zago (FUNFACTOR1) القسم: القسم 1 — إدارة الأمن السيبراني، PS 1978 Limited جهة الاتصال: [email protected] الموقع: www.ps1978ltd.it التصنيف: تحليل ثغرة أمنية — CVE-2026-82090
إخلاء مسؤولية بشأن المحتوى مزدوج الاستخدام: يحتوي هذا المستودع على تحليل لثغرة أمنية وإثبات مفهوم (PoC) لمنتج انتهى عمره الافتراضي (EOL). المعلومات والشيفرة المقدمة مخصصة حصريًا للأغراض التعليمية والتحليل الدفاعي والتوثيق الرسمي لـ CVE. لا يتحمل المؤلف أي مسؤولية عن أي إساءة استخدام لهذه المعلومات.
https://github.com/user-attachments/assets/e2b0aa46-df64-452b-afbf-fa31dd8c650d
تم تأكيد وجود ثغرة Cross-Site Scripting (XSS) قائمة على DOM في Pocket Android الإصدار 8.33.0.0 (الحزمة com.ideashower.readitlater.pro)، وهو الإصدار النهائي الذي أصدرته Mozilla / Read It Later, Inc. قبل إنهاء الخدمة في يوليو 2025. تتيح الثغرة للمهاجم حقن وتنفيذ JavaScript عشوائية داخل WebView الخاص بالتطبيق دون أي تفاعل من المستخدم يتجاوز إجراء "Save to Pocket" واحدًا — أي استغلال من نوع 0-click بعد التسليم.
السبب الجذري هو الحقن غير المعقّم لمحتوى HTML من مصادر خارجية مباشرةً في DOM عبر طريقة .html() في jQuery ($(document.body).html(content))، وذلك في الملف المضمّن ضمن الأصول assets/html/j/articleview-mobile.js (الأسطر 95–99). يتم جلب المحتوى وعرضه تلقائيًا في الخلفية بواسطة com.pocket.sdk.offline.DownloadingService دون الحاجة إلى أي تفاعل من المستخدم.
يكشف التطبيق أيضًا عن جسر أصلي بين Java وJavaScript (PocketAndroidArticleInterface)، مسجّل عبر addJavascriptInterface ومؤكد في classes2.dex، يمكن استدعاؤه بواسطة JavaScript التي تُنفَّذ داخل WebView.
سجل الإفصاح إلى المورّد: أُبلغت Mozilla Security رسميًا بثغرة XSS في 2024-07-10 مع تصنيف CWE-79 وتفاصيل تقنية كاملة. أقرّت Mozilla بالاستلام في 2024-07-11 ورفضت صراحةً معالجتها، معلنةً أن Pocket خارج نطاق المسؤولية. أصدرت Mozilla لاحقًا الإصدار v8.33.0.0 في 2025 مع بقاء الشيفرة المصابة دون أي تغيير على الإطلاق. يؤكد التحليل الجنائي للإصدار v8.33.0.0 وجود الاستدعاء المصاب نفسه في الأسطر 95–99 من articleview-mobile.js.
سلسلة الأصل: السطر نفسه المطابق — $(document.body).html(content)، في ملف يحمل الاسم نفسه articleview-mobile.js — موجود في حزمة نظير iOS ReadItLaterPro.app (Pocket iOS v4.5.2)، ويعود إلى الحقبة التي سبقت مباشرةً إعادة تسمية Read It Later إلى Pocket في 17 أبريل 2012. تغطي CVE جميع الإصدارات من v0 حتى v8.33.0.0 — فقد ظل العيب يُشحن باستمرار، دون تعديل، طوال عمر المنتج الكامل الممتد 18 عامًا (انظر §7). ويؤرخ التأكيد الجنائي على مستوى الشيفرة عبر أقدم حزمة متاحة (iOS v4.5.2) وجود نقطة الحقن المطابقة إلى عام 2012 على الأقل.
لا يتوفر أي تصحيح. المنتج مهجور. تظل جميع النسخ المثبّتة عرضة للثغرة بشكل دائم.
| الحقل | القيمة |
|---|---|
| CVE | CVE-2026-82090 — نُشر في 2026-08-28 — CNA: MITRE Corporation |
| نوع الثغرة | XSS قائم على DOM (0-click) + إساءة استخدام جسر JavaScript |
| CWE | CWE-79، CWE-116 |
| حالة الاستغلال | 0-click، 0-day — لا يوجد تصحيح متاح؛ المنتج انتهى عمره الافتراضي |
| استجابة المورّد | 2024-07-11 — "Pocket خارج النطاق" (Frida، فريق أمن Mozilla) |
| المنتج المتأثر | Pocket Android v8.33.0.0 (الإصدار النهائي) |
| معرّف الحزمة | 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 |
| الخطورة | حرجة |
| أول إبلاغ للمورّد | 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). تأكيد جنائي للشيفرة من حزمة iOS لعام 2012. |
com.ideashower.readitlater.procom.ideashower.readitlater.pro_8.33.0.0.apkhttps://play.google.com/store/apps/details?id=com.ideashower.readitlater.pro لكن التطبيق لم يعد متاحًا للتنزيل.| الحقل | القيمة |
|---|---|
| النوع | Cross-Site Scripting قائم على DOM |
| CWE | CWE-79 — عدم التحييد الصحيح للمدخلات أثناء توليد صفحة الويب |
| CWE الثانوي | CWE-116 — الترميز أو الهروب غير الصحيح للمخرجات |
| ناقل الهجوم | عن بُعد، 0-click (صفر تفاعل من المستخدم بعد التسليم) |
| الامتيازات المطلوبة | لا شيء |
| النطاق | متغيّر — سياق 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 من مصدر خارجي مباشرةً إلى طريقة .html() في jQuery 3.4.1 دون أي تعقيم. تنفّذ jQuery 3.4.1 وسوم <script> المضمّنة ومعالجات الأحداث المضمّنة (onerror، onload). لا يوجد أي استدعاء لـ DOMPurify أو sanitize() أو escapeHtml() أو ما يعادلها في أي مكان من الملف المكوّن من 1,836 سطرًا. ينشأ المتغير 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. تقوم الخدمة بجلب محتوى المقالة وعرضه تلقائيًا عند إقلاع الجهاز وتوفر الشبكة، مما يُفعّل loadCallback داخل WebView مخفي دون أي تفاعل من المستخدم.
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.