
Repositorio de investigación para CVE-2026-74469 (DiagSpill), un desbordamiento de contador de transporte de par SCTP del kernel de Linux que provoca una escritura fuera de límites, con PoC, análisis de causa raíz y detalles del parche.
DiagSpill
Una vulnerabilidad SCTP del kernel de Linux causada por un desbordamiento de un contador de transportes de pares de 16 bits, que permite que el contador dé la vuelta de 65535 a 0. Durante un volcado de diagnóstico SCTP, el valor desbordado puede provocar una reserva insuficiente de la carga útil del skb, seguida de una escritura fuera de límites de los datos de dirección del par.
Este repositorio está destinado únicamente a la investigación de seguridad autorizada, el análisis de vulnerabilidades del kernel, entornos CTF, la depuración del kernel y las pruebas defensivas.
No utilice el código de prueba de concepto contra sistemas sin autorización explícita.
| Campo | Detalles |
|---|---|
| CVE | CVE-2026-74469 |
| Nombre en clave | DiagSpill |
| Componente | Kernel de Linux |
| Subsistema | SCTP / sock_diag |
| Archivo afectado | net/sctp/associola.c |
| Función principal | sctp_assoc_add_peer() |
| Clase de error | Desbordamiento de entero / Escritura fuera de límites |
| Impacto | Corrupción de memoria del kernel |
| Impacto potencial | Escalada de privilegios local |
| CVSS v3.1 | 7.0 — Alta |
| Vector de ataque | Local |
| Complejidad del ataque | Alta |
| Privilegios requeridos | Bajos |
| Interacción del usuario | Ninguna |
| Estado | Parcheado |
El aviso CVE del kernel de Linux describe el problema como un desbordamiento de transport_count de 16 bits en SCTP, seguido de una asignación de INET_DIAG_PEERS de tamaño insuficiente y una escritura fuera de límites durante el volcado de diagnóstico.
El código vulnerable mantiene el número de transportes de pares únicos en un contador de 16 bits:
transport_count
Cada nuevo par único añadido incrementa el contador.
El límite crítico es:
65535
Añadir otro transporte único provoca:
65535 + 1
↓
0
La envolvente resultante crea una inconsistencia entre:
transport_count
y:
transport_addr_list
El subsistema de diagnóstico posteriormente confía en el contador envuelto al calcular el tamaño del búfer de respuesta, mientras sigue iterando a través de la lista completa de direcciones de pares.
La vulnerabilidad se puede representar 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
El aviso upstream indica específicamente que el transporte número 65.536 hace que el contador vuelva a cero.
El código de diagnóstico depende efectivamente de dos vistas diferentes del mismo estado.
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
Después de que el entero se desborde:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
El asignador, por lo tanto, reserva espacio en función de:
0 peers
mientras la operación de copia aún puede procesar:
65536 peer addresses
Esta discrepancia produce la violación de seguridad de memoria.
El aviso del Kernel de Linux describe el volcado de diagnóstico resultante como la reserva de una carga útil vacía y luego la escritura de aproximadamente 8 MiB de direcciones de pares más allá del final del skb.
Conceptualmente:
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
Red Hat clasifica la falla como CWE-787: Out-of-bounds Write.
La ruta relevante se puede resumir 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
El archivo fuente afectado es:
net/sctp/associola.c
El anuncio de CVE del kernel de Linux identifica este archivo explícitamente.
La corrección upstream es:
bd0e9289e2642f6a5c54faad304ce0f41e926d22
Commit:
sctp: prevent peer transport count overflow
La corrección rechaza un nuevo par único cuando:
transport_count >= U16_MAX
Es importante destacar que la comprobación se realiza después de la búsqueda de pares existentes.
Esto preserva la capacidad de recuperar un transporte ya existente incluso cuando la asociación ha alcanzado el límite.
New peer
│
▼
transport_count++
│
▼
Possible 16-bit wrap
│
▼
Diagnostic size mismatch
│
▼
OOB write