
Proof-of-concept exploit che dimostra CVE-2020-25265 e CVE-2020-25266, utilizzando un file MP3 appositamente creato per ottenere l'esecuzione di codice arbitrario tramite libappimage e appimaged, sovrascrivendo le applicazioni di sistema.
Questo è un exploit PoC di libappimage e appimaged.
Utilizzando una combinazione delle due CVE, si può creare un file che non sembra essere un appimage che viene sia individuato implicitamente da appimaged sia installato, sovrascrivendo una versione installata a livello di sistema della stessa applicazione.
In questo caso, un file MP3 è stato usato come payload e Nautilus è stata l'applicazione sovrascritta.
Questo riguarda tutte le versioni di appimaged e tutte le versioni di libappimage precedenti alla 1.0.3.
Il codec MP3 non ha un header di file, quindi i software multimediali devono scansionare il file alla ricerca di un header di frame. Questo significa che possiamo posizionare gli header ELF e AppImage di tipo 2 all'inizio del file, e l'MP3 sarà comunque riproducibile. Questo rende l'MP3 un bersaglio ideale per questo PoC.
Un file MP3 viene modificato per contenere un binario payload dopo il media riprodotto, con uno script Dart usato per posizionare i dati MP3 tra l'eseguibile payload e l'header ELF. (Nota: non ho regolato le posizioni dei simboli nella tabella dei simboli, perché avrebbe richiesto più sforzo e non era necessario per questo PoC.) Il binario payload è più piccolo di 1 MB, quindi non causa un aumento evidente della dimensione del file. Alla fine del file, un filesystem squashfs viene aggiunto, contenente il falso file desktop di Nautilus e l'icona.
Nota che, sebbene aggiungere l'MP3 alla fine dello squashfs avrebbe tecnicamente funzionato, c'è una maggiore probabilità di confondere i lettori multimediali perché appare così tardi nel file, mentre subito dopo l'header ELF si è a solo poche decine di byte dall'inizio del file.
appimaged scansiona tutti i file in tutte le directory monitorate, indipendentemente dall'estensione del file. Quando rileva l'MP3, individua gli header ELF e AppImage e procede a estrarre il file desktop contenuto al suo interno.
Il file desktop rogue viene ora scritto e punta all'MP3 malevolo. La prossima volta che l'utente avvia Files, avvierà l'eseguibile ELF incorporato nell'MP3 invece dell'installazione di sistema.
Normalmente, il file desktop sarebbe chiamato "appimagekit_...desktop", quindi non sarebbe in grado di sovrascrivere completamente alcuna applicazione di sistema. Tuttavia, Integrator.cpp in libappimage preleva il campo Name senza validazione o escaping, quindi possiamo aggiungere questo al file desktop rogue:
Name=/../org.gnome.Nautilus
Name[en]=Files
e il file verrà scritto in ~/.local/share/applications/org.gnome.Nautilus.desktop, mascherando così il Nautilus installato a livello di sistema.
Assicurati che la versione di libappimage installata sia almeno la 1.0.3, che corregge la validazione del campo Name.
È importante notare che questo non include al momento la libappimage di Debian, che è piuttosto datata.
Tutte le versioni di appimaged sono vulnerabili e il progetto è stato deprecato.
go-appimage evita il problema del nome file rilevando solo gli appimage denominati
*.AppImage. AppImageLauncher evita il problema del nome file
chiedendo all'utente il permesso di installare prima che l'installazione abbia luogo.
Metti un file audio casuale in audio.mp3 ed esegui dart bin/write_mp3.dart per costruire il payload e scrivere il file MP3 modificato. Perché questo funzioni, devi avere installati Dart SDK e FreePascal.
Pascal è stato usato per il binario perché produceva i binari staticamente collegati più piccoli tra gli altri linguaggi testati (C collegato staticamente tramite musl, Go) quando si utilizza la funzionalità di subprocess.
Nei test, world.execute(me) è stato usato come file audio, perché sembrava appropriato.