
Repositório de pesquisa para CVE-2026-74469 (DiagSpill), um overflow de contador de transporte de peer SCTP do kernel Linux que causa uma escrita fora dos limites, com PoC, análise de causa raiz e detalhes do patch.
DiagSpill
Uma vulnerabilidade no SCTP do kernel Linux causada por um estouro de contador de transportes de peers de 16 bits, permitindo que o contador dê a volta de 65535 para 0. Durante um dump de diagnóstico do SCTP, o valor que deu a volta pode causar reserva insuficiente de payload do skb, seguida de uma escrita fora dos limites de dados de endereço de peer.
Este repositório destina-se apenas a pesquisa de segurança autorizada, análise de vulnerabilidades do kernel, ambientes de CTF, depuração do 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-74469 |
| Codename | DiagSpill |
| Componente | Kernel Linux |
| Subsistema | SCTP / sock_diag |
| Arquivo Afetado | net/sctp/associola.c |
| Função Principal | sctp_assoc_add_peer() |
| Classe do Bug | Estouro de inteiro / Escrita fora dos limites |
| Impacto | Corrupção de memória do kernel |
| Impacto Potencial | Escalação de privilégios local |
| CVSS v3.1 | 7.0 — Alta |
| Vetor de Ataque | Local |
| Complexidade do Ataque | Alta |
| Privilégios Necessários | Baixos |
| Interação do Usuário | Nenhuma |
| Status | Corrigido |
O aviso CVE do Kernel Linux descreve o problema como um estouro de
transport_count de 16 bits no SCTP, seguido de uma alocação subdimensionada de INET_DIAG_PEERS
e de uma escrita fora dos limites durante o dump de diagnóstico.
O código vulnerável mantém o número de transportes de peers únicos em um contador de 16 bits:
transport_count
Cada novo peer único adicionado incrementa o contador.
O limite crítico é:
65535
Adicionar outro transporte exclusivo causa:
65535 + 1
↓
0
A inconsistência resultante do wraparound ocorre entre:
transport_count
e:
transport_addr_list
O subsistema de diagnóstico posteriormente confia no contador encapsulado ao calcular o tamanho do buffer de resposta, enquanto ainda itera pela lista completa de endereços de pares.
A vulnerabilidade pode ser representada como:
SCTP Association
│
▼
Add unique peers
│
▼
transport_count
uint16_t
│
▼
65,535 peers
│
▼
+ 1 unique peer
│
▼
Integer wrap
│
▼
transport_count = 0
│
▼
SCTP sock_diag
│
▼
Reserve incorrect payload
│
▼
Iterate complete peer list
│
▼
Out-of-bounds skb write
O aviso upstream afirma especificamente que o 65.536º transporte faz o contador voltar a zero.
O código de diagnóstico depende efetivamente de duas visões diferentes do mesmo estado.
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
Após o inteiro sofrer wrap:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
O alocador, portanto, reserva espaço com base em:
0 peers
enquanto a operação de cópia ainda pode processar:
65536 peer addresses
Essa incompatibilidade produz a violação de segurança de memória.
O aviso do Kernel Linux descreve o despejo de diagnóstico resultante como reservando um payload vazio e, em seguida, gravando aproximadamente 8 MiB de endereços de pares além da cauda do skb.
Conceitualmente:
Expected skb:
┌───────────────────────────────┐
│ INET_DIAG header │
├───────────────────────────────┤
│ Peer addresses │
└───────────────────────────────┘
▲
│
valid end
Actual vulnerable state:
┌───────────────────────────────┐
│ INET_DIAG header │
└───────────────────────────────┘
▲
│
skb tail
↓
Peer address writes
↓
Peer address writes
↓
Peer address writes
↓
OUT-OF-BOUNDS WRITE
A Red Hat classifica a falha como CWE-787: Out-of-bounds Write.
O caminho relevante pode ser resumido como:
SCTP association
│
▼
sctp_assoc_add_peer()
│
▼
transport_count++
│
▼
16-bit overflow
│
▼
SCTP sock_diag
│
▼
INET_DIAG_PEERS
│
▼
skb payload reservation
│
▼
transport_addr_list iteration
│
▼
Out-of-bounds write
O arquivo de origem afetado é:
net/sctp/associola.c
O anúncio de CVE do Linux Kernel identifica este arquivo explicitamente.
A correção upstream é:
bd0e9289e2642f6a5c54faad304ce0f41e926d22
Commit:
sctp: prevent peer transport count overflow
A correção rejeita um novo peer exclusivo quando:
transport_count >= U16_MAX
Importante: a verificação ocorre após a busca por peer existente.
Isso preserva a capacidade de recuperar um transporte já existente mesmo quando a associação atingiu o limite.
New peer
│
▼
transport_count++
│
▼
Possible 16-bit wrap
│
▼
Diagnostic size mismatch
│
▼
OOB write
New peer
│
▼
Existing peer?
│
┌─┴──────────┐
│ │
YES NO
│ │
▼ ▼
Reuse Check U16_MAX
transport │
▼
Reject at limit