
Dépôt de recherche pour CVE-2026-81000 (TUNderflow), un underflow d'entier dans le headroom de réception TUN/TAP du noyau Linux permettant une élévation locale de privilèges, avec PoC, analyse de la cause racine et configuration de laboratoire.
TUNderflow
Une vulnérabilité de corruption mémoire du noyau Linux dans le sous-système réseau TUN/TAP, causée par des limites insuffisantes sur le headroom de réception et un underflow d'entier dans le chemin d'allocation des paquets.
Ce dépôt est destiné à la recherche en sécurité autorisée, à l'analyse de vulnérabilités, aux environnements CTF, au débogage du noyau et aux tests défensifs.
N'utilisez pas le code de preuve de concept contre des systèmes sans autorisation explicite.
| Champ | Détails |
|---|---|
| CVE | CVE-2026-81000 |
| Nom de code | TUNderflow |
| Composant | Noyau Linux |
| Sous-système | TUN/TAP |
| Code affecté | drivers/net/tun.c |
| Fonction principale | tun_get_user() |
| Classe de bug | Underflow d'entier / accès mémoire hors limites |
| Impact | Corruption mémoire du noyau |
| Impact potentiel | Élévation de privilèges locale |
| CVSS v3.1 | 7.8 — Élevé |
| Vecteur d'attaque | Local |
| Privilèges requis | Faibles |
| Interaction utilisateur | Aucune |
| Statut | Corrigé |
L'avis CVE décrit le problème comme un underflow d'entier pouvant positionner
skb->data en dehors de la tête de skb allouée.
La vulnérabilité existe dans le chemin de réception TUN/TAP du noyau Linux.
Le code affecté utilise le headroom de réception configuré du périphérique TUN à la fois comme headroom de paquet et lors du calcul de la quantité de données de paquet devant rester linéaire.
Une valeur de headroom surdimensionnée peut donc produire un calcul invalide dans :
SKB_MAX_HEAD(align)
Lorsque la valeur fournie dépasse l'espace utile de l'en-tête skb d'une page, le calcul peut produire un underflow.
Conceptuellement :
Oversized receive headroom
│
▼
SKB_MAX_HEAD()
│
▼
Integer underflow
│
▼
Negative value
│
▼
size_t wrap
│
▼
Invalid skb data placement
│
▼
Kernel memory corruption
L'implémentation vulnérable se trouve dans :
drivers/net/tun.c
avec tun_get_user() au cœur du chemin vulnérable.
Le problème sous-jacent est un headroom de réception TUN insuffisamment borné.
Le noyau peut recevoir une demande de headroom surdimensionnée via des chemins de périphérique réseau qui propagent la valeur vers TUN/TAP.
La vulnérabilité devient particulièrement intéressante lorsqu'une configuration réseau virtuelle complexe amène une valeur de headroom importante à atteindre un périphérique TUN.
La divulgation publique décrit un scénario impliquant :
Netkit
│
▼
VXLAN
│
▼
Open vSwitch
│
▼
TUN
Une configuration d'exemple peut propager environ 4160 octets de marge à un port TUN brut, provoquant le sous-dépassement de l'arithmétique vulnérable.
La corruption se produit dans la logique de gestion de la mémoire réseau du noyau.
Les conséquences potentielles incluent :
La divulgation publique rapporte la vulnérabilité comme faisant partie d'un groupe de vulnérabilités d'élévation de privilèges locale root sous Linux et indique que le PoC publié peut permettre l'exécution d'un utilisateur local non privilégié vers root sur les cibles prises en charge.
L'exploitabilité dépend de l'environnement et nécessite la configuration pertinente du périphérique TUN/réseau et les fonctionnalités de support.
ATTACKER
│
▼
Oversized network headroom
│
▼
Virtual network device
│
▼
Open vSwitch
│
▼
TUN/TAP
│
▼
tun_get_user()
│
▼
SKB_MAX_HEAD(align)
│
▼
Integer underflow
│
▼
size_t wraparound
│
▼
Invalid skb->data offset
│
▼
Kernel memory corruption
Les composants importants sont :
drivers/net/tun.c
│
├── tun_set_headroom()
│
├── tun_get_user()
│
└── tun_alloc_skb()
La relation vulnérable peut être simplifiée comme suit :
tun->align
│
├── skb headroom
│
└── linear-data calculation
L'utilisation de la même valeur surdimensionnée dans les deux calculs crée une relation dangereuse entre la marge de manœuvre demandée et le budget réel de l'en-tête skb.
La propriété de sécurité critique peut être représentée conceptuellement comme suit :
usable_head < requested_headroom
ce qui peut entraîner :
SKB_MAX_HEAD(align) < 0
suivie d'une conversion non signée :
negative value
↓
size_t
↓
very large unsigned value
Cela peut finalement influencer l'allocation des skb et le placement des données.
La description officielle note spécifiquement que la valeur résultante déborde lorsqu'elle est
assignée à la variable size_t linear.
Le correctif en amont est :
447c9303942c439a117d9b76ce6d6e2116c38ee7
Commit :
net: tun: bound receive headroom
La correction borne l'espace disponible stocké par TUN par rapport au budget disponible d'en-tête skb d'une page et au plus grand décalage d'en-tête skb valide sur 16 bits. Elle garantit également que suffisamment de données linéaires sont disponibles pour le traitement brut de TUN et TAP.