
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 , especificamente no método . Nomes de campos controlados pelo usuário são concatenados diretamente em consultas SQL sem sanitização adequada.
MongoLitetoJsonExtractRaw()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 |