
Exploit de preuve de concept démontrant les vulnérabilités CVE-2020-25265 et CVE-2020-25266, utilisant un fichier MP3 spécialement conçu pour exécuter du code arbitraire via libappimage et appimaged, en remplaçant les applications système.
Ceci est une preuve de concept (PoC) d'exploitation de libappimage et appimaged.
En combinant les deux CVE, on peut créer un fichier qui ne semble pas être une appimage, mais qui est implicitement détecté et installé par appimaged, remplaçant ainsi une version installée du système de la même application.
Dans ce cas, un fichier MP3 a été utilisé comme charge utile, et Nautilus était l'application remplacée.
Cela affecte toutes les versions d'appimaged et toutes les versions de libappimage antérieures à 1.0.3.
Le codec MP3 n'a pas d'en-tête de fichier, donc les logiciels multimedia doivent parcourir le fichier à la recherche d'un en-tête de trame. Cela signifie que nous pouvons placer les en-têtes ELF et AppImage de type 2 au début du fichier, et le MP3 sera toujours lisible. Cela fait du MP3 une cible de choix pour cette PoC.
Un fichier MP3 est modifié pour contenir un binaire de charge utile après le média joué, un script Dart étant utilisé pour placer les données MP3 entre l'exécutable de charge utile et l'en-tête ELF. (Notez que je n'ai pas ajusté les emplacements des symboles dans la table des symboles, car cela aurait demandé plus d'efforts et n'était pas nécessaire pour cette PoC.) Le binaire de charge utile fait moins de 1 Mo, donc il n'entraîne pas d'augmentation notable de la taille du fichier. À la toute fin du fichier, un système de fichiers squashfs est ajouté, contenant le faux fichier .desktop de Nautilus et son icône.
Notez que, bien qu'ajouter le MP3 à la fin du squashfs aurait techniquement fonctionné, cela a plus de chances de confondre les lecteurs multimédias car il apparaît si tard dans le fichier, alors que juste après l'en-tête ELF, il n'est qu'à quelques dizaines d'octets dans le fichier.
appimaged scanne tous les fichiers dans tous les répertoires surveillés, indépendamment de l'extension du fichier. Lorsqu'il détecte le MP3, il détecte les en-têtes ELF et AppImage, et procède à l'extraction du fichier .desktop qu'il contient.
Le fichier .desktop malveillant est maintenant écrit et pointe vers le MP3 malveillant. Lorsque l'utilisateur lance Fichiers (Files) la prochaine fois, il démarrera l'exécutable ELF intégré dans le MP3 au lieu de l'installation système.
Normalement, le fichier .desktop serait nommé "appimagekit_...desktop", donc il ne pourrait pas remplacer entièrement les applications système. Cependant, Integrator.cpp dans libappimage récupère le champ Name sans validation ni échappement, donc nous pouvons ajouter ceci au fichier .desktop malveillant :
Name=/../org.gnome.Nautilus
Name[en]=Files
et le fichier sera écrit vers ~/.local/share/applications/org.gnome.Nautilus.desktop, masquant ainsi le Nautilus installé par le système.
Assurez-vous que votre version installée de libappimage est au moins la 1.0.3, qui corrige la validation du champ Name.
Notamment, cela n'inclut pas actuellement la version de libappimage de Debian, qui est assez obsolète.
Toutes les versions d'appimaged sont vulnérables, et le projet a été déprécié.
go-appimage évite le problème de nom de fichier en ne détectant que les appimages nommées
*.AppImage. AppImageLauncher évite le problème de nom de fichier en
demandant à l'utilisateur l'autorisation d'installer avant l'installation.
Placez un fichier audio aléatoire dans audio.mp3 et exécutez dart bin/write_mp3.dart pour construire la charge utile et écrire le
fichier MP3 modifié. Vous avez besoin du SDK Dart et de FreePascal installés pour que cela fonctionne.
Pascal a été utilisé pour le binaire car il produisait les exécutables statiquement liés les plus petits parmi les autres langages testés (C lié statiquement avec musl, Go) lors de l'utilisation de fonctionnalités de sous-processus.
Lors des tests, world.execute(me) a été utilisé comme fichier audio, car cela semblait approprié.