
مختبر إثبات مفهوم لثغرة تفويض في Apache Superset 6.1.0 حيث يقوم محرر لوحة معلومات بدور Gamma بزرع SQL في مجموعة البيانات عبر استيراد لوحة معلومات v0 غير مُصدَّر بإصدار، يُنفَّذ عند تحديث المخطط.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · superset-g3-v0-import-sql-plant
يمكن لزميل لديه حساب عادي في محرر لوحات المعلومات أن يخفي استعلام قاعدة بياناته الخاص داخل مخطط يثق به الآخرون بالفعل. في المرة التالية التي يفتح فيها أي شخص ذلك المخطط، يُنفَّذ الاستعلام على اتصال بيانات الشركة. يمكنهم قراءة جداول لم يُمنحوا صلاحية الوصول إليها قط. ولا يحتاجون إلى صلاحية "تشغيل SQL الخاص بي" الإضافية التي يُفترض أن تحكم هذا الأمر. لا يمكنهم تسجيل دخول جديد إلى المستودع، ولا يمكنهم تنفيذ INSERT أو DELETE عبر مسار هذا المخطط.
الفئة: صلاحية متبقية الوصول: عن بُعد
Apache Superset 6.1.0 (c83fb2bb) - مؤسسة Apache البرمجية
يمتلك Gamma الافتراضي صلاحية can_write على لوحة المعلومات، لذا فإن POST /api/v1/dashboard/import/ ضمن المصفوفة. لا يحتوي JSON غير المضغوط بصيغة ZIP على metadata.yaml، لذا يحاول الموزِّع الإصدار v1، ثم ينتقل إلى الإصدار v0 غير المُرقَّم. تعيد decode_dashboards تكوين SqlaTable. تبحث import_dataset حسب table_name + schema + database_id (من params.database_name) وتنسخ datasource.override(i_datasource) الحقول export_fields بما في ذلك sql دون raise_for_access ودون كتابة على Dataset. بعد ذلك يقوم POST /api/v1/chart/data بتجميع ذلك الـ SQL كـ FROM الافتراضي على اتصال التحليلات الخاص بالـ dataset.
SQL الخاص بـ Gamma دون sql_lab. يبقى Dataset REST PUT عند 403. يبقى v1 ZIP فارغًا.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (متبقية من CVE-2026-23982 / CVE-2024-26016) |
| الوصول | عن بُعد (HTTP مُصادَق عليه؛ Gamma الافتراضي) |
| CWE | CWE-863، CWE-284 |
| CVSS | عالٍ: 7.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L |
| المنتج | Apache Superset |
| المتأثر | 6.1.0 (c83fb2bb1dcfac41ac51bcebd82471f4a7180d18)؛ أحدث إصدار GA على GitHub وقت البحث |
| المصادقة | Gamma الافتراضي (can_write على لوحة المعلومات). ليس دون مصادقة. ليس مسؤولًا (خارج النطاق). |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
يحتاج إلى حساب Gamma (أو أي حساب لديه صلاحية الكتابة على لوحات المعلومات) وإلى dataset يمكنه رسمه لاحقًا: نفس table_name + schema على قاعدة بيانات يكون database_name الخاص بها موجودًا في params الخاصة بـ JSON. المنحة التكميلية تكون على كائن dataset، وليس على كل جدول يسميه الـ SQL المزروع. raise_for_access الخاص بـ chart/data يكون على مستوى كائن datasource (datasource_access / schema / owner). لا يرفض get_from_clause سوى has_mutation().
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| الكتابة فوق SQL الافتراضي لمجموعة بيانات مطابقة بالاسم | Gamma POST /api/v1/dashboard/import/ JSON غير ZIP؛ v0 import_dataset datasource.override ينسخ export_fields بما فيها sql | السلامة (dataset.sql) | مُثبت مختبريًا. الاستيراد 200؛ dataset.sql = SELECT 'SUPERSET-G3-V0-IMPORT-SQL-PLANT-WITNESS' AS witness |
| تشغيل ذلك SQL على URI التحليلات الخاص بمجموعة البيانات | POST /api/v1/chart/data بعد الزرع؛ get_from_clause يلفّ sql المخزّن كـ TextAsFrom | الاستطلاع (SELECT أي جدول يستطيع مستخدم URI قراءته) | مُثبت مختبريًا. 200؛ مُجمّع FROM (SELECT 'SUPERSET-G3-V0-IMPORT-SQL-PLANT-WITNESS' AS witness) AS virtual_table |
| إخفاء الاستعلام في رسم بياني يفتحه مستخدمون آخرون ممنوحون بالفعل | نفس الزرع؛ المالكون / أصحاب datasource_access الآخرون ينفذون عند التحديث | السلامة + الاستطلاع (أشخاص آخرون يشغّلون الزرع) | مُستنتج. مختبر Gamma كان لديه المنح بالفعل فتم التنفيذ ذاتيًا |
| كسر لوحات المعلومات التي استخدمت SQL القديم | استبدال sql الجدول الفيزيائي بـ SELECT من المهاجم | التوافر | مُستنتج |
| سلبي: تنفيذ SQL Lab | POST /api/v1/sqllab/execute/ | لا ينطبق | مُثبت مختبريًا. 403 |
| سلبي: الكتابة فوق Dataset REST | PUT /api/v1/dataset/{id} مع sql | لا ينطبق | مُثبت مختبريًا. 403؛ بقي sql فارغًا (شقيق CVE-2026-23982) |
سلبي: v1 ZIP مع metadata.yaml | نفس نقطة نهاية الاستيراد، حزمة ZIP | لا ينطبق | مُثبت مختبريًا. 200؛ بقي sql فارغًا (فئة CVE-2024-26016) |
أُغلق على هذه البقايا: الاستيراد غير الموثق؛ تسجيل URI قاعدة بيانات جديد (استيراد v0 لمجموعة البيانات لا ينشئ الاتصال؛ غياب params.database_name هو DatabaseNotFoundError)؛ DML عبر chart/data (has_mutation())؛ رسم Gamma البياني لمجموعة بيانات لا يستطيعون قراءتها (403)؛ table_name فريد مُدرج حديثًا (أُنشئ PVM، غير مرتبط بـ Gamma). ليس RCE. ليس Admin. تقسيم مستودع الإنتاج يحدّ SELECT لمستخدم URI ذلك. كان URI التحليلات في المختبر نفس Postgres الخاص بالبيانات الوصفية، لذا العبور بين الجداول بما فيها ab_user مُستنتج، وليس مُثبتًا بأوراكل ثانٍ.
ثبّتُ Apache Superset 6.1.0. Admin مكافئ على مستوى نظام التشغيل وخارج النطاق. بحثت عن البقايا مقابل مصفوفة الأدوار الخاصة بـ Apache: Gamma، Alpha، sql_lab، الضيف المضمّن، Public.
موجة 6.0.0 أغلقت بالفعل chart/data sqlExpression (CVE-2026-23980)، وDataset REST SQL (CVE-2026-23982)، وSQL Lab DO $$ / EXPLAIN ANALYZE (CVE-2026-23984). تفويض الاستيراد لـ ZIP المُصدّر بإصدار هو CVE-2024-26016. v0 غير المُصدّر بإصدار لا يزال الأخير في command_versions لأن "الملفات غير مُصدّرة بإصدار."
import_ على Dashboard يُعيّن إلى الكتابة. JSON غير ZIP هو {filename: bytes} بدون metadata.yaml. المُوزّع يجرّب v1، يلتقط IncorrectVersionError، يشغّل v0. decode_dashboards يحوّل __SqlaTable__ إلى نموذج حي. import_dataset يبحث ويستبدل. export_fields يتضمن sql. وقت الاستعلام يعامل SQL المخزّن كموثوق: get_from_clause بعد has_mutation().
منعطفات خاطئة مسجلة بالفعل: معاملة v1 ZIP كالبقايا (بقي sql فارغًا)؛ Dataset REST PUT (403)؛ SQL Lab كـ Gamma (403)؛ التضخيم إلى أي كائن Database (v0 لا يسجّل URI)؛ reverse shell. مسرح. الشاهد هو FROM الافتراضي.
python3 superset-g3-v0-import-sql-plant-Abraxas-Labs.py
أو:
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19710. الصورة apache/superset:6.1.0. مشروع Compose superset-g3-v0-import. البذرة: Admin، مستخدم Gamma-only، مجموعة بيانات فعلية lab_items على Lab Analytics، صلاحية datasource_access لمستخدم Gamma. الأوراكل هو سلسلة الشاهد المزروعة في SQL وفي المخطط/البيانات.
SUCCESS superset-g3-v0-import-sql-plant gamma-import-ok plant-sql-ok chart-data-witness-ok sqllab-403 dataset-put-403 v1-zip-no-overwrite SUPERSET-G3-V0-IMPORT-SQL-PLANT-WITNESS
يجب أن يتطلب import_dataset في v0 صلاحية الكتابة على Dataset واستدعاء raise_for_access قبل أن ينسخ override قيمة sql. أزل v0 غير المُصدَّر بإصدار من command_versions، أو ارفض الاستيرادات التي تفتقر إلى metadata.yaml. استمر في التعامل مع SQL الافتراضي المخزَّن باعتباره قدرة كتابة على Dataset وقت الاستعلام.