
SQL Injection in MongoLite Aggregation Optimizer via 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:NCockpit CMS (कोर संस्करण 2.13.4) में SQL इंजेक्शन भेद्यता की पहचान की गई है। यह भेद्यता MongoLite एग्रीगेशन ऑप्टिमाइज़र के भीतर, विशेष रूप से विधि में मौजूद है। उपयोगकर्ता-नियंत्रित फ़ील्ड नामों को उचित सैनिटाइज़ेशन के बिना सीधे SQL क्वेरी में जोड़ा जाता है।
toJsonExtractRaw()एक प्रमाणित हमलावर जिसके पास कंटेंट मॉडल तक पढ़ने की पहुंच (API कुंजी के माध्यम से) है, वह /api/content/aggregate/{model} REST एंडपॉइंट के माध्यम से एग्रीगेशन पाइपलाइन में मनमाना SQL कमांड इंजेक्ट कर सकता है।
यह दोष हमलावरों को निम्नलिखित सक्षम बनाता है:
_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 को निष्क्रिय करने के लिए एक SQL टिप्पणी -- जोड़ता है, विशेष रूप से उस WHERE क्लॉज़ को लक्षित करता है जो परिणामों को प्रकाशित आइटम तक सीमित करता है।इंजेक्टेड फ़ील्ड:
$title') as _id FROM collections_testcol--
पूर्ण पाइपलाइन JSON:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol एंडपॉइंट पर GET अनुरोध भेजें। 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 परिनियोजन में, एक सार्वजनिक केवल-पढ़ने वाली 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 |