Il team fail0verflow presenta un vecchio bug nel sistema FreeBSD scoperto nel 2020 da un genio dell’informatica di cui non si conosce il nome, trovandolo in soli 15 minuti.
In seguito a questa scoperta, è stato sviluppato un codice in C++ per migliorare l’affidabilità degli exploit, poiché il kernel della PlayStation 5 aveva introdotto funzioni di randomizzazione della memoria.
want to play with the fbsd umtx exploit? check out https://t.co/AARWy9HR4c
— fail0verflow (@fail0verflow) September 14, 2024
Per lavorare sul bug, è necessario configurare una macchina virtuale (VM) con FreeBSD 11.0. L’immagine della VM può essere scaricata da un archivio online, e SSH deve essere abilitato sulla VM aggiungendo un utente e modificando il file di configurazione per avviare il servizio SSH.
Per ricostruire il kernel con il supporto per il debug, è necessario lavorare direttamente sulla VM, poiché la versione 11.0 di FreeBSD non è compatibile con sistemi non-FreeBSD.
Il kernel viene ricostruito rimuovendo l’opzione DDB e aggiungendo l’opzione GDB nella configurazione. Dopo aver compilato e installato il kernel, la macchina viene riavviata e il file di debug del kernel viene estratto per essere utilizzato con GDB.
Il passo successivo è impostare GDB per eseguire il debug del kernel. Il codice sorgente del kernel FreeBSD viene clonato e GDB viene ricompilato con supporto per FreeBSD.
Una volta completata questa operazione, si può avviare il debug del kernel collegandosi alla macchina virtuale, utilizzando le opzioni personalizzate per GDB per rendere il processo di debugging più efficiente e gestibile.
Di seguito tutti i passaggi descritti all’interno della repository:
- Configurazione della macchina virtuale (VM):
- Ottenere l’immagine della VM:
wget http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/VM-IMAGES/11.0-RELEASE/amd64/Latest/FreeBSD-11.0-RELEASE-amd64.vhd.xz
- Abilitare SSH: Nella VM, aggiungere un utente con il comando
adduser
, poi aggiungeresshd_enable="YES"
al file/etc/rc.conf
e avviare SSH con il comando/etc/rc.d/sshd start
.
- Ottenere l’immagine della VM:
- Ricostruzione del kernel con debug:
- Compilare sulla VM, poiché il sistema di build di FreeBSD non è compatibile con sistemi non-FreeBSD (la compatibilità è stata aggiunta con le versioni FreeBSD 12/13, ma qui serve la versione 11).
- Consultare la guida ufficiale oppure procedere come segue:
- Spostarsi nella directory del kernel:
cd /usr/src/sys/amd64/conf
- Copiare la configurazione GENERIC:
cp GENERIC /root/CONFIG
- Creare un collegamento simbolico:
ln -s /root/CONFIG
- Modificare il file
CONFIG
per rimuovere l’opzioneDDB
e aggiungere l’opzioneGDB
.
- Spostarsi nella directory del kernel:
- Compilazione e installazione:
- Compilare il kernel con:
cd /src/src
make buildkernel KERNCONF=CONFIG
- Installare il kernel:
make installkernel KERNCONF=CONFIG
- Riavviare la VM.
- Copiare il file di debug
kernel.debug
da/usr/obj/usr/src/sys/CONFIG/
fuori dalla VM per utilizzarlo con GDB.
- Compilare il kernel con:
- Configurazione di GDB:
- Ottenere il codice sorgente del kernel per la navigazione e per GDB:
git clone -b releng/11.0 https://github.com/freebsd/freebsd.git
- Compilare GDB con supporto FreeBSD:
- Scaricare l’ultima versione di GDB da:
https://ftp.gnu.org/gnu/gdb/
e decomprimere l’archivio. - Creare una directory di build e accedere:
mkdir build && cd build
- Configurare GDB:
../configure --disable-binutils --disable-ld --disable-gold --disable-gas --disable-sim --disable-gprof --target=x86_64-unknown-freebsd
- Compilare GDB:
make -j64
- Scaricare l’ultima versione di GDB da:
- Ottenere il codice sorgente del kernel per la navigazione e per GDB:
- Miglioramento di GDB:
- Utilizzare gdb-dashboard per migliorare l’esperienza di debug.
- File
.gdbinit
per il kernel FreeBSD:- Configurare il file
.gdbinit
per il kernel:- Impostare il percorso sostitutivo:
set substitute-path /usr/src /home/shawn/freebsd
- Impostare lo stile di disassemblaggio:
set disassembly-flavor intel
- Specificare il file di debug del kernel:
file kernel.debug
- Collegare GDB alla VM:
target remote /tmp/fbsd11
- Impostare il percorso sostitutivo:
- Configurare il file
- Interop con WSL:
- Utilizzare strumenti come convey e npiperelay per l’interoperabilità.
- Script per avviare GDB:
- Creare uno script shell per avviare GDB in modo flessibile:
#!/bin/sh GDB_PATH=/home/shawn/gdb-10.1/build/gdb PATH=$GDB_PATH:$PATH gdb --data-directory=/home/shawn/gdb-10.1/build/gdb/data-directory
Avvio di GDB:
- Nella VM, eseguire il comando per avviare il debug del kernel:
sysctl debug.kdb.enter=1
Download: Source code ps5-umtxdbg
Fonte: twitter.com