
Prova di concetto per CVE-2022-0847
Di
Karan Vasudevamurthy (UTA ID: 1002164438)
Cos'è CVE?
Common Vulnerabilities and Exposures (CVE) è un elenco di vulnerabilità ed esposizioni di sicurezza informatica divulgate pubblicamente. La società MITRE ha introdotto CVE nel 1999 per identificare e classificare le vulnerabilità in software e firmware. MITRE è un'organizzazione senza scopo di lucro che gestisce centri di ricerca e sviluppo finanziati a livello federale negli Stati Uniti. CVE mira a facilitare la condivisione di informazioni sulle vulnerabilità note, così che i piani di cybersicurezza possano essere aggiornati per riflettere i problemi e i punti deboli di sicurezza più recenti. Per fare questo, CVE assegna un identificatore univoco a ogni vulnerabilità o esposizione. Attraverso gli identificatori CVE, noti anche come nomi CVE o numeri CVE. Il Common Vulnerability Scoring System (CVSS) è un insieme di standard aperti per assegnare un numero a una vulnerabilità al fine di valutarne la gravità. L'intervallo di un punteggio CVSS va da 0.0 a 10.0. Il grado di gravità della sicurezza aumenta all'aumentare del numero. Ogni ID CVE ha il formato CVE-YYYY-NNNNN. La parte YYYY è l'anno in cui è stato assegnato l'ID CVE o l'anno in cui la vulnerabilità è stata resa pubblica.
Cosa sono le pipe?
Nel contesto di CVE-2022-0847, è fondamentale comprendere il funzionamento interno delle pipe, in particolare gli attributi associati al buffer della pipe. Le pipe in Linux aiutano a trasferire dati tra processi, dove l'output di un processo diventa l'input per un altro. Questo meccanismo facilita la comunicazione e il coordinamento tra diversi processi in esecuzione sul sistema. Le pipe in Linux sono unidirezionali, il che significa che i dati fluiscono in una sola direzione. Un buffer di pipe consiste tipicamente in una struttura dati first-in-first-out (FIFO) di dimensione fissa che detiene temporaneamente i dati trasferiti tra processi. Quando un processo scrive dati in una pipe, questi vengono memorizzati nel buffer finché un altro processo non li legge. Una volta letti, i dati vengono rimossi dal buffer, consentendo di scrivere nuovi dati.
La vulnerabilità
Per CVE-2022-0847, è importante comprendere due funzioni all'interno del buffer di pipe-
Pagina | 1
Max Kellermann ha scoperto che il kernel Linux gestiva in modo errato le pipe Unix. La vulnerabilità nasce da un'inizializzazione inadeguata di alcuni attributi, in particolare del parametro "flags", all'interno delle funzioni "copy_page_to_iter_pipe" e "push_pipe". Questa svista porta alla possibilità che vengano assegnati ai flag valori obsoleti o errati, compromettendo potenzialmente la sicurezza e l'integrità del sistema. Un utente locale non privilegiato potrebbe sfruttare questo difetto per scrivere in pagine della cache delle pagine supportate da file di sola lettura e, quindi, aumentare i propri privilegi sul sistema.
Metodologia di attacco
È simile a CVE-2016-5195 "Dirty Cow" ma è più facile da sfruttare. Lo sfruttamento di CVE-2022-0847 richiede l'accesso locale al sistema di destinazione e interessa le versioni del kernel Linux successive alla 5.8. Possiamo creare nuovi buffer di pipe con il flag PIPE_BUF_FLAG_CAN_MERGE impostato erroneamente a causa della mancata corretta inizializzazione. Questo flag controlla la coalescenza delle scritture in un buffer di pipe e consente quindi di scrivere in una pagina esistente innestata (spliced) nella pipe. Se un file consente questa pagina innestata, la modifica sarà visibile nella vista condivisa a livello di sistema del file in memoria. Qualsiasi successivo flush della cache ignorerà le attuali impostazioni dei permessi Linux e copierà i dati alterati su disco. Ciò consentirebbe a un utente non privilegiato di modificare contenuti specifici di un file (su disco o in memoria), anche se il file è protetto da modifiche solo da controlli di accesso in sola lettura come SELinux, permessi Linux standard, controllo degli accessi avanzato e file immutabili. Possiamo quindi supporre che l'attaccante possa essere qualsiasi utente locale non privilegiato con conoscenze di base dei sistemi Linux e la capacità di eseguire codice malevolo. Tale individuo potrebbe elevare i propri privilegi e potenzialmente compromettere l'intero sistema, rappresentando un rischio significativo per la sicurezza.
Prova di concetto
Di seguito sono riportati i passaggi che ho seguito per sfruttare CVE-2022-0847 su una macchina virtuale con Linux.
Verificare se la propria distribuzione Linux può essere sfruttata-
Qualsiasi kernel Linux successivo alla 5.8 è interessato. Tuttavia, le versioni 5.16.11, 5.15.25 e 5.10.102 non possono essere sfruttate per CVE-2022-0847. Per trovare la versione del proprio kernel, possiamo semplicemente eseguire *uname -r*. Puoi anche eseguire questo script bash se non sei sicuro se un sistema di destinazione sia vulnerabile o meno.
Scaricare il kernel Linux giusto-
Per la dimostrazione ho deciso di usare Ubuntu 20.04.1 LTS. Tuttavia, questa versione di Ubuntu attualmente esegue il kernel Linux 5.15 e CVE-2022-0847 non può essere sfruttato su questa versione del kernel. Per scaricare il kernel Linux 5.8, possiamo semplicemente eseguire *sudo apt install linux-image-5.8.0-63-generic linux-headers-5.8.0-63-generic*
Scaricare l'exploit-
L'exploit può essere trovato su GitHub. Dimostra come sovrascrivere qualsiasi contenuto di file nella cache delle pagine, anche se il file non è permesso in scrittura, è immutabile o si trova su un mount di sola lettura. Puoi anche eseguire *git clone[ https://github.com/karanlvm/Infosec.git* ](https://github.com/karanlvm/Infosec.git%60)*nel terminale.
Copiare il file passwd originale-
Possiamo eseguire *cp /etc/passwd /tmp/passwd.bak*. Questo ci aiuterà a identificare la differenza nel file passwd prima e dopo l'esecuzione dell'exploit.
Compilare l'exploit-
Per compilare l'exploit con successo, avrai bisogno di avere GCC installato. Puoi installare GCC con *sudo apt-get install gcc*. Per compilare l'exploit puoi eseguire
Limitazioni
Ci sono due limitazioni principali di questo exploit:
Stato attuale e rimedio
Al 2024-01-12, la probabilità di attività di sfruttamento nei successivi 30 giorni è del 7.58% (Exploit prediction scoring system (EPSS)). Di seguito è riportato il CVSS (Common Vulnerability Scoring System) per CVE-2022-0487:
Questa vulnerabilità può essere sfruttata su qualsiasi kernel Linux successivo alla 5.8. Tuttavia, la vulnerabilità è stata corretta in Linux 5.16.11, 5.15.25 e 5.10.102. Quindi, possiamo semplicemente applicare le patch o gli aggiornamenti forniti dai manutentori delle distribuzioni Linux per correggere la vulnerabilità. Per fare questo, possiamo semplicemente eseguire i seguenti comandi *sudo apt update* e *sudo apt upgrade*.
Riferimenti
*gcc exp.c -o exp*Eseguire l'exploit-
Per eseguire l'exploit, i parametri da fornire sono il file in sola lettura, l'offset e alcuni caratteri che verranno inseriti. In questo caso, eseguiremo *./exp /etc/passwd 1 ootz:* . Se ottieni un output che dice “It worked !”, significa che abbiamo sfruttato con successo la vulnerabilità Dirty Pipe e ora possiamo ottenere l'accesso root senza password.
Passare all'accesso root-
Ora possiamo semplicemente eseguire *su rootz* e dovremmo avere accesso root. Per confermarlo possiamo eseguire il comando id.