
Injeção de SQL no Otimizador de Agregação do MongoLite 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:NFoi identificada uma vulnerabilidade de Injeção de SQL no Cockpit CMS (Edição Core versão 2.13.4). A vulnerabilidade existe dentro do Otimizador de Agregação do MongoLite, especificamente no método toJsonExtractRaw(). Nomes de campos controlados pelo usuário são concatenados diretamente em consultas SQL sem sanitização adequada.
Um atacante autenticado com acesso de leitura (por meio de uma chave de API) a um Modelo de Conteúdo pode injetar comandos SQL arbitrários no pipeline de agregação por meio do endpoint REST /api/content/aggregate/{model}.
Essa falha permite que atacantes:
_state=1) para ler rascunhos não publicados.sqlite_master.As etapas a seguir demonstram como um atacante pode contornar o filtro de autorização _state=1.
testcol.title e body.Captura de tela: Configurando o modelo de conteúdo testcol

MasterRole) para que ela tenha permissão de LEITURA para o modelo testcol.Captura de tela: Configurando as permissões da função para a coleção

MasterRole que você acabou de configurar. Copie o valor da chave (por exemplo, API-b8e8...).Captura de tela: Configurando a Chave de API com a função de acesso de leitura

Public e defina seu estado como PUBLICADO (ícone verde).SECRET_DRAFT e defina seu estado como NÃO PUBLICADO (ícone vermelho).Captura de tela: A lista de itens mostrando um item publicado e um não publicado

Por padrão, consultas padrão da API retornarão apenas conteúdo cujo estado seja Publicado. No entanto, ao injetar SQL no pipeline de agregação, o filtro de conteúdo publicado pode ser contornado.
json_extract() e anexa um comentário SQL -- para neutralizar o SQL final, visando especificamente a cláusula WHERE que limita os resultados a itens publicados.Campo Injetado:
$title') as _id FROM collections_testcol--
Pipeline JSON Completo:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol. Certifique-se de substituir YOUR_API_KEY pela chave gerada na Etapa 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"
Conforme mostrado na captura de tela final abaixo, a resposta da API retorna com sucesso o item SECRET_DRAFT apesar de estar explicitamente marcado como NÃO PUBLICADO. Isso confirma que a injeção de SQL contorna o mecanismo de autorização central do aplicativo e permite a extração não autorizada de dados por meio da API.
Captura de tela: Extração bem-sucedida dos dados não publicados 'SECRET_DRAFT'

Em uma implantação clássica de CMS headless, uma chave de API pública somente leitura é frequentemente incorporada/embutida no JavaScript do frontend. Ao explorar essa vulnerabilidade por meio do endpoint público da API, um atacante pode:
content.sqlite, incluindo coleções para as quais a chave de API não está autorizada.sqlite_master para descobrir todos os nomes e estruturas de tabelas.| Data | Ação |
|---|---|
| 2026-02-28 | Vulnerabilidade descoberta durante pesquisa de segurança autorizada |
| 2026-03-02 | Relatório enviado ao fornecedor |
| 2026-03-02 | Correção do fornecedor -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0 |
| 2026-03-09 | Patch lançado v 2.13.5 -- https://getcockpit.com/releases |