Le projet Openwall a publié le module noyau LKRG 1.0.0 (Linux Kernel Runtime Guard), destiné à vérifier l'intégrité des structures du noyau et à détecter les tentatives d'exploitation de vulnérabilités dans le noyau. Il est noté que l'attribution du numéro de version 1.0.0 a marqué l'atteinte d'un état mature pour le projet. Le code du projet est distribué sous la licence GPLv2.
Le module est adapté à la fois pour la protection contre les attaques, manipulant déjà des vulnérabilités connues dans le noyau Linux, ainsi que pour contrer des exploits utilisant encore des vulnérabilités inconnues, si des mesures spéciales ne sont pas prises pour contourner LKRG. La protection repose sur la détection de modifications non autorisées dans le noyau en cours d'exécution (vérification de l'intégrité) et le suivi des changements de privilÚges des processus utilisateur (détection d'exploitation).
La vérification de l'intégrité est effectuée sur la base de la comparaison des hachages calculés pour les zones de mémoire et les structures de données les plus importantes du noyau, telles que l'IDT (Interrupt Descriptor Table), MSR, les tables d'appels systÚme, toutes les procédures et fonctions, les gestionnaires d'interruptions, les listes de modules chargés, le contenu de la section « .text » des modules et les attributs des processus. La procédure de vérification est activée périodiquement par un minuteur ou lors de l'apparition de certains événements dans le noyau, par exemple, lors de l'exécution des appels systÚme setuid, setreuid, fork, exit, execve, et do_init_module.
La détection d'une éventuelle exploitation et le blocage des attaques se font avant que le noyau ne donne accÚs aux ressources (par exemple, avant l'ouverture d'un fichier), mais aprÚs que le processus a obtenu des privilÚges non autorisés (par exemple, changement d'UID). Lorsqu'un comportement non autorisé des processus est détecté, leur terminaison forcée est effectuée, ce qui est suffisant pour bloquer de nombreux exploits. Les frais généraux liés au fonctionnement du module sont estimés à 2-2,5%.
Le fonctionnement est pris en charge sur des systĂšmes avec des architectures x86-64, AArch64 (ARM64), ARM32 et x86. Le fonctionnement de LKRG 1.0.0 a Ă©tĂ© testĂ© avec des noyaux provenant de diffĂ©rentes distributions, Ă partir du noyau 3.10 de RHEL/CentOS 7 jusqu'Ă 6.17-rc4 du rĂ©fĂ©rentiel dans lequel la prĂ©paration de la version Fedora 44 est en cours. Des paquets sont disponibles pour les distributions ALT Linux, Arch Linux, Astra Linux, Gentoo, Guix, NixOS, Rocky Linux, Whonix, Yocto et OpenBMC. Les paquets construits pour Rocky Linux peuvent ĂȘtre utilisĂ©s dans RHEL 8/9 et dans des distributions dĂ©rivĂ©es, telles qu'AlmaLinux 8/9, tandis que les paquets pour Whonix sont disponibles sous Debian et Ubuntu.
Parmi les changements dans la nouvelle version :
- La compatibilité avec les noyaux Linux est assurée jusqu'à la version 6.17-rc4.
- Lorsque utilisé avec des noyaux à partir de la version 6.13, l'interception des appels distants override_creds() et revert_creds() a été interrompue, ce qui a limité la détection des attaques contournant le pointeur cred. Des mesures compensatoires ont été ajoutées à d'autres endroits du noyau pour pallier ces limitations.
- Le suivi inutile des informations d'identification, pour lesquelles l'intégrité n'est pas vérifiée, a été interrompu. Ce changement a permis de réduire la base de code d'environ 1500 lignes.
- Le support du mécanisme introduit dans le noyau Linux 6.10 pour la création de fichiers temporaires dans le systÚme de fichiers OverlayFS, utilisant l'option O_TMPFILE (ovl_tmpfile), a été ajouté. Ce support est nécessaire pour éviter les faux positifs apparus lors de l'utilisation de conteneurs isolés sur des systÚmes avec des noyaux 6.10-6.12.
- Pour les systÚmes x86_64, le support de la technologie Intel CET (Control-flow Enforcement Technology) a été ajouté pour protéger le code exécutable en utilisant les instructions IBT (indirect branch tracking), ainsi que la protection logicielle kCFI (kernel Control Flow Integrity) pour bloquer la violation de l'ordre d'exécution normal (control flow) due à des exploits modifiant les pointeurs de fonction en mémoire.
- Pour la connexion de nombreux gestionnaires, le mécanisme kprobes a été utilisé au lieu de kretprobes, simplifiant le code d'installation des hooks et permettant d'obtenir de meilleures performances.
- Le fonctionnement avec les verrous (lock) de données spécifiques au processus (per-task shadow data) a été retravaillé. Grùce à l'élimination des verrous superflus, la performance d'accÚs à ces données a été améliorée.
- Des bogues ayant conduit à des conditions de course, des problÚmes d'intégrité et des faux positifs ont été corrigés.
- Le support de la compilation utilisant Clang a été amélioré.
Source : opennet.ru
