
Un exploit completamente pubblico della vulnerabilità RCE Android BlueFrag CVE-2020-0022 (testato su Pixel 3 XL)
Un grande ringraziamento a Insinuator per il loro fantastico post sul blog e codice!
Tutti i passaggi menzionati nel post di Insinuator sono stati completati, e anche di più. Sono molti passaggi da inserire in un file README.md, quindi sentiti libero di consultare il post di Insinuator menzionato sopra.
L'exploit è pienamente completo fino al punto in cui:
Questo exploit differisce dall'implementazione di Insinuator nei seguenti modi:
libandroid_runtime.so piuttosto che in libicuuc.so, perché su questo telefono/bersaglio funzionava meglioexecv direttamente e una che chiama fork e poi execvlibandroid_runtime.so ed estrae gli offset di funzioni e gadget (per facilitare il porting dell'exploit su altri bersagli)Questo è un video demo che mostra l'exploit mentre modifica il PC per puntare a un indirizzo personalizzato:

La prima iterazione della catena è quella che si può vedere in jop_experiment. Questa catena chiama execv direttamente senza chiamare fork. Può essere trovata nel commit ca28fdf. Questo è ciò che accade quando si usa questa catena:

La seconda iterazione della catena è quella che chiama fork e poi execv. I dettagli completi di questa catena si trovano qui. Questo è ciò che accade quando si usa questa catena:

Fortunatamente, Pixel 3 XL ha protezioni che impediscono al processo bluetooth di chiamare fork e/o execv. In termini di condivisione di conoscenza o di esibizionismo, il mio lavoro qui è finito. Se scrivessi e condividessi qualcosa di più avanzato, potrebbe essere troppo utile per i black-hat.
Considero questo exploit completo. Miglioramenti futuri potrebbero essere:
dlsym e poi mprotect per eseguire shellcode personalizzatoTutte queste cose trasformano questo progetto da un divertente progetto di condivisione di conoscenza a un exploit black-hat che può essere armato, quindi è qui che il mio viaggio finisce, per ora.... Se avete domande, non esitate a contattarmi.
Per eseguire l'exploit, basta eseguire:
make build run ARGS="00:00:00:00:00:00"
Dove 00:00:00:00:00:00 è l'indirizzo MAC del dispositivo bersaglio/vittima. Oltre a make clean, il resto degli obiettivi di build è utile solo se stai cercando di modificare, migliorare o reimplementare l'exploit, quindi non c'è bisogno di menzionarli in dettaglio.
gdbserver si trova nella cartella NDK# On target
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# On host
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# On host
adb push ./gdbinit /data/local/tmp/gdbinit
# On target
su
/data/data/com.termux/files/usr/bin/gdb -q -x /data/local/tmp/gdbinit -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# OR
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
Puoi riavviare il servizio bluetooth sulla macchina dell'attaccante nel caso smetta di funzionare:
sudo systemctl restart bluetooth.service
Questa sezione spiega alcuni dei fenomeni osservati durante lo sviluppo di questo exploit:

base::MessageLoop usato tramite get_message_loop:
unordered_map di partial_packets. Questo è stato capito usando map_experiment

