
Inyección SQL en el optimizador de agregación de MongoLite a través de toJsonExtractRaw()
cockpithq/cockpit:core-2.13.47fe563023b7fae854c857d2e2dc0878ef28fbb5f (etiqueta 2.13.4)CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:NSe ha identificado una vulnerabilidad de Inyección SQL en Cockpit CMS (Edición Core versión 2.13.4). La vulnerabilidad existe dentro del Optimizador de Agregación de , específicamente en el método . Los nombres de campos controlados por el usuario se concatenan directamente en las consultas SQL sin una sanitización adecuada.
MongoLitetoJsonExtractRaw()Un atacante autenticado con acceso de lectura (mediante una clave API) a un Modelo de Contenido puede inyectar comandos SQL arbitrarios en el pipeline de agregación a través del endpoint REST /api/content/aggregate/{model}.
Esta falla permite a los atacantes:
_state=1) para leer borradores no publicados.sqlite_master.Los siguientes pasos demuestran cómo un atacante puede evadir el filtro de autorización _state=1.
testcol.title y body.Captura de pantalla: Configuración del modelo de contenido testcol

MasterRole) para que tenga permiso de LECTURA para el modelo testcol.Captura de pantalla: Configuración de permisos de rol para la colección

MasterRole que acaba de configurar. Copie el valor de la clave (por ejemplo, API-b8e8...).Captura de pantalla: Configuración de la clave API con el rol de acceso de lectura

Public y establezca su estado en PUBLICADO (icono verde).SECRET_DRAFT y establezca su estado en NO PUBLICADO (icono rojo).Captura de pantalla: La lista de elementos que muestra un elemento publicado y otro no publicado

De forma predeterminada, las consultas API estándar solo devolverán contenido cuyo estado sea Publicado. Sin embargo, al inyectar SQL en el pipeline de agregación, se puede evadir el filtro de contenido publicado.
json_extract() y agrega un comentario SQL -- para neutralizar el SQL final, apuntando específicamente a la cláusula WHERE que limita los resultados a elementos publicados.Campo inyectado:
$title') as _id FROM collections_testcol--
Pipeline JSON completo:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol. Asegúrese de reemplazar YOUR_API_KEY con la clave generada en el Paso 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"
Como se muestra en la captura de pantalla final a continuación, la respuesta de la API devuelve correctamente el elemento SECRET_DRAFT a pesar de estar marcado explícitamente como NO PUBLICADO. Esto confirma que la inyección SQL evita el mecanismo de autorización central de la aplicación y permite la extracción de datos no autorizada a través de la API.
Captura de pantalla: Extracción exitosa de los datos no publicados 'SECRET_DRAFT'

En una implementación clásica de CMS headless, una clave API pública de solo lectura a menudo está incrustada/codificada en el JavaScript del frontend. Al explotar esta vulnerabilidad a través del endpoint API público, un atacante puede:
content.sqlite, incluidas las colecciones para las que la clave API no está autorizada.sqlite_master para descubrir todos los nombres y estructuras de tablas.| Fecha | Acción |
|---|---|
| 2026-02-28 | Vulnerabilidad descubierta durante una investigación de seguridad autorizada |
| 2026-03-02 | Informe enviado al proveedor |
| 2026-03-02 | Corrección del proveedor -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0 |
| 2026-03-09 | Parche publicado v 2.13.5 -- https://getcockpit.com/releases |