
SQL-Injection im MongoLite-Aggregations-Optimizer über toJsonExtractRaw()
cockpithq/cockpit:core-2.13.47fe563023b7fae854c857d2e2dc0878ef28fbb5f (Tag 2.13.4)CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:NEine SQL-Injection-Schwachstelle wurde im Cockpit CMS (Core Edition Version 2.13.4) identifiziert. Die Schwachstelle existiert im MongoLite-Aggregations-Optimizer, insbesondere in der Methode . Benutzergesteuerte Feldnamen werden ohne ordnungsgemäße Bereinigung direkt in SQL-Abfragen eingefügt.
toJsonExtractRaw()Ein authentifizierter Angreifer mit Lesezugriff (über einen API-Schlüssel) auf ein Content-Modell kann über den REST-Endpunkt /api/content/aggregate/{model} beliebige SQL-Befehle in die Aggregations-Pipeline injizieren.
Dieser Fehler ermöglicht Angreifern:
_state=1) zu umgehen, um unveröffentlichte Entwürfe zu lesen.sqlite_master aufzulisten.Die folgenden Schritte zeigen, wie ein Angreifer den Autorisierungsfilter _state=1 umgehen kann.
testcol.title und body.Screenshot: Einrichtung des testcol-Content-Modells

MasterRole), sodass sie LESE-Berechtigung für das Modell testcol hat.Screenshot: Konfiguration der Rollenberechtigungen für die Sammlung

MasterRole zu. Kopieren Sie den Schlüsselwert (z. B. API-b8e8...).Screenshot: Einrichtung des API-Schlüssels mit der Rolle für Lesezugriff

Public und setzen Sie dessen Status auf VERÖFFENTLICHT (grünes Symbol).SECRET_DRAFT und setzen Sie dessen Status auf NICHT VERÖFFENTLICHT (rotes Symbol).Screenshot: Die Elementliste mit einem veröffentlichten und einem unveröffentlichten Element

Standardmäßig geben normale API-Abfragen nur Inhalte zurück, deren Status „Veröffentlicht" ist. Durch das Injizieren von SQL in die Aggregations-Pipeline kann der Filter für veröffentlichte Inhalte jedoch umgangen werden.
json_extract() aus und fügt einen SQL-Kommentar -- hinzu, um das nachfolgende SQL zu neutralisieren, wobei gezielt die WHERE-Klausel angegriffen wird, die die Ergebnisse auf veröffentlichte Elemente beschränkt.Injiziertes Feld:
$title') as _id FROM collections_testcol--
Vollständige Pipeline-JSON:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol. Ersetzen Sie YOUR_API_KEY durch den in Schritt 2.2 generierten Schlüssel: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"
Wie im letzten Screenshot unten gezeigt, gibt die API-Antwort erfolgreich das Element SECRET_DRAFT zurück, obwohl es ausdrücklich als NICHT VERÖFFENTLICHT markiert ist. Dies bestätigt, dass die SQL-Injection den zentralen Autorisierungsmechanismus der Anwendung umgeht und einen unbefugten Datenabruf über die API ermöglicht.
Screenshot: Erfolgreiche Extraktion der unveröffentlichten 'SECRET_DRAFT'-Daten

In einer klassischen Headless-CMS-Bereitstellung wird ein öffentlicher, schreibgeschützter API-Schlüssel häufig im Frontend-JavaScript eingebettet/hartcodiert. Durch die Ausnutzung dieser Schwachstelle über den öffentlichen API-Endpunkt kann ein Angreifer:
content.sqlite-Datenbank lesen, einschließlich Sammlungen, für die der API-Schlüssel nicht autorisiert ist.sqlite_master aufzählen, um alle Tabellennamen und -strukturen zu entdecken.| Datum | Aktion |
|---|---|
| 2026-02-28 | Schwachstelle während autorisierter Sicherheitsforschung entdeckt |
| 2026-03-02 | Bericht an den Anbieter übermittelt |
| 2026-03-02 | Fix des Anbieters -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0 |
| 2026-03-09 | Patch veröffentlicht v 2.13.5 -- https://getcockpit.com/releases |