
Una guida forense pratica di CVE-2025-59359, una critica vulnerabilità di iniezione di comandi del sistema operativo in Chaos-Mesh. Scopri come gli attaccanti dirottano i cluster Kubernetes tramite mutazioni GraphQL e come rilevare, analizzare e segnalare la violazione utilizzando ELK.
Un walkthrough forense pratico di CVE-2025-59359, una vulnerabilità critica di OS command injection in Chaos-Mesh. Impara come gli attaccanti possono dirottare i cluster Kubernetes tramite mutazioni GraphQL, e come rilevare, analizzare e segnalare la violazione utilizzando ELK.
Di Mark Mallia
CVE-2025-59359 espone una vulnerabilità critica di OS command injection nel Controller Manager di Chaos-Mesh. Questa vulnerabilità consente agli attaccanti di eseguire comandi shell arbitrari su tutti i pod Kubernetes, portando potenzialmente al completo compromesso del cluster. Questo articolo simula l'exploit, ne mappa l'impronta forense e delinea le strategie di rilevamento e mitigazione rilevanti sia per i team tecnici che per le parti interessate esecutive.
Nel mondo in continua evoluzione della sicurezza di Kubernetes, CVE-2025-59359 si distingue come un duro promemoria di come un singolo input trascurato possa scompigliare un intero cluster. Questa vulnerabilità critica (CVSS 9.8) colpisce il Controller Manager di Chaos-Mesh, dove i parametri forniti dall'utente vengono sconsideratamente concatenati in comandi shell senza alcun controllo o sanificazione. Il risultato? Un attaccante non autenticato all'interno del cluster può eseguire comandi arbitrari su tutti i pod, ottenendo il controllo completo con allarmante facilità. È un caso da manuale di escalation dei privilegi tramite command injection, e un potente esempio del perché i comandamenti di codifica sicura negli ambienti cloud-native siano importanti.
La vulnerabilità risiede all'interno della mutazione cleanTcs. Questa mutazione pulisce le impostazioni di Linux traffic control (TC) dopo gli esperimenti di chaos e accetta parametri forniti dall'utente dalle specifiche degli esperimenti.
Quando un attaccante fornisce un valore appositamente modificato per quei parametri, il comando shell risultante viene costruito tramite concatenazione di stringhe. Non vengono eseguiti controlli difensivi prima che questo comando venga eseguito con i privilegi del Controller Manager, il che significa che un utente non autenticato può iniettare comandi arbitrari in qualsiasi pod o namespace controllato dal cluster.
Di seguito è riportato un estratto del codice sorgente della mutazione (mostrato nel contesto della sua implementazione Go).
// cleanTcsMutation.go
func executeCleanTcs(ctx context.Context, payload Payload) error {
// Build command string using user input directly
cmd := fmt.Sprintf(
"tc qdisc add dev %s root handle 1: htb rate %s ceil %s",
payload.Device,
payload.Rate,
payload.Ceil,
)
log.Debugf("Running command: %s", cmd)
if err := ctx.RunCommand(cmd); err != nil {
return fmt.Errorf("tc clean mutation failed: %w", err)
}
return nil
}
Device, Rate e Ceil.Immagina un cluster Kubernetes che esegue Chaos-Mesh, dove un attaccante crea una specifica di esperimento apparentemente innocua. Ma invece di regolare il traffic control, inseriscono un payload come ; rm -rf /tmp in campi come Device, Rate o Ceil. Una volta inviato tramite UI o API, la mutazione costruisce ed esegue ciecamente il comando—nessuna sanificazione, nessuna protezione. E poiché viene eseguito con i privilegi del controller-manager, il codice iniettato si diffonde attraverso i pod come un incendio. Peggio ancora, se l'attaccante sfrutta anche CVE-2025-59358 per accedere all'endpoint GraphQL senza autenticazione, non ha nemmeno bisogno di credenziali.
Se sfruttata in produzione, CVE-2025-59359 potrebbe consentire agli attaccanti di interrompere i servizi, accedere a carichi di lavoro sensibili e spostarsi attraverso i namespace—ponendo un rischio materiale per la continuità aziendale e la conformità normativa. Le organizzazioni che utilizzano Chaos-Mesh dovrebbero dare priorità alla correzione delle patch, all'applicazione del RBAC e al controllo degli endpoint GraphQL.
| Tattica | Tecnica |
|---|---|
| Esecuzione | T1059 – Comando e Interprete di Scripting |
| Escalation dei Privilegi | T1068 – Sfruttamento per l'Escalation dei Privilegi |
| Movimento Laterale | T1021 – Servizi Remoti |
| Impatto | T1499 – Denial of Service degli Endpoint |
cleanTcs.Crea un file logstash-tcs.conf nella tua directory di configurazione di Logstash.
input {
beats {
port => 5044
codec => "json"
}
}
filter {
# The Python script will be referenced here.
python {
code => "/opt/elk/python/process_tcs.py"
add_field => { "[tcs]" => "%{[message][device]}-%{[message][rate]}-%{[message][ceil]}" }
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "chaos-tcs"
document_type => "experiment"
codec => "json"
}
}
### Script di Filtro Python – process_tcs.py
#!/usr/bin/python3
def process(event):
"""
Transforms the raw event from Logstash into a JSON document suitable for Elasticsearch.
Expected input format (example):
{
"message": {
"device": "eth0",
"rate": "100mbit/s",
"ceil": "200mbit/s",
"timestamp": "2025‑09‑18T14:33:00Z"
}
}
The script extracts the three key values, normalises them and returns a dictionary.
"""
# 1. Grab nested fields
device = event.get("message", {}).get("device", "")
rate = event.get("message", {}).get("rate", "")
ceil = event.get("message", {}).get("ceil", "")
# 2. Normalise numeric values – remove unit suffixes and cast to float.
def strip_unit(val, unit):
return float(val.replace(unit, "").strip())
rate_val = strip_unit(rate, "mbit/s")
ceil_val = strip_unit(ceil, "mbit/s")
# 3. Build output dict
result = {
"device": device,
"rate_mbit_s": rate_val,
"ceil_mbit_s": ceil_val,
"ts": event.get("message", {}).get("timestamp", ""),
"tcs_id": f"{device}-{rate_val}-{ceil_val}"
}
# 4. Return the dict
return result
### Mappatura dell'Indice Elasticsearch
Crea un file di mapping chaos-tcs-mapping.json:
{
"mappings": {
"_doc": {
"properties": {
"device": { "type": "keyword" },
"rate_mbit_s":{ "type":"float" },
"ceil_mbit_s":{ "type":"float" },
"ts": { "type":"date", "format":"yyyy-MM-dd'T'HH:mm:ssZ"},
"tcs_id": { "type":"keyword" }
}
}
}
}