CVE-2015-1328 Preuve de Concept
Une preuve de concept (PoC) pour CVE-2015-1328, une vulnérabilité d'escalade de privilèges affectant l'implémentation overlayfs du noyau Linux. Cette vulnérabilité permet à des utilisateurs locaux non privilégiés d'obtenir un accès root en exploitant des vérifications de permissions incorrectes dans les opérations de montage overlayfs au sein des espaces de noms utilisateur.
Vue d'ensemble
CVE-2015-1328 est une vulnérabilité de sécurité critique qui affecte les noyaux Linux avec le support overlayfs et les espaces de noms utilisateur activés. La vulnérabilité permet à un utilisateur local non privilégié de :
- Créer un espace de noms utilisateur en utilisant
unshare(CLONE_NEWUSER)
- Monter des systèmes de fichiers overlayfs dans l'espace de noms
- Exploiter des failles de vérification des permissions pour écrire dans
/etc/ld.so.preload
- Exécuter une bibliothèque partagée malveillante pour obtenir les privilèges root
Cette PoC démontre la vulnérabilité en :
- Utilisant l'isolation des espaces de noms pour contourner les restrictions de montage
- Montant overlayfs pour manipuler les fichiers système
- Injectant une bibliothèque partagée personnalisée via
/etc/ld.so.preload
- Détournant
getuid() pour exécuter un shell root
Systèmes affectés
- Ubuntu 14.04 LTS avec des versions de noyau antérieures à 3.19.0-21.21
- Systèmes avec :
- Espaces de noms utilisateur activés (
kernel.unprivileged_userns_clone=1)
- Support du système de fichiers overlayfs
- Versions de noyau non corrigées
Prérequis
- Compilateur GCC avec support 32 bits
- Noyau Linux avec espaces de noms utilisateur et support overlayfs
- Bibliothèques système appropriées (support du drapeau
-m32)
Compilation
Le projet inclut un Makefile pour une compilation facile :
Cela compilera :
ofs - Le binaire principal de l'exploit (statique 32 bits)
ofs-lib.so - La bibliothèque partagée pour le crochet LD_PRELOAD (32 bits)
Compilation manuelle
Si vous préférez compiler manuellement :
# Compile main exploit
gcc -o ofs ofs.c -m32 -static
# Compile shared library
gcc -m32 -fPIC -shared -o ofs-lib.so ofs-lib.c -ldl -static-libgcc
Utilisation
⚠️ AVERTISSEMENT : Cet exploit va modifier des fichiers système et tenter d'obtenir les privilèges root. Utilisez-le uniquement dans des environnements contrôlés avec une autorisation appropriée.
-
Compilez l'exploit :
-
Exécutez l'exploit :
-
En cas de succès, l'exploit va :
- Créer les structures d'espace de noms nécessaires
- Monter les systèmes de fichiers overlayfs
- Écrire dans
/etc/ld.so.preload
- Exécuter
/bin/su qui déclenche la bibliothèque malveillante
- Lancer un shell root
Fonctionnement
Déroulement de l'exploit
- Création de l'espace de noms: L'exploit crée un nouvel espace de noms utilisateur en utilisant
unshare(CLONE_NEWUSER)
- Espace de noms de montage: Crée un espace de noms de montage en utilisant
clone() avec CLONE_NEWNS
- Montage overlayfs: Monte des systèmes de fichiers overlayfs pour manipuler les répertoires système
- Manipulation de fichiers: Utilise overlayfs pour renommer des fichiers et écrire dans
/etc/ld.so.preload
- Injection de bibliothèque: Écrit une bibliothèque partagée malveillante dans
/tmp/ofs-lib.so
- Escalade de privilèges: Exécute
/bin/su, qui déclenche la bibliothèque préchargée
- Shell root: La bibliothèque détourne
getuid() et lance un shell root
Détails techniques
- L'exploit utilise
clone() avec une pile personnalisée pour créer des espaces de noms de montage isolés
- Les montages overlayfs permettent une manipulation de fichiers dans l'espace de noms qui affecte l'hôte
- La bibliothèque partagée (
ofs-lib.so) intercepte getuid() via LD_PRELOAD
- Quand
/bin/su appelle getuid(), la fonction malveillante est exécutée à la place
Structure du code
.
├── ofs.c # Main exploit code
├── ofs-lib.c # Shared library for privilege escalation
├── lib_so.h # Embedded binary library data
├── Makefile # Build configuration
└── README.md # This file
Fichiers clés
- ofs.c: Contient la logique principale de l'exploit, la création d'espaces de noms et les opérations de montage
- ofs-lib.c: Implémente le crochet
getuid() qui lance un shell root
- lib_so.h: Contient la bibliothèque partagée compilée sous forme de tableau binaire (pour l'incorporation)
Atténuation
Pour se protéger contre cette vulnérabilité :
- Mettez à jour le noyau vers une version corrigée (3.19.0-21.21 ou ultérieure pour Ubuntu 14.04)
- Désactivez les espaces de noms utilisateur si ce n'est pas nécessaire :
echo 0 > /proc/sys/kernel/unprivileged_userns_clone
- Utilisez AppArmor/SELinux pour restreindre les capacités de création d'espaces de noms
- Surveillez les journaux système pour détecter des opérations de montage suspectes
Avis de non-responsabilité légal et éthique
Ce code est fourni à des fins pédagogiques et de recherche en sécurité uniquement.
- L'utilisation non autorisée de cet exploit contre des systèmes sans autorisation explicite est illégale
- Cette PoC est destinée à :
- Chercheurs en sécurité étudiant les vulnérabilités du noyau
- Administrateurs système testant la résilience de leurs systèmes
- Fins pédagogiques dans des environnements contrôlés
- Les auteurs ne sont pas responsables de toute mauvaise utilisation de ce code
- Assurez-vous toujours d'avoir une autorisation appropriée avant de tester sur un système
Références
Licence
Ce projet est fourni tel quel à des fins pédagogiques. Utilisez-le de manière responsable et conformément à toutes les lois et réglementations applicables.