I ricercatori del Google Project Zero hanno pubblicato un metodo di sfruttamento di una vulnerabilità (CVE-2020-29661) nell'implementazione del gestore ioctl TIOCSPGRP nel sottosistema tty del kernel Linux, esaminando inoltre in dettaglio i meccanismi di protezione che potrebbero bloccare tali vulnerabilità.
L'errore problematico è stato corretto nel kernel Linux il 3 dicembre dello scorso anno. La problematica si manifesta nei kernel precedenti alla versione 5.9.13, ma la maggior parte delle distribuzioni ha risolto il problema negli aggiornamenti dei pacchetti del kernel proposti già l'anno scorso (Debian, RHEL, SUSE, Ubuntu, Fedora, Arch). Una vulnerabilità simile (CVE-2020-29660) è stata trovata simultaneamente nell'implementazione della chiamata ioctl TIOCGSID, ma è già stata ampiamente corretta.
Il problema è causato da un errore nell'installazione dei blocchi, che porta a una condizione di gara nel codice drivers/tty/tty_jobctrl.c, che è stato possibile sfruttare per creare condizioni di accesso alla memoria dopo che è stata liberata (use-after-free), sfruttabile dallo spazio utente attraverso manipolazioni con la chiamata ioctl TIOCSPGRP. Un exploit di lavoro è stato dimostrato per l'escalation dei privilegi in Debian 10 con kernel 4.19.0-13-amd64.
Nell'articolo pubblicato, l'accento non è posto tanto sulla tecnica di creazione di un exploit funzionante, quanto sugli strumenti nel kernel esistenti per la protezione contro tali vulnerabilità. La conclusione è poco rassicurante: metodi come la segmentazione della memoria in heap e il controllo degli accessi alla memoria dopo la sua liberazione non sono praticati, poiché portano a una diminuzione delle prestazioni, e la protezione basata su CFI (Control Flow Integrity), che blocca gli exploit nelle fasi avanzate dell'attacco, richiede miglioramenti.
Considerando cosa potrebbe cambiare la situazione a lungo termine, si fa notare l'uso di analizzatori statici avanzati o linguaggi che garantiscono un uso sicuro della memoria, come Rust e dialetti del C con annotazioni estese (ad esempio, Checked C), nella fase di compilazione per controllare lo stato dei blocchi, degli oggetti e dei puntatori. Tra i metodi di protezione si menziona anche l'attivazione della modalità panic_on_oops, la traduzione delle strutture del kernel in modalità sola lettura e la restrizione dell'accesso alle chiamate di sistema tramite meccanismi come seccomp.
Fonte: opennet.ru
