
Este es un exploit PoC de libappimage y appimaged.
Usando una combinación de los dos CVE, se puede crear un archivo que no parece ser un appimage, que es recogido implícitamente por appimaged e instalado, sobrescribiendo una versión instalada en el sistema de la misma aplicación.
En este caso, se usó un archivo MP3 como payload, y Nautilus fue la aplicación sobrescrita.
Esto afecta a todas las versiones de appimaged y a todas las versiones de libappimage anteriores a la 1.0.3.
El códec MP3 no tiene encabezado de archivo, por lo que el software multimedia debe escanear el archivo en busca de un encabezado de trama. Esto significa que podemos colocar los encabezados ELF y de tipo 2 de AppImage al principio del archivo, y el MP3 seguirá siendo reproducible. Esto hace que el MP3 sea un objetivo ideal para usar en este PoC.
Se modifica un archivo MP3 para que contenga un binario payload después del contenido multimedia reproducible, usando un script Dart para colocar los datos MP3 entre el ejecutable payload y el encabezado ELF. (Nótese que no ajusté las ubicaciones de los símbolos en la tabla de símbolos, ya que habría requerido más esfuerzo y no era necesario para este PoC). El binario payload tiene menos de 1 MB, por lo que no causa un aumento perceptible en el tamaño del archivo. Al final del archivo, se añade un sistema de archivos squashfs que contiene el falso archivo .desktop de Nautilus y el icono.
Nótese que, aunque añadir el MP3 al final del squashfs técnicamente habría funcionado, tiene más probabilidades de confundir a los reproductores multimedia por aparecer tan tarde en el archivo, mientras que justo después del encabezado ELF está solo a unas pocas decenas de bytes del inicio del archivo.
appimaged escanea todos los archivos en todos los directorios rastreados, independientemente de la extensión del archivo. Cuando detecta el MP3, identifica los encabezados ELF y AppImage, y procede a extraer el archivo .desktop que contiene.
El archivo .desktop malicioso ahora se escribe y apunta al MP3 malicioso. La próxima vez que el usuario ejecute Files, se iniciará el ejecutable ELF incrustado en el MP3 en lugar de la instalación del sistema.
Normalmente, el archivo .desktop se llamaría "appimagekit_...desktop", por lo que no podría sobrescribir por completo ninguna aplicación del sistema. Sin embargo, Integrator.cpp en libappimage toma el campo Name sin validación ni escape, por lo que podemos añadir esto al archivo .desktop malicioso:
Name=/../org.gnome.Nautilus
Name[en]=Files
y el archivo se escribirá en ~/.local/share/applications/org.gnome.Nautilus.desktop, enmascarando así el Nautilus instalado en el sistema.
Asegúrate de que tu versión instalada de libappimage sea al menos la 1.0.3, que corrige la validación del campo Name.
Cabe destacar que esto no incluye la libappimage de Debian por el momento, que está bastante desactualizada.
Todas las versiones de appimaged son vulnerables, y el proyecto ha sido deprecado.
go-appimage evita el problema del nombre de archivo al recoger únicamente appimages llamados
*.AppImage. AppImageLauncher evita el problema del nombre de archivo al
pedir permiso al usuario para instalar antes de que tenga lugar la instalación.
Coloca un archivo de audio aleatorio en audio.mp3 y ejecuta dart bin/write_mp3.dart para construir el payload y escribir el
archivo MP3 modificado. Necesitas tener instalados el Dart SDK y FreePascal para que esto funcione.
Pascal se usó para el binario porque produjo los binarios de enlace estático más pequeños de entre los otros lenguajes probados (C enlazado estáticamente usando musl, Go) al utilizar funcionalidad de subprocesos.
En las pruebas, se usó world.execute(me) como archivo de audio, porque parecía apropiado.