
SQL Injection in MongoLite Aggregation Optimizer via 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:NÈ stata identificata una vulnerabilità di SQL Injection in Cockpit CMS (Core Edition versione 2.13.4). La vulnerabilità risiede nell'Ottimizzatore di Aggregazione , in particolare nel metodo . I nomi dei campi controllati dall'utente vengono concatenati direttamente nelle query SQL senza una corretta sanificazione.
MongoLitetoJsonExtractRaw()Un attaccante autenticato con accesso in lettura (tramite una chiave API) a un Content Model può iniettare comandi SQL arbitrari nella pipeline di aggregazione tramite l'endpoint REST /api/content/aggregate/{model}.
Questa falla consente agli attaccanti di:
_state=1) per leggere bozze non pubblicate.sqlite_master.I seguenti passaggi dimostrano come un attaccante possa bypassare il filtro di autorizzazione _state=1.
testcol.title e body.Screenshot: Configurazione del modello di contenuto testcol

MasterRole) in modo che abbia il permesso LETTURA per il modello testcol.Screenshot: Configurazione dei permessi del ruolo per la collezione

MasterRole appena configurato. Copia il valore della chiave (ad es., API-b8e8...).Screenshot: Configurazione della chiave API con il ruolo di accesso in lettura

Public e imposta il suo stato su PUBBLICATO (icona verde).SECRET_DRAFT e imposta il suo stato su NON PUBBLICATO (icona rossa).Screenshot: Elenco degli elementi che mostra un elemento pubblicato e uno non pubblicato

Per impostazione predefinita, le query API standard restituiscono solo contenuti con stato Pubblicato. Tuttavia, iniettando SQL nella pipeline di aggregazione, il filtro per i contenuti pubblicati può essere bypassato.
json_extract() e aggiunge un commento SQL -- per neutralizzare l'SQL finale, prendendo di mira specificamente la clausola WHERE che limita i risultati agli elementi pubblicati.Campo iniettato:
$title') as _id FROM collections_testcol--
Pipeline JSON completo:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol. Assicurati di sostituire YOUR_API_KEY con la chiave generata nel Passaggio 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"
Come mostrato nello screenshot finale qui sotto, la risposta API restituisce con successo l'elemento SECRET_DRAFT nonostante sia esplicitamente marcato come NON PUBBLICATO. Ciò conferma che l'iniezione SQL bypassa il meccanismo di autorizzazione principale dell'applicazione e consente l'estrazione non autorizzata di dati tramite l'API.
Screenshot: Estrazione riuscita dei dati non pubblicati 'SECRET_DRAFT'

In una tipica implementazione headless CMS, una chiave API pubblica di sola lettura è spesso incorporata/codificata nel JavaScript del frontend. Sfruttando questa vulnerabilità tramite l'endpoint API pubblico, un attaccante può:
content.sqlite, incluse le collezioni per cui la chiave API non è autorizzata.sqlite_master per scoprire tutti i nomi e le strutture delle tabelle.| Data | Azione |
|---|---|
| 2026-02-28 | Vulnerabilità scoperta durante una ricerca di sicurezza autorizzata |
| 2026-03-02 | Report inviato al fornitore |
| 2026-03-02 | Fix del fornitore -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0 |
| 2026-03-09 | Patch rilasciata v 2.13.5 -- https://getcockpit.com/releases |