
إثبات مفهوم يوضح ثغرة XSS مخزنة في أداة الجدول في Appsmith تؤدي إلى تصعيد عمودي للصلاحيات والاستيلاء الكامل على حساب المسؤول عبر هجوم XSS-to-CSRF.
إثبات المفهوم لتصعيد الامتيازات في Appsmith عبر XSS المخزّن
الإفصاح: تم الإبلاغ عنه في الأصل بواسطتي عبر GHSA-5hw4-whxv-6794
⚠️ للاستخدام المصرّح به في الاختراق الأخلاقي/البحث فقط.
| الحقل | القيمة |
|---|---|
| معرف CVE | CVE-2026-30862 |
| الخطورة | 🔴 حرجة |
| درجة CVSS | 9.1 |
| متجه CVSS | [CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H] |
| CWE | CWE-79, CWE-269, CWE-352 |
| المنتج المتأثر | Appsmith ≤ 1.95 |
| الإصدار المُصحَّح | 1.96 |
| النشرة الأمنية | GHSA-5hw4-whxv-6794 |
توجد ثغرة XSS مخزّن حرجة في أداة الجدول (TableWidgetV2). السبب الجذري هو عدم وجود تعقيم HTML في خط أنابيب عرض مكوّن React، مما يسمح بإقحام سمات خبيثة في DOM. من خلال استغلال ميزة "دعوة المستخدمين"، يمكن لمهاجم يملك حساب مستخدم عادي ([email protected]) إجبار مسؤول النظام على تنفيذ استدعاء API عالي الامتياز (/api/v1/admin/env)، مما يؤدي إلى الاستيلاء الكامل على حساب المسؤول.
1. السبب الجذري: غياب نقطة تعقيم المخرجات تكمن الثغرة في محرك عرض أداة الجدول
الملف: app/client/src/widgets/TableWidgetV2/component/cellComponents/BasicCell.tsx
يفشل مكوّن BasicCell في تعقيم البيانات عندما يكون columnType مضبوطًا على URL أو Plain Text. فهو يُرجع قيمًا خام مقدمة من المستخدم تُعرض مباشرةً كعناصر فرعية لـ React، والتي يفسرها المتصفح على أنها HTML قابل للتنفيذ.
مقتطف الكود المعرض للخطر (الأسطر 132-143 و172-173):
const contentToRender = useMemo(() => {
switch (columnType) {
case ColumnTypes.URL:
// إقحام مباشر لـ 'url' في href دون تعقيم
return <a href={url} target="_blank">{value}</a>;
default:
return value; // السطر 141: إرجاع القيمة الخام
}
}, [columnType, url, value]);
// السطر 173: نقطة الإقحام النهائية حيث يُحقن المحتوى غير المعقّم في DOM
<Content ref={contentRef}>{contentToRender}</Content>
2. متجه الهجوم: XSS إلى CSRF عبر الهندسة الاجتماعية (ميزة الدعوة) على الرغم من أن ملف تعريف الارتباط SESSION محمي بواسطة HttpOnly، فإن XSRF-TOKEN يمكن الوصول إليه عبر document.cookie. نظرًا لأن Appsmith يسمح لأي مستخدم بـ"دعوة" الآخرين إلى تطبيقه، يمكن للمهاجم استخدام هذا كآلية توصيل لتنفيذ تزوير طلب عبر الامتيازات (CPRF) داخل جلسة المسؤول النشطة.
الخطوة 1: التحقق من ثغرة XSS
سجّل الدخول بحساب مستخدم عادي: [email protected].
أنشئ تطبيقًا جديدًا وأضف أداة جدول.
في خاصية بيانات الجدول، احقن ما يلي:
[{ "id": 1, "payload": "" }]
-- الخطوة 2: التسليح (الاستيلاء الكامل على المسؤول)
[email protected]، حدّث بيانات الجدول بالحمولة التالية المصممة لتعديل البيئة الإدارية:[
{
"id": 1,
"Status": "System Update Required",
"payload": "alert('Admin Privileges Granted to [email protected]'));\">"
}
]
استخدم ميزة "مشاركة" لدعوة مسؤول النظام ([email protected]) إلى التطبيق. هذا يُجبر المسؤول على عرض الجدول الخبيث عند فتح الدعوة.
بمجرد تشغيل المسؤول للتطبيق، يتم تنفيذ السكربت في الخلفية. يقرأ XSRF-TOKEN الخاص بالمسؤول ويرسل طلب PUT لإضافة [email protected] إلى القائمة البيضاء الإدارية.
النتيجة: سجّل الدخول مرة أخرى بصفتك [email protected]. سيكون لديك الآن وصول كامل إلى إعدادات المسؤول وجميع تكوينات المثيل.
نوع الثغرة: XSS مخزّن / تصعيد امتيازات رأسي.
الخطورة: 9.1 (حرجة) | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
الخطر: اختراق كامل لمثيل Appsmith. يحصل المهاجمون على الوصول إلى متغيرات البيئة الحساسة، وبيانات اعتماد قاعدة البيانات، والقدرة على تعديل أي تطبيق داخل المثيل.
تعقيم نقاط الإقحام: قم بلف جميع المخرجات الديناميكية في BasicCell.tsx والمكونات ذات الصلة باستخدام DOMPurify.sanitize().
سياسة CSP مُشدَّدة: نفّذ سياسة connect-src صارمة لمنع استدعاءات API غير المصرح بها إلى نقاط النهاية الإدارية من حمولات XSS.
https://github.com/user-attachments/assets/206a10e4-1619-4887-a552-99761baa0a29