
Exploit d’élévation de privilèges locale pour CVE-2026-31431, une vulnérabilité de réécriture du cache de pages AF_ALG + splice dans le noyau Linux. Inclut un PoC, un script de détection BPFtrace et un environnement de test QEMU pour la recherche en sécurité autorisée.
Élévation de privilèges locale dans le noyau Linux via AF_ALG + écrasement du cache de pages
Uniquement pour la recherche en sécurité autorisée, les tests d'intrusion et les fins pédagogiques. Ne pas utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de test.
CVE-2026-31431 est une vulnérabilité d'élévation de privilèges locale (LPE) dans le noyau Linux. Un
utilisateur local non privilégié peut obtenir un accès root en combinant l'interface de socket AF_ALG avec
splice() pour effectuer une écriture authentifiée directement dans une page du cache de pages appartenant à un
binaire setuid.
L'exploit écrase le binaire su dans le cache de pages sans modifier l'inode sur disque,
contournant les mécanismes d'intégrité qui reposent uniquement sur les métadonnées de fichiers ou les sommes de contrôle au niveau des blocs.
.
├── exploit.py # PoC — écrasement du cache de pages et élévation de privilèges
├── detect.bt # Script BPFtrace pour la détection en temps réel
├── run-vm.sh # Automatisation de l'environnement de test QEMU (optionnel)
├── PAYLOAD.md # Analyse de l'encodage de la charge utile (hex → zlib → ELF → shellcode)
└── LICENSE
Exécutez exploit.py en tant qu'utilisateur local non privilégié sur tout système vulnérable — aucun sudo requis :
python3 exploit.py
Le script effectue les étapes suivantes :
AF_ALG (algif_aead) par le noyau et localise le binaire su.su comme descripteur de fichier brut et écrase ses pages du cache de pages via
AF_ALG + sendfile.Architectures prises en charge :
Surveillez les tentatives d'exploitation en temps réel avec detect.bt. Nécessite root :
sudo bpftrace detect.bt
# ou
doas bpftrace detect.bt
Le script suit trois indicateurs par PID à l'aide d'un masque de bits dans @suspect[pid] :
Une alerte se déclenche lorsque les trois bits sont définis (@suspect[pid] == 0x7) sur le même PID.
exploit.pyAF_ALG/algif_aead chargédetect.btbpftrace ≥ 0.12# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
Mettez à jour le paquet du noyau de votre distribution vers une version incluant le commit principal
a664bf3d603d,
qui annule l'optimisation sur place de algif_aead de 2017 afin que les pages du cache de pages ne puissent plus
se retrouver dans la liste de diffusion de destination en écriture. La plupart des grandes distributions
fournissent désormais ce correctif.
algif_aead (en attendant un correctif)blacklist peut être contourné avec un modprobe algif_aead explicite. La directive install .../bin/false
remplace entièrement la commande d'installation, faisant échouer chaque tentative de chargement :
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
Les sous-systèmes de la ligne « Non » utilisent directement l'API cryptographique du noyau — ils ne passent jamais par
AF_ALG. Les performances retombent sur les bibliothèques cryptographiques utilisateur normales, ce que presque
tout le reste utilise déjà.
Pour vérifier si quoi que ce soit sur votre système utilise activement AF_ALG avant de le désactiver :
lsof | grep AF_ALG
ss -xa | grep alg
Refusez la création de socket(AF_ALG, ...) pour les charges de travail non fiables, quel que soit l'état du correctif. Ajoutez
AF_ALG (famille 38) à votre liste de refus seccomp, ou utilisez une politique AppArmor/SELinux qui
restreint les appels socket pour les processus non privilégiés.
detect.btDéployez le script de détection inclus sur tout hôte qui ne peut pas être corrigé ou verrouillé immédiatement. Il alertera sur tout processus qui exécute la primitive d'exploitation complète en trois étapes.
run-vm.sh automatise la création d'une machine virtuelle QEMU Ubuntu 24.04 pour tester dans un
environnement contrôlé. exploit.py et detect.bt s'exécutent directement sur tout hôte vulnérable — QEMU n'est
pas requis.
| Dépendance | Notes |
|---|---|
qemu-system-x86_64 + KVM | Voir les commandes d'installation ci-dessous |
wget ou curl | Téléchargement de l'image cloud |
cloud-image-utils |
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
sh run-vm.sh
1. Démarrer/Créer la VM
2. Se connecter via SSH
3. Téléverser des fichiers vers la VM (exploit.py, detect.bt)
4. Exécuter l'exploit dans la VM
5. Exécuter detect.bt dans la VM
6. Vérifier l'état de la VM
7. Arrêter la VM
8. Nettoyer les fichiers de la VM
0. Quitter
| Champ | Valeur |
|---|---|
| Utilisateur | ubuntu |
| Mot de passe | cve123 |
| Port SSH | 2222 |
crypto/af_alg.c — source du noyaumm/splice.c — source du noyauCe projet est sous licence GNU General Public License v3.0 ou ultérieure. Voir LICENSE pour le texte complet.
Avertissement : Ce dépôt est fourni uniquement pour la recherche en sécurité autorisée, les tests d'intrusion et les fins pédagogiques. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive ou de dommages causés par ce logiciel.
| Champ | Valeur |
|---|
| ID CVE | CVE-2026-31431 |
| Type | Élévation de privilèges locale (LPE) |
| Score CVSS v3.1 | 7.8 Élevé — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (source : kernel.org) |
| Sous-systèmes du noyau | crypto/af_alg.c, mm/splice.c |
| Vecteur d'attaque | Local — compte utilisateur non privilégié requis |
| Cause racine | algif_aead accepte sendfile() sur un socket AEAD sans appliquer la sémantique copy-on-write sur la page du cache de pages mappée avant que splice() ne termine le transfert |
| Distribution | Version du noyau | Arch |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86_64 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86_64 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86_64 |
| SUSE 16 | 6.12.0-160000.9-default | x86_64 |
| Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 |
| Architecture | Variantes |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l, armv6l, armv7l |
| x86 32 bits | i386, i486, i586, i686 |
| MIPS 64 bits | mips64, mips64el |
| LoongArch | loong64, loongarch64 |
| s390x | — |
| Bit | Appel système | Indicateur |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | Socket AF_ALG créé |
0x2 | setsockopt(SOL_ALG, ...) | Opération cryptographique configurée |
0x4 | sendmsg(MSG_MORE) + splice() | Écrasement du cache de pages tenté |
| Affecté ? | Sous-système/Cas d'utilisation |
|---|
| Non | dm-crypt/LUKS, kTLS, IPsec/XFRM, TLS dans le noyau |
| Non | Builds par défaut d'OpenSSL, GnuTLS, NSS |
| Non | SSH, cryptographie du trousseau de clés du noyau |
| Peut-être | OpenSSL avec le moteur afalg explicitement activé |
| Peut-être | Chemins de déchargement cryptographique embarqués ou applications qui lient directement les sockets aead/skcipher/hash |
| Génération de l'image seed (Docker peut remplacer sur les hôtes non-Debian) |