
هجوم حقن SQL في مُحسِّن التجميع في MongoLite عبر toJsonExtractRaw()
cockpithq/cockpit:core-2.13.47fe563023b7fae854c857d2e2dc0878ef28fbb5f (الوسم 2.13.4)CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:Nتم تحديد ثغرة SQL Injection في Cockpit CMS (الإصدار الأساسي 2.13.4). توجد الثغرة داخل محسّن تجميع MongoLite، وتحديداً في طريقة . يتم دمج أسماء الحقول التي يتحكم فيها المستخدم مباشرة في استعلامات SQL دون تعقيم مناسب.
toJsonExtractRaw()يمكن لمهاجم مصادق يتمتع بحق الوصول للقراءة (عبر مفتاح API) إلى نموذج محتوى حقن أوامر SQL عشوائية في خط أنابيب التجميع عبر نقطة النهاية REST /api/content/aggregate/{model}.
يتيح هذا العيب للمهاجمين:
_state=1) لقراءة المسودات غير المنشورة.sqlite_master.توضح الخطوات التالية كيف يمكن للمهاجم تجاوز فلتر التفويض _state=1.
testcol.title و body.لقطة شاشة: إعداد نموذج محتوى testcol

MasterRole) بحيث يكون لديه إذن قراءة لنموذج testcol.لقطة شاشة: تكوين أذونات الدور للمجموعة

MasterRole الذي قمت بتكوينه للتو. انسخ قيمة المفتاح (مثل API-b8e8...).لقطة شاشة: إعداد مفتاح API مع دور حق الوصول للقراءة

Public واضبط حالته على منشور (أيقونة خضراء).SECRET_DRAFT واضبط حالته على غير منشور (أيقونة حمراء).لقطة شاشة: قائمة العناصر تعرض عنصراً منشوراً وعنصراً غير منشور

بشكل افتراضي، ستعيد استعلامات API القياسية المحتوى حيث تكون الحالة منشوراً فقط. ومع ذلك، من خلال حقن SQL في خط أنابيب التجميع، يمكن تجاوز فلتر المحتوى المنشور.
json_extract() وتضيف تعليق SQL -- لتحييد SQL اللاحق، مستهدفةً على وجه التحديد جملة WHERE التي تقيد النتائج بالعناصر المنشورة.الحقل المحقون:
$title') as _id FROM collections_testcol--
JSON خط الأنابيب الكامل:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol. تأكد من استبدال YOUR_API_KEY بالمفتاح الذي تم إنشاؤه في الخطوة 2.2:curl "http://localhost:8080/api/content/aggregate/testcol?api_key=YOUR_API_KEY&pipeline=%5B%7B%22%24group%22%3A%20%7B%22_id%22%3A%20%22%24title%27%29%20as%20_id%20FROM%20collections_testcol--%22%2C%20%22c%22%3A%20%7B%22%24sum%22%3A%201%7D%7D%7D%5D"
كما هو موضح في لقطة الشاشة النهائية أدناه، يعيد استجابة API بنجاح عنصر SECRET_DRAFT على الرغم من تمييزه صراحةً كغير منشور. يؤكد هذا أن حقن SQL يتجاوز آلية التفويض الأساسية للتطبيق ويسمح باستخراج بيانات غير مصرح به عبر API.
لقطة شاشة: استخراج ناجح لبيانات 'SECRET_DRAFT' غير المنشورة

في نشر CMS بدون واجهة أمامية (headless) الكلاسيكي، غالباً ما يتم تضمين/تثبيت مفتاح API عام للقراءة فقط في JavaScript الواجهة الأمامية. من خلال استغلال هذه الثغرة عبر نقطة نهاية API العامة، يمكن للمهاجم:
content.sqlite، بما في ذلك المجموعات التي لا يصرح لمفتاح API بالوصول إليها.sqlite_master لاكتشاف جميع أسماء الجداول وبنيتها.| التاريخ | الإجراء |
|---|---|
| 2026-02-28 | اكتشاف الثغرة أثناء بحث أمني مصرح به |
| 2026-03-02 | تقديم التقرير إلى البائع |
| 2026-03-02 | إصلاح البائع -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0 |
| 2026-03-09 | إصدار التصحيح v 2.13.5 -- https://getcockpit.com/releases |