💥 Accédez en illimité à
tous nos livres & vidéos, sur l'IA, le dev, les réseaux... Cliquez ici
-100€ sur l'abonnement annuel à
la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres & vidéos
  2. Cybersécurité et Malwares
  3. Malwares ciblant les systèmes Linux
Extrait - Cybersécurité et Malwares Détection, analyse et Threat Intelligence (5e édition)
Extraits du livre
Cybersécurité et Malwares Détection, analyse et Threat Intelligence (5e édition) Revenir à la page d'achat du livre

Malwares ciblant les systèmes Linux

Introduction

Linux est un système d’exploitation open source. Le nom Linux est un abus de langage, Linux n’est réellement que le noyau du système d’exploitation. La surcouche de logiciel autour du noyau Linux est appelée GNU et l’appellation GNU/Linux est parfois utilisée. Il a été créé en 1991 par Linus Torvalds. Le code source du noyau est disponible à l’adresse suivante : https://github.com/torvalds/linux

Linux est installable sous forme de distribution. Une distribution contient un noyau Linux, ainsi que les logiciels GNU et un ensemble de logiciels tiers formant un système d’exploitation opérationnel. Les distributions peuvent contenir uniquement des logiciels libres ou contenir également des logiciels propriétaires. C’est un choix des mainteneurs de la distribution. Il existe des distributions commerciales et des distributions basées sur une communauté de mainteneur volontaire. Par exemple, Red Hat Enterprise Linux (RHEL) est une distribution commerciale, maintenue par une société, et Debian est une distribution libre, maintenue par une communauté bénévole.

Linux est historiquement utilisé sur les serveurs même s’il existe des versions bureautiques de ce système d’exploitation. Pendant de nombreuses années, il y a eu une légende...

Système d’exploitation Linux

1. Historique

Dans les années 1970, le système Unix est développé par AT&T. Ce système est propriétaire et des chercheurs de l’université de Californie vont le modifier et distribuer une version sous le nom BSD (Berkeley Software Distribution). Dans les années 1980, Richard Stallman développe son projet de système d’exploitation libre compatible Unix qu’il a appelé GNU. GNU travailler sur son propre noyau Hurd mais celui-ci ne verra le jour que des années plus tard et ne sera pas adopté par la communauté. Cependant, de son côté, Linus Torvalds développe un noyau libre également compatible Unix : Linux. GNU/Linux est donc né de deux projets complémentaires. La première version du noyau Linux (0.0.1) est encore disponible en ligne : https://github.com/zavg/linux-0.01.

Les premières distributions Linux naissent dans les années 1990. Elles permettent d’installer un système d’exploitation cohérent et fonctionnel. Ces distributions fournissent le noyau Linux, les outils GNU, des logiciels tiers (parfois libres, parfois commerciaux), des manuels d’utilisation et une assistance par téléphone ou e-mail. Il existe deux grands types de distributions :

  • les distributions commerciales telles que Red Hat Enterprise Linux (RHEL), SUSE Linux Enterprise et Ubuntu ;

  • les distributions communautaires telles que Debian, Fedora ou openSUSE.

Depuis 2016, Linux est également supporté dans Windows 10 et 11 grâce à Windows Subsystem for Linux (WSL). La version la plus récente de WSL utilise Hyper-V pour exécuter le système d’exploitation Linux. WSL peut exécuter des binaires Linux ainsi que des applications graphiques avec l’aide d’un serveur X.

Linux est multi-architecture, il peut tourner sur x86, x86_64, Motorola, DEC, Alpha, PowerPC, ARM, RISC, MIPS ou encore SPARC. C’est donc un système d’exploitation fréquemment utilisé dans les systèmes embarqués et dans les terminaux réseau tels que les routeurs. Dans ce chapitre, nous nous limiterons aux versions Intel de ce système d’exploitation.

La version actuelle du noyau Linux est :...

Vecteurs d’infection

1. Cas d’une compromission système

Les techniques pour compromettre un système Linux sont variées. Dans le cas d’une utilisation bureautique, les vecteurs d’infection sont similaires aux autres systèmes d’exploitation. Elle peut se faire avec une pièce jointe malveillante, avec l’installation d’une application compromise ou encore grâce à une vulnérabilité.

Les gestionnaires de package et les librairies tierces sont des vecteurs d’infection intéressants propre à Linux. Le langage de développement Python est extrêmement utilisé sur Linux et est installé par défaut sur la plupart des distributions. Le système de package intégré à Python s’appelle PyPI (Python Package Index). Il permet de télécharger automatiquement les dépendances nécessaires à une application Python. En décembre 2023, des chercheurs de la société ESET ont découvert que plus de cent librairies malveillantes étaient disponibles sur ce gestionnaire de package. Les attaquants utilisaient des copies de librairies légitimes populaires avec une faute de frappe. Par exemple, une copie de la librairie HexColors, appelée par l’attaquant HexColurs, était disponible. Une simple faute de frappe lors de l’installation...

Format ELF

Les binaires sous Linux sont au format ELF (Executable and Linkable Format). Il a été créé en 1999 et est utilisé par Linux mais également par d’autres systèmes d’exploitation comme les systèmes BSD ou encore par les consoles comme la PlayStation ou le Nintendo DS.

Les fichiers ELF possèdent l’en-tête suivant :

struct Elf32_Ehdr { 
  unsigned char e_ident[EI_NIDENT]; // ELF Identification bytes 
  Elf32_Half    e_type; // Type of file (see ET_* below) 
  Elf32_Half    e_machine; // Required architecture for this file (see EM_*) 
  Elf32_Word    e_version; // Must be equal to 1 
  Elf32_Addr    e_entry; // Address to jump to in order to start program 
  Elf32_Off     e_phoff; // Program header table's file offset, in bytes 
  Elf32_Off     e_shoff; // Section header table's file offset, in bytes 
  Elf32_Word    e_flags; // Processor-specific flags 
  Elf32_Half    e_ehsize; // Size of ELF header, in bytes 
  Elf32_Half    e_phentsize; // Size of an entry in the program header table 
  Elf32_Half    e_phnum; // Number of entries in the program header table 
  Elf32_Half    e_shentsize; // Size of an entry in the section header table 
  Elf32_Half    e_shnum; // Number of entries in the section header table 
  Elf32_Half    e_shstrndx; // Sect hdr table index of sect name string table 
}; 

La commande readelf permet de visualiser l’en-tête d’un fichier :

linux@DESKTOP:~$ readelf -h /bin/ls 
ELF Header: 
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64 
  Data:                              2's...

Techniques utilisées par les malwares Linux

1. Persistance

Dans la plupart des cas, les malwares souhaitent être persistants et s’exécuter en cas de redémarrage du système. Il existe de nombreuses méthodes pour réaliser cette tâche. Les services, décrits précédemment, sont fréquemment utilisés. Mais l’attaquant doit être administrateur pour les créer et les administrer. Il existe d’autres astuces pour exécuter des binaires automatiquement dès qu’un utilisateur se connecte au système compromis sans avoir besoin des droits administrateur.

Lorsqu’un utilisateur se connecte ou ouvre un terminal, un shell est lancé. Le shell est le binaire qui permet d’avoir accès à la ligne de commande sous Linux. Il existe différents types de shells comme sh, bash ou zsh. Tous les shells ont la particularité de charger un fichier de configuration à leur exécution. Par exemple, bash charge automatiquement le fichier .bashrc présent dans le répertoire de l’utilisateur. Ce fichier peut contenir des variables d’environnements à mettre en place, mais peut être utilisé par l’attaquant pour exécuter un binaire malveillant.

L’attaquant peut aussi définir des alias dans ce fichier de configuration. La commande suivante permet de remplacer la commande ls par une version malveillante déposée dans /tmp/ :

linux@DESKTOP:~$ alias ls='/tmp/ls' 

Évidemment, le malware doit fonctionner comme la commande ls afin de tromper l’utilisateur. GNU étant open source, il est facile de télécharger le code source du binaire et de le modifier pour ajouter du code malveillant tout en gardant les fonctionnalités de la commande ls.

L’attaquant peut aussi modifier la variable d’environnement PATH pour exécuter la version malveillante de ls. Cette variable est utilisée sous Unix pour configurer les chemins contenant les binaires exécutables. Voici un exemple de PATH :

linux@DESKTOP:~$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin: 

Lorsqu’une commande est exécutée, comme ls, le shell va parcourir les répertoires présents dans PATH un par un jusqu’à...

Analyse de malware

1. Création du laboratoire d’analyse

Comme pour les autres systèmes d’exploitation mentionnés dans ce livre, il est important d’avoir un laboratoire d’analyse dans une machine virtuelle afin de ne pas exécuter de code malveillant sur sa propre machine.

Il ne faut pas exécuter de malware dans Windows Subsystem for Linux (WSL). La partition Linux a accès au système hôte, les environnements ne sont pas isolés. Un ransomware Linux tournant dans WSL pourrait chiffrer les fichiers du système Windows hôte.

Tout comme pour l’analyse de malwares sous Windows, nous utiliserons l’hyperviseur gratuit VirtualBox librement téléchargeable à l’adresse suivante : https://www.virtualbox.org/wiki/Downloads. Linux étant gratuit et open source, il n’y a aucun spécifié à la création de la machine virtuelle. Une création de machines standard fonctionnera parfaitement.

La seule chose à choisir est la distribution Linux à installer. Ubuntu est un choix standard qui permettra de réaliser des analyses. Il existe une distribution spécialisée dans l’analyse de malware : REMnux. Des images VirtualBox sont librement téléchargeables à l’adresse suivante : https://docs.remnux.org/install-distro/get-virtual-appliance. Le fichier d’image peut-être directement importé dans VirtualBox.

La distribution REMnux a l’avantage d’avoir des outils d’analyses préinstallés :

  • des outils d’analyse statique et dynamique de binaire et de script ;

  • des outils d’analyse mémoire ;

  • des outils d’analyse réseau ;

  • des outils d’analyse de document ;

  • divers outils.

La liste complète est disponible dans la documentation REMnux à l’adresse suivante : https://docs.remnux.org/. Tous les outils présentés dans ce chapitre sont préinstallés dans REMnux.

2. Analyse statique

Ghidra supporte les fichiers ELF. Ghidra est un outil d’analyse statique libre qui a été décrit dans le chapitre Reverse engineering. Il est téléchargeable à l’adresse suivante : https://ghidra-sre.org/. Il n’y a pas de différence...

Cas d’étude d’un webshell

Pour ce premier cas d’étude, nous allons analyser un webshell déployé via une vulnérabilité sur un serveur d’application Tomcat. Tomcat est un serveur d’application open source permettant d’exécuter des applications Java avec l’extension .jsp. Le webshell est utilisé par l’attaquant pour contrôler le serveur compromis en utilisant des requêtes web spécifiques.

Voici une capture d’écran du fichier malveillant déployé sur ce Tomcat vulnérable :

images/02EP06N5.png

Le code est en Java est n’est pas obfusqué. Tomcat délivre des interfaces web, ce code Java est donc exécuté dans le contexte d’une requête web.

La première section, de la ligne 1 à 9, surcharge la classe ClassLoader qui permet de charger dynamiquement une classe Java.

La seconde section, de la ligne 12 à 17, contrôle si un paramètre pass est envoyé lors de la requête web. Si la variable est bien présente, le code malveillant génère un mot de passe (une clé) aléatoire en utilisant UUID.randomUUID(). Cette clé est affichée sur la page web à l’attaquant. Cette clé est également stockée dans la session avec la valeur u.

La dernière section, de la ligne 18 à 24, est utilisée...

Cas d’étude du malware Sysupdate

Voici le md5 du fichier Sysupdate utilisé dans ce cas d’étude : f1009ec318797d6541ad440545062082.

Voici le début du pseudo-code de Sysupdate.

images/03EP06N5.png

Cette portion de code vérifie les paramètres de la ligne de commande. Le malware supporte les arguments suivants : -launch, -run, -r, -i et -f. Par exemple, si l’option -launch est présente, la fonction FUN_0040c5ae() (ligne 24) est exécutée. Voici le pseudo-code de cette fonction :

images/04EP06N5.png

Nous voyons à la ligne 10 que le fichier /etc/rc.d/rc.local est ouvert. Ce fichier est un service Linux. Ensuite plusieurs lignes sont écrites dans ce fichier (avec l’API fwrite()). Le but de cette fonction est donc de configurer une persistance au malware en créant un nouveau service. Pour faciliter la lecture, cette fonction peut être renommée en creation_de_service().

Nous n’allons pas analyser chacun des paramètres supportés, voici leur but :

  • -launch : création d’un service pour démarrer le malware automatiquement au démarrage du système. Avec cette option, le malware n’est pas exécuté directement, il le sera au redémarrage.

  • -run : démarrage du malware.

  • -x : exécute le malware en mode daemon.

  • -i : création d’un service pour démarrer le malware...

Cas d’étude d’attaque de XZ Utils

En mars 2024, une vulnérabilité a été identifiée dans XZ Utils : CVE-2024-3094. XZ Utils est une librairie de compression utilisée dans de nombreux logiciels libres. Il s’est avéré que cette vulnérabilité n’était pas une simple vulnérabilité, mais une attaque de type supply chain : du code malveillant a été introduit dans le projet. Ce code malveillant impacte tous les projets utilisant cette librairie.

Tout a commencé en 2022, lorsqu’un développeur du nom de Jia Tan a commencé à proposer des mises à jour à XZ Utils. Les premières mises à jour étaient légitimes, ce qui a permis de construire à ce développeur une crédibilité auprès du projet jusqu’à ce qu’il devienne un des mainteneurs du projet. Petit à petit, commit par commit, le développeur a intégré une backdoor au projet. En mars 2024, l’intégralité du code malveillant est déployée.

Le code malveillant est une macro exécutée lors de la compilation de la librairie. Cette macro déchiffre un fichier de tests unitaires (tests/files/bad-3-corrupt_lzma2.xz). Cette étape vérifie si le système d’exploitation est bien...

Résumé

Dans ce chapitre, nous avons vu le fonctionnement du système d’exploitation Linux. Linux est un système libre dont le code source est librement accessible. Cela permet de n’avoir aucun élément caché, la documentation est présente et tous les mécanismes internes du système peuvent être identifiés et compris. Cependant, une légende persiste où il n’existerait pas de malware sous Linux. Les différents cas d’étude présentés dans ce chapitre démontrent que c’est évidemment faux. Les attaquants ont également un appétit pour ce système d’exploitation.