
Repositório de pesquisa para CVE-2026-68121, um use-after-free no PPPoE do kernel Linux em pppoe_sendmsg() que permite escalonamento local de privilégios, com PoC, análise de causa raiz e configuração de laboratório.
PPPoEject
Uma vulnerabilidade de corrupção de memória no kernel Linux no caminho de transmissão do PPPoE,
causada por um ponteiro obsoleto para um cabeçalho sk_buff após um callback de cabeçalho de dispositivo
realocar a cabeça do skb.
Este repositório destina-se apenas a pesquisa de segurança autorizada, análise de vulnerabilidades de kernel, ambientes de CTF e testes defensivos.
Não execute código de prova de conceito contra sistemas sem autorização explícita.
| Campo | Detalhes |
|---|---|
| CVE | CVE-2026-68121 |
| Codename | PPPoEject |
| Componente | Kernel Linux |
| Subsistema | PPPoE / Rede |
| Arquivo Afetado | drivers/net/ppp/pppoe.c |
| Função Principal | pppoe_sendmsg() |
| Classe do Bug | Use-After-Free |
| 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 |
| Complexidade do Ataque | Baixa |
| Privilégios Necessários | Baixos |
| Interação do Usuário | Nenhuma |
| Status | Corrigido |
O registro do CVE identifica a vulnerabilidade como um ponteiro de cabeçalho PPPoE obsoleto que
pode se tornar inválido quando dev_hard_header() realoca a cabeça do skb.
A vulnerabilidade existe em:
drivers/net/ppp/pppoe.c
dentro de:
pppoe_sendmsg()
A sequência vulnerável é, conceitualmente:
pppoe_sendmsg()
│
▼
Save PPPoE header pointer
│
▼
dev_hard_header()
│
▼
skb head may be reallocated
│
▼
Old pointer becomes stale
│
▼
PPPoE writes through stale pointer
│
▼
Use-After-Free
│
▼
Kernel memory corruption
O código de rede do Linux permite que os callbacks de cabeçalho de dispositivo realoquem a cabeça do sk_buff. Portanto, um ponteiro para a cabeça antiga não pode ser reutilizado com segurança depois que dev_hard_header() retorna.
O problema central é uma violação de tempo de vida.
pppoe_sendmsg() obtém um ponteiro para o cabeçalho PPPoE antes de invocar:
dev_hard_header()
No entanto, esse callback pode fazer com que a cabeça do skb se mova.
Conceitualmente:
Before callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
stale pointer
After skb expansion:
old skb head ──X──► freed
new skb head
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
valid location
O ponteiro antigo ainda referencia a alocação liberada.
Quando o PPPoE subsequentemente escreve o cabeçalho através desse ponteiro, o kernel realiza uma gravação use-after-free.
O acionamento documentado envolve uma condição de corrida em torno de copy_from_user() e alterações
nas operações de cabeçalho de um dispositivo team.
Uma sequência descrita é:
PPPoE sendmsg()
│
▼
copy_from_user() blocks
│
│
├───────────────┐
│ │
▼ ▼
Team device changes First non-Ethernet
header operations port is added
│
▼
Delegated GRE callback
│
▼
skb head expansion
│ │
└───────────────┘
│
▼
stale PPPoE pointer
│
▼
use-after-free write
O registro CVE observa que isso pode ocorrer quando a primeira porta não Ethernet é adicionada a um dispositivo team vazio e o callback do cabeçalho GRE delegado expande o cabeçalho skb.
A vulnerabilidade pode resultar em:
O vetor CVSS publicado da CVE é:
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
com uma pontuação base de 7.8 Alta.
Os componentes relevantes são:
PF_PPPOX / PPPoE socket
│
▼
pppoe_sendmsg()
│
▼
sk_buff (skb)
│
▼
dev_hard_header()
│
▼
Network device header callback
│
▼
Potential skb head expansion
│
▼
PPPoE stale header pointer
│
▼
UAF write
O código vulnerável, portanto, não é simplesmente um analisador genérico de pacotes PPPoE; a condição crítica é a interação entre a transmissão de socket PPPoE e a realocação dinâmica do cabeçalho skb.
A correção upstream tem o título:
pppoe: reload header pointer after dev_hard_header()
A correção recarrega o cabeçalho PPPoE através do network-header offset do skb após a criação do cabeçalho do dispositivo.
A propriedade importante é:
Before:
header pointer
│
▼
dev_hard_header()
│
▼
skb moves
│
▼
pointer = stale ❌
After:
dev_hard_header()
│
▼
skb may move
│
▼
reload header using skb offset
│
▼
pointer = valid ✅
pskb_expand_head() atualiza o deslocamento relevante do skb quando a cabeça do skb é realocada, tornando a busca baseada em deslocamento segura após a realocação.
| Propriedade de Segurança | Vulnerável | Corrigido |
|---|---|---|
| Ponteiro de cabeçalho salvo antes do callback | ✅ | — |
| A cabeça do skb pode se mover | ✅ | ✅ |
| Ponteiro atualizado após o callback | ❌ | ✅ |
| Desreferência de ponteiro obsoleto | Possível | Prevenido |
| Escrita use-after-free | Possível | Mitigado |
| Corrupção de memória do kernel | Possível | Mitigado |
Um laboratório controlado pode ser estruturado como: