
Repositório de pesquisa para CVE-2026-81000 (TUNderflow), um underflow de inteiro no headroom de recebimento do TUN/TAP do kernel Linux que permite escalonamento local de privilégios, com PoC, análise de causa raiz e configuração de laboratório.
TUNderflow
Uma vulnerabilidade de corrupção de memória no kernel Linux no subsistema de rede TUN/TAP, causada por limites insuficientes no headroom de recepção e um underflow de inteiro no caminho de alocação de pacotes.
Este repositório destina-se a pesquisa de segurança autorizada, análise de vulnerabilidades, ambientes de CTF, depuração de kernel e testes defensivos.
Não utilize código de prova de conceito contra sistemas sem autorização explícita.
| Campo | Detalhes |
|---|---|
| CVE | CVE-2026-81000 |
| Codename | TUNderflow |
| Componente | Kernel Linux |
| Subsistema | TUN/TAP |
| Código Afetado | drivers/net/tun.c |
| Função Principal | tun_get_user() |
| Classe do Bug | Underflow de inteiro / acesso fora dos limites |
| Impacto | Corrupção de memória do kernel |
| Impacto Potencial | Escalação de privilégios local |
| CVSS v3.1 | 7.8 — Alta |
| Vetor de Ataque | Local |
| Privilégios Exigidos | Baixos |
| Interação do Usuário | Nenhuma |
| Status | Corrigido |
O aviso do CVE descreve o problema como um underflow de inteiro que pode fazer
com que skb->data seja posicionado fora do head do skb alocado.
A vulnerabilidade existe no caminho de recepção TUN/TAP do kernel Linux.
O código afetado utiliza o headroom de recepção configurado do dispositivo TUN tanto como headroom do pacote quanto no cálculo de quanto dos dados do pacote deve permanecer linear.
Um valor de headroom excessivamente grande pode, portanto, criar um cálculo inválido em:
SKB_MAX_HEAD(align)
Quando o valor fornecido excede o head skb utilizável de uma página, o cálculo pode sofrer underflow.
Conceitualmente:
Oversized receive headroom
│
▼
SKB_MAX_HEAD()
│
▼
Integer underflow
│
▼
Negative value
│
▼
size_t wrap
│
▼
Invalid skb data placement
│
▼
Kernel memory corruption
A implementação vulnerável está localizada em:
drivers/net/tun.c
sendo tun_get_user() central no caminho vulnerável.
O problema subjacente é o headroom de recepção do TUN insuficientemente limitado.
O kernel pode receber uma solicitação de headroom de tamanho excessivo através de caminhos de dispositivos de rede que propagam o valor para TUN/TAP.
A vulnerabilidade torna-se particularmente interessante quando uma configuração complexa de rede virtual faz com que um valor de headroom elevado chegue a um dispositivo TUN.
A divulgação pública descreve um cenário envolvendo:
Netkit
│
▼
VXLAN
│
▼
Open vSwitch
│
▼
TUN
Uma configuração de exemplo pode propagar aproximadamente 4160 bytes de headroom para uma porta TUN bruta, fazendo com que a aritmética vulnerável sofra underflow.
A corrupção ocorre na lógica de gerenciamento de memória de rede do kernel.
As consequências potenciais incluem:
A divulgação pública relata a vulnerabilidade como parte de um grupo de vulnerabilidades de root local do Linux e afirma que o PoC publicado pode alcançar execução de usuário local sem privilégios para root em alvos suportados.
A explorabilidade depende do ambiente e requer a configuração relevante de dispositivo TUN/rede e funcionalidade de suporte.
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
Os componentes importantes são:
drivers/net/tun.c
│
├── tun_set_headroom()
│
├── tun_get_user()
│
└── tun_alloc_skb()
A relação vulnerável pode ser simplificada como:
tun->align
│
├── skb headroom
│
└── linear-data calculation
Usar o mesmo valor superdimensionado em ambos os cálculos cria uma relação insegura entre a margem solicitada e o orçamento real do cabeçalho do skb.
A propriedade de segurança crítica pode ser representada conceitualmente como:
usable_head < requested_headroom
o que pode resultar em:
SKB_MAX_HEAD(align) < 0
seguida por uma conversão sem sinal:
negative value
↓
size_t
↓
very large unsigned value
Isso pode, em última análise, influenciar a alocação de skb e o posicionamento de dados.
A descrição oficial observa especificamente que o valor resultante sofre wrap quando
atribuído à variável size_t linear.
A correção upstream é:
447c9303942c439a117d9b76ce6d6e2116c38ee7
Commit:
net: tun: bound receive headroom
A correção limita a margem (headroom) armazenada pelo TUN em relação ao orçamento disponível de headroom de skb de uma página e ao maior deslocamento de cabeçalho de skb válido de 16 bits. Também garante que dados lineares suficientes estejam disponíveis para o processamento bruto de TUN e TAP.
User / network device
│
▼
Large headroom
│
▼
tun->align
│
▼
Unsafe arithmetic
│
▼
Potential OOB access