
Questa è la mia semplice implementazione di un exploit per la vulnerabilità PwnKit.
Nota: Questo repository e il suo contenuto fanno parte di un Progetto Finale di Laurea (GrAL), creati esclusivamente per scopi didattici e di ricerca accademica.
Questo repository contiene una prova di concetto (PoC - Proof of Concept) per la vulnerabilità CVE-2021-4034 (nota anche come PwnKit). Questa vulnerabilità di corruzione della memoria colpisce il componente pkexec di Polkit sui sistemi Linux. Eseguendo pkexec con una lista di argomenti vuota (argc == 0), le variabili d'ambiente possono essere manipolate per forzare il caricamento di una libreria condivisa arbitraria, ottenendo così l'escalation locale dei privilegi.
Di seguito vengono descritti i passaggi necessari per preparare l'ambiente di esecuzione e sfruttare la vulnerabilità. Questo processo illustra come viene sfruttato l'errore di lettura/scrittura in memoria di pkexec:
gconv)Questo exploit abusa del modo in cui GLib gestisce la conversione dei caratteri quando tenta di stampare un messaggio di errore. A tal fine, il primo passo consiste nel creare una struttura di directory specifica che funga da repository locale di moduli di conversione GCONV per GLib.
La chiave della vulnerabilità è iniettare la variabile d'ambiente GCONV_PATH, sfruttando la scrittura oltre i limiti causata dalla condizione argc == 0 di pkexec. In questo modo, si forza il programma a utilizzare un set di caratteri anomalo, il che indica a GLib di dover cercare i moduli di conversione dei caratteri nella directory controllata creata nel passaggio precedente.
.so)Per eseguire il nostro codice, è necessario compilare una libreria condivisa (shared object o .so). Quando pkexec tenta di elaborare un set di caratteri che non riesce a trovare, caricherà questa libreria dalla nostra falsa directory gconv. Poiché pkexec è un binario con il bit SUID attivo (viene eseguito come root), al caricamento di questa libreria il nostro codice otterrà i privilegi di root, assumendo il pieno controllo del sistema (ad esempio, aprendo una shell root).
gconv-modulesInfine, nella directory locale deve essere creato un file di configurazione chiamato gconv-modules. Questo file funge da indice: dice a GLib quale libreria specifica (.so) caricare per eseguire la conversione del set di caratteri richiesto. Questo file collega la conversione richiesta da pkexec con la libreria condivisa creata nel passaggio 3.
Il progetto include un Makefile per automatizzare la compilazione del binario C e la pulizia dell'ambiente.
Per compilare il progetto: $ make
Per pulire i file generati (temporanei, cartelle e binari): $ make clean