Attacchi CMDi (Command injection) in Kubernetes Log Query Attacchi CMDi (Command injection) in Kubernetes Log Query

Tomer Peled

scritto da

Tomer Peled

January 24, 2025

Tomer Peled

scritto da

Tomer Peled

Tomer Peled è Security Researcher in Akamai. Nell'ambito delle sue mansioni quotidiane, si occupa di condurre ricerche su vari argomenti, dalla vulnerabilità ai componenti interni dei sistemi operativi. Nel tempo libero, adora cucinare, praticare il Krav Maga e giocare al PC.

Se non avete ancora applicato una patch per questa vulnerabilità, è una buona idea dare priorità a questa operazione.
Se non avete ancora applicato una patch per questa vulnerabilità, è una buona idea dare priorità a questa operazione.

Editoriale e commenti aggiuntivi di Tricia Howard

Analisi riassuntiva

  • Tomer Peled, ricercatore della sicurezza di Akamai, ha recentemente scoperto una vulnerabilità in Kubernetes, a cui è stato assegnato il codice CVE-2024-9042.

  • La vulnerabilità consente l'esecuzione di codice da remoto con privilegi di SISTEMA su tutti gli endpoint Windows all'interno di un cluster Kubernetes. Per sfruttare questa vulnerabilità, è necessario configurare il cluster in modo da eseguire il nuovo meccanismo di registrazione “Log Query”.

  • È possibile attivare la vulnerabilità con una semplice richiesta GET al nodo remoto.

  • Lo sfruttamento di questa vulnerabilità può portare al controllo completo di tutti i nodi di Windows in un cluster.

  • Questa vulnerabilità può essere sfruttata nelle installazioni predefinite di Kubernetes che utilizzano le funzioni beta (precedenti alla versione 1.32.1) ed è stata testata sia nelle distribuzioni on-premise sia in Azure Kubernetes Service.

  • In questo blog, viene fornito un comando cURL PoC (Proof-of-Concept) e vengono esaminate le possibili mitigazioni.

Introduzione

Kubernetes e i container, in generale, sono diventati una forza predominante nel settore della sicurezza e, in quanto tale, un punto di interesse per i ricercatori in tutto il mondo (noi inclusi). Il percorso della nostra ricerca, inizialmente, ci ha condotto alla vulnerabilità CVE-2023-3676, una vulnerabilità CMDi (Command injection) che può essere sfruttata applicando un file YAML dannoso YAML sul cluster. Questa ricerca ha portato all’individuazione di molti altri problemi nel codice sorgente di Kubernetes che consentono di assumere il controllo completo del cluster.

Non abbiamo trovato solo queste vulnerabilità, ma sono emersi anche risultati importanti nel progetto collaterale git-sync, che abbiamo presentato in occasione del Red Team Village al DEF CON 32 e, durante la preparazione della conferenza, ci siamo imbattuti nell’argomento di questo blog: un’altra opportunità per gli attacchi CMDi (Command injection), la funzione beta di Kubernetes per il suo principale strumento di registrazione denominato Log Query.

Che cos’è Log Query?

Log Query consente agli utenti di effettuare query ai computer remoti sullo stato dei loro sistemi utilizzando il comando CLI o cURL. Ad esempio, è possibile digitare il seguente comando per effettuare una query sullo stato del servizio kubelet in un nodo remoto:

  kubectl get --raw "/api/v1/nodes/node-1.example/proxy/logs/?query=kubelet"

Quando abbiamo visto il comando riportato nell’esempio qui sopra, ci è venuta in mente la nostra ricerca precedente: la query inviata al computer remoto viene verificata?

Nella Figura 1, viene riportato un esempio del codice sorgente per Log Query, in cui abbiamo individuato la creazione di vari comandi PowerShell.

Questi comandi vengono usati per recuperare i registri da un nodo specifico sulla base di vari parametri, come i nomi dei servizi di Windows, i modelli dei tempi di utilizzo e molti altri.

In base a precedenti esperienze (CVE-2023-3676), sappiamo che Kubernetes non verifica necessariamente gli input degli utenti prima di inserirli come parametri durante la creazione di un comando PowerShell. Quindi, poiché volevamo vedere se era questo il caso anche di Log Query, abbiamo riscontrato che i nomi dei servizi vengono effettivamente verificati tramite un comando regex predefinito (Figura 2).

Il nome reServiceNameUnsafeCharacters implica che questo controllo riguarda solo i servizi. Questa ipotesi è stata ulteriormente rafforzata dal fatto che non sono presenti altri comandi regex nel processo di analisi.

Dopo aver esaminato altri parametri, è sembrato chiaro che, infatti, l’unico parametro verificato era il nome del servizio. Possiamo quindi esaminare altri parametri nella speranza di individuare una vulnerabilità CMDi (Command injection). In Log Query, esistono molti altri parametri opzionali che gli utenti possono fornire, ma l’unica stringa è rappresentata dal parametro Pattern (Figura 3). Come abbiamo detto in precedenza, questo parametro non viene verificato (ad eccezione del controllo sulla sua lunghezza).

È importante notare che lo sfruttamento di questa vulnerabilità non è stato banale. Abbiamo tentato di attivare i comandi sul computer remoto tramite diverse varianti del payload di PowerShell, come l’aggiunta di parentesi, l’utilizzo di separatori, ecc. Tuttavia, nulla sembrava funzionare: non si riscontravano errori di alcun tipo, il che ha reso la cosa ancora più difficile.

Il problema non è rappresentato dal payload

Dopo aver provato molti metodi CMDi, alla fine abbiamo scoperto che il problema non era costituito dal payload in sé. Per sfruttare questa vulnerabilità, abbiamo bisogno di specificare un servizio che registra il suo stato in modo nativo in ETW (Event Tracing for Windows) e non nel sistema standard klog perché il controllo delle vulnerabilità avviene solo durante la registrazione in ETW.

Un ambiente Kubernetes con Calico (una comune interfaccia di rete open source per Kubernetes) consente di sfruttare questa vulnerabilità in modo affidabile tramite NSSM (Non-Sucking Service Manager).

  • In una configurazione Calico, NSSM esiste, solitamente, per controllare lo stato dei servizi di Kubernetes. In altri ambienti/configurazioni, lo stato dei servizi viene gestito in altri modi.

  • Kubernetes non gestisce gli output della registrazione di NSSM, pertanto garantisce che i registri vengano scritti direttamente in ETW e non tramite klog.

Visualizza la query di un exploit

Ecco come si presenta la query di un exploit:

  curl  "<Kubernetes API Proxy server IP>/api/v1/nodes/<NODE name>/proxy/logs/?query=nssm&pattern=’\$(Start-process cmd)’"

*Il token di autenticazione richiesto per comunicare con il server API è stato revisionato

I lettori più attenti potrebbero aver notato gli apostrofi che abbiamo dovuto usare per eludere il nostro comando dannoso perché Kubernetes inserisce il nostro input tramite il comando seguente:

  …Where-Object -Property Message -Match '%s'... 

Analogamente ai classici attacchi SQL injection, dobbiamo aggiungere gli apostrofi per eludere il loro schema. In tal modo, il nostro input viene analizzato come un comando separato (Figura 4).

Una patch a cui dare priorità

Questa vulnerabilità interessa gli utenti che dispongono di una versione di Kubernetes precedente alla 1.32.1. Se non avete ancora applicato una patch per questa vulnerabilità, è una buona idea dare priorità a questa operazione. Ciò vale soprattutto per le organizzazioni con nodi di Windows che si trovano all'interno di un cluster, in cui risiede proprio la vulnerabilità. 

Fortunatamente, non è un caso che si verifica sempre. Un amministratore può facilmente verificare se il cluster della propria organizzazione contiene nodi di Windows eseguendo il comando riportato di seguito sul controller del cluster (Figura 5).

La mia azienda è vulnerabile?

È semplice stabilire se la vostra azienda è vulnerabile. Notate la parte “os=windows”. Se non sono presenti nodi di Windows, il comando non avrà alcun effetto a indicare che la vostra azienda non è vulnerabile.

Poiché si tratta di una funzione beta, è necessario configurare il cluster anche per utilizzare lo stesso sistema.

Per verificare se la funzione è attivata o meno, gli amministratori possono esaminare il parametro di avvio “feature-gate” per “kubelet.” Ulteriori informazioni sono disponibili sul sito di Kubernetes.

Analisi delle patch

Per mitigare questa vulnerabilità, Kubernetes ha deciso di utilizzare una variabile di ambiente denominata “kubelet_pattern” prima di passare il valore allo stesso comando di PowerShell.

In tal modo, l’input dell’utente verrà considerato come una stringa letterale anziché un’espressione secondaria da dover valutare.

Mitigazione

Per aiutare a mitigare questa vulnerabilità, gli amministratori possono utilizzare il modulo per il controllo degli accessi basato sui ruoli (RBAC) per verificare gli utenti che accedono a Log Query e, persino, per disattivare completamente gli accessi. Il metodo RBAC segmenta le operazioni degli utenti in base alla loro identità. Ad esempio, ogni utente può creare i pod solo nel proprio spazio dei nomi o solo visualizzare le informazioni per gli spazi dei nomi consentiti. In tal modo, viene ridotto il rischio di RCE, non solo in fase di esecuzione, ma anche durante il rilevamento, pertanto un comportamento anomalo degli utenti è, spesso, il segno indicativo di un’attività criminale. 

Tenete presente che questa vulnerabilità non riguarda solo i nodi di Windows. Se il vostro cluster di Kubernetes non contiene nodi di Windows, non siete interessati da questa specifica vulnerabilità. Tuttavia, consigliamo comunque di tenere le patch il più possibile aggiornate per evitare di incorrere in altre vulnerabilità sconosciute. 

Poiché il problema risiede nel codice sorgente, questa minaccia rimarrà attiva e lo sfruttamento della vulnerabilità è destinato a crescere. Ecco perché consigliamo vivamente di applicare la patch al cluster anche se non contiene nodi di Windows.

Conclusione

In questo blog, abbiamo mostrato come un criminale con privilegi di query può eseguire comandi su un nodo di Windows contenuto in un cluster. È possibile sfruttare questa vulnerabilità mediante un semplice comando cURL senza dover inviare un file YAML. Questo metodo, tuttavia, nasconde un rischio enorme perché, in tal caso, lo sfruttamento della vulnerabilità è più difficile da mitigare e rilevare. Questi problemi di sanificazione di Kubernetes non sono esclusivi di Log Query, come abbiamo detto in precedenza.

Il personale del supporto deve verificare la presenza di eventuali comportamenti insoliti nella propria organizzazione. Riteniamo che questo vettore di attacco possa portare ad un controllo completo del cluster, pertanto è importante per noi aumentare la consapevolezza e aiutare gli amministratori della sicurezza a conoscere il potenziale pericolo.

L'Akamai Security Intelligence Group continuerà a ricercare minacce come queste e a segnalarle per i clienti dell'azienda e per la più vasta comunità della sicurezza. Per aggiornamenti in tempo reale sulle nostre ricerche, potete seguirci su X (in precedenza Twitter).

Desideriamo ringraziare il team di Kubernetes per la risposta rapida e la trattazione efficace.

Cronologia

28/06/2024 - Vulnerabilità segnalata al team di Kubernetes

18/07/2024 - Il team di Kubernetes inizia a lavorare per risolvere il problema

30/07/2024 - Il team di Kubernetes assegna i numeri CVE

16/01/2025 - Kubernetes rilascia le correzioni CVE 

24/01/2025 - Pubblicazione del post del blog



Tomer Peled

scritto da

Tomer Peled

January 24, 2025

Tomer Peled

scritto da

Tomer Peled

Tomer Peled è Security Researcher in Akamai. Nell'ambito delle sue mansioni quotidiane, si occupa di condurre ricerche su vari argomenti, dalla vulnerabilità ai componenti interni dei sistemi operativi. Nel tempo libero, adora cucinare, praticare il Krav Maga e giocare al PC.