
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 del kernel de Linux en SCTP causada por un desbordamiento
de un contador de transportes de pares de 16 bits, que permite que el contador
pase de 65535 a 0. Durante un volcado de diagnóstico SCTP, el valor
desbordado puede provocar una reserva insuficiente del payload del skb seguida
de una escritura fuera de límites de los datos de dirección de los pares.
Este repositorio está destinado únicamente a investigación de seguridad autorizada, análisis de vulnerabilidades del kernel, entornos CTF, depuración del kernel y pruebas defensivas.
No utilice el código de prueba de concepto contra sistemas sin autorización explícita.
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
El desbordamiento resultante crea una inconsistencia entre:
transport_count
y:
transport_addr_list
El subsistema de diagnóstico posteriormente confía en el contador desbordado al calcular el tamaño del búfer de respuesta, mientras sigue iterando por 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 se desborde 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 desborda:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
Por lo tanto, el asignador reserva espacio basándose en:
0 peers
mientras que la operación de copia todavía 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 un payload vacío 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 el fallo como CWE-787: Escritura fuera de límites.
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 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 ocurre 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
New peer
│
▼
Existing peer?
│
┌─┴──────────┐
│ │
YES NO
│ │
▼ ▼
Reuse Check U16_MAX
transport │
▼
Reject at limit
La propiedad de seguridad importante es evitar que el contador se desborde alguna vez, preservando al mismo tiempo la semántica normal de búsqueda para un par existente.
La corrupción de memoria puede provocar potencialmente:
La investigación pública publicada tras la divulgación reporta explotación local-root bajo condiciones específicas, mientras que la puntuación original del CNA del kernel de Linux utiliza AV:L/AC:H/PR:L/UI:N.
La vulnerabilidad también se describe como potencialmente alcanzable de forma remota bajo circunstancias muy específicas de configuración de SCTP/direcciones, pero eso no debe tratarse como equivalente a una vulnerabilidad explotable remotamente de forma general.
Topología aislada recomendada:
┌───────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────────┐ │
│ │ SCTP Association │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ Multiple SCTP │ │
│ │ Peer Transports │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ SCTP sock_diag │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ INET_DIAG_PEERS │
│ │
└───────────────────────────────────────────┘
Herramientas útiles:
ip sctp
ss
ss -a
ss -A sctp
dmesg -w
gdb
pwndbg
crash
Comprobar el soporte de SCTP:
lsmod | grep sctp
Comprobar la configuración del kernel:
grep CONFIG_IP_SCTP /boot/config-$(uname -r)
Comprobar el kernel en ejecución:
uname -r
Comprobar la configuración de SCTP:
grep -E 'CONFIG_IP_SCTP|CONFIG_SCTP' \
/boot/config-$(uname -r)
Comprobar los módulos SCTP cargados:
lsmod | grep -i sctp
Inspeccionar los sockets SCTP:
ss -A sctp
Para investigación controlada del kernel:
01. Build vulnerable kernel
↓
02. Boot isolated VM
↓
03. Enable SCTP
↓
04. Create controlled SCTP association
↓
05. Populate unique peer transports
↓
06. Reach transport-count boundary
↓
07. Trigger SCTP diagnostic dump
↓
08. Monitor skb diagnostics
↓
09. Capture kernel behavior
↓
10. Apply upstream fix
↓
11. Repeat test
↓
12. Compare vulnerable vs patched
Monitorizar la salida del kernel:
sudo dmesg -w
Para depuración:
gdb vmlinux
o:
pwndbg vmlinux
CVE-2026-74469-DiagSpill/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── sctp-transport-count.md
│ ├── sock-diag.md
│ ├── skb-overflow.md
│ └── patch-analysis.md
│
├── kernel/
│ ├── vulnerable/
│ └── patched/
│
├── lab/
│ ├── setup.sh
│ ├── cleanup.sh
│ └── topology.md
│
├── screenshots/
│
├── docs/
│ └── research-notes.md
│
└── LICENSE
La mitigación principal es actualizar a un kernel que contenga la corrección upstream.
Para Debian/Kali:
sudo apt update
sudo apt full-upgrade
Luego reiniciar:
sudo reboot
Verificar:
uname -r
Si SCTP no es necesario, los administradores también pueden considerar
deshabilitar la funcionalidad SCTP afectada según su entorno y requisitos
operativos. La investigación pública enumera específicamente deshabilitar
SCTP / sctp_diag como mitigación inmediata cuando esos componentes no se
utilizan.
El anuncio upstream de la rama estable enumera estas versiones corregidas:
Estas versiones provienen del anuncio CVE del kernel de Linux; las distribuciones pueden aplicar la corrección en paquetes con una numeración de versión diferente.
Un contador de 16 bits tiene un máximo estricto:
U16_MAX = 65535
El código sensible a la seguridad debe manejar explícitamente ese límite.
El tamaño utilizado para asignar un búfer debe corresponder al número de objetos realmente copiados en él.
Las API de diagnóstico del kernel pueden convertirse en superficies de ataque de corrupción de memoria cuando el estado interno se vuelve inconsistente.
La primitiva original es un desbordamiento de entero, pero el impacto de seguridad resultante es una escritura fuera de límites en el kernel.
Las asociaciones SCTP pueden contener grandes colecciones de transportes de pares, lo que hace que los límites de contadores y la lógica de gestión de listas sean críticos para la seguridad.
net/sctp/associola.csctp_assoc_add_peer()sctp: prevent peer transport count overflowbd0e9289e2642f6a5c54faad304ce0f41e926d22Linux Kernel · SCTP · sock_diag · OOB Write · Kernel Security
Research • Analyze • Reproduce • Harden
| Campo | Detalles |
|---|
| CVE | CVE-2026-74469 |
| Nombre en clave | DiagSpill |
| Componente | Linux Kernel |
| Subsistema | SCTP / sock_diag |
| Archivo afectado | net/sctp/associola.c |
| Función principal | sctp_assoc_add_peer() |
| Clase de bug | 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 |
| Propiedad de seguridad | Vulnerable | Parcheado |
|---|
| Límite de transporte de 16 bits aplicado | ❌ | ✅ |
| Desbordamiento del contador prevenido | ❌ | ✅ |
| Pares existentes siguen siendo utilizables | ✅ | ✅ |
| Tamaño del payload de diagnóstico fiable | ❌ | ✅ |
| Escritura OOB en skb prevenida | ❌ | ✅ |
| Corrupción de memoria del kernel mitigada | ❌ | ✅ |
| Rama | Versión corregida |
|---|
| 5.10 | 5.10.265 |
| 5.15 | 5.15.216 |
| 6.1 | 6.1.183 |
| 6.6 | 6.6.151 |
| 6.12 | 6.12.103 |
| 6.18 | 6.18.44 |
| 7.1 | 7.1.8 |
| 7.2 | 7.2-rc6 |