
Repository di ricerca per CVE-2026-74469 (DiagSpill), un overflow del contatore del trasporto peer SCTP del kernel Linux che causa una scrittura fuori dai limiti, con PoC, analisi della causa principale e dettagli sulla patch.
DiagSpill
Una vulnerabilità SCTP del kernel Linux causata da un overflow del contatore
a 16 bit dei trasporti peer, che consente al contatore di passare da 65535 a
0. Durante un dump diagnostico SCTP, il valore soggetto a wraparound può
causare una prenotazione insufficiente del payload skb seguita da una scrittura
out-of-bounds dei dati dell'indirizzo peer.
Questo repository è destinato esclusivamente a ricerca di sicurezza autorizzata, analisi di vulnerabilità del kernel, ambienti CTF, debug del kernel e test difensivi.
Non utilizzare il codice proof-of-concept contro sistemi senza esplicita autorizzazione.
L'advisory CVE del kernel Linux descrive il problema come un overflow a 16 bit
di transport_count in SCTP, seguito da un'allocazione INET_DIAG_PEERS di
dimensioni insufficienti e da una scrittura out-of-bounds durante il dump
diagnostico.
Il codice vulnerabile mantiene il numero di trasporti peer univoci in un contatore a 16 bit:
transport_count
Ogni nuovo peer univoco aggiunto incrementa il contatore.
Il limite critico è:
65535
L'aggiunta di un ulteriore trasporto univoco causa:
65535 + 1
↓
0
Il wraparound risultante crea un'incoerenza tra:
transport_count
e:
transport_addr_list
Il sottosistema diagnostico in seguito si fida del contatore soggetto a wraparound nel calcolare la dimensione del buffer di risposta, mentre continua a iterare sull'intera lista degli indirizzi peer.
La vulnerabilità può essere rappresentata come:
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
L'advisory upstream afferma specificamente che il 65.536° trasporto porta il contatore a zero tramite wraparound.
Il codice diagnostico si basa di fatto su due viste diverse dello stesso stato.
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
Dopo il wraparound dell'intero:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
L'allocatore riserva quindi spazio in base a:
0 peers
mentre l'operazione di copia può comunque elaborare:
65536 peer addresses
Questa discrepanza produce la violazione della sicurezza della memoria.
L'advisory del kernel Linux descrive il dump diagnostico risultante come la prenotazione di un payload vuoto e la successiva scrittura di circa 8 MiB di indirizzi peer oltre la coda dell'skb.
Concettualmente:
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 classifica il difetto come CWE-787: Out-of-bounds Write.
Il percorso rilevante può essere riassunto come:
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
Il file sorgente interessato è:
net/sctp/associola.c
L'annuncio CVE del kernel Linux identifica esplicitamente questo file.
La correzione upstream è:
bd0e9289e2642f6a5c54faad304ce0f41e926d22
Commit:
sctp: prevent peer transport count overflow
La correzione rifiuta un nuovo peer univoco quando:
transport_count >= U16_MAX
È importante notare che il controllo avviene dopo la ricerca del peer esistente.
Ciò preserva la possibilità di recuperare un trasporto già esistente anche quando l'associazione ha raggiunto il 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
La proprietà di sicurezza importante è impedire che il contatore vada mai in wraparound, preservando al contempo la normale semantica di ricerca per un peer esistente.
La corruzione della memoria può potenzialmente causare:
La ricerca pubblica rilasciata dopo la divulgazione riporta sfruttamento local-root in condizioni specifiche, mentre il punteggio originale del CNA del kernel Linux utilizza AV:L/AC:H/PR:L/UI:N.
La vulnerabilità è anche descritta come potenzialmente raggiungibile da remoto in circostanze molto specifiche di configurazione SCTP/indirizzi, ma ciò non deve essere considerato equivalente a una vulnerabilità generalmente sfruttabile da remoto.
Topologia isolata consigliata:
┌───────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────────┐ │
│ │ SCTP Association │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ Multiple SCTP │ │
│ │ Peer Transports │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ SCTP sock_diag │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ INET_DIAG_PEERS │
│ │
└───────────────────────────────────────────┘
Strumenti utili:
ip sctp
ss
ss -a
ss -A sctp
dmesg -w
gdb
pwndbg
crash
Verifica del supporto SCTP:
lsmod | grep sctp
Verifica della configurazione del kernel:
grep CONFIG_IP_SCTP /boot/config-$(uname -r)
Verifica del kernel in esecuzione:
uname -r
Verifica della configurazione SCTP:
grep -E 'CONFIG_IP_SCTP|CONFIG_SCTP' \
/boot/config-$(uname -r)
Verifica dei moduli SCTP caricati:
lsmod | grep -i sctp
Ispezione dei socket SCTP:
ss -A sctp
Per la ricerca controllata sul 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
Monitoraggio dell'output del kernel:
sudo dmesg -w
Per il debug:
gdb vmlinux
oppure:
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 mitigazione principale consiste nell'aggiornare a un kernel che contenga la correzione upstream.
Per Debian/Kali:
sudo apt update
sudo apt full-upgrade
Poi riavviare:
sudo reboot
Verificare:
uname -r
Se SCTP non è necessario, gli amministratori possono anche considerare di
disabilitare la funzionalità SCTP interessata in base al proprio ambiente e ai
requisiti operativi. La ricerca pubblica elenca specificamente la disabilitazione
di SCTP / sctp_diag come mitigazione immediata quando tali componenti non sono
utilizzati.
L'annuncio upstream stable elenca queste release corrette:
Queste versioni provengono dall'annuncio CVE del kernel Linux; le distribuzioni possono effettuare il backport della correzione in pacchetti con numerazione di versione diversa.
Un contatore a 16 bit ha un massimo rigido:
U16_MAX = 65535
Il codice sensibile alla sicurezza deve gestire esplicitamente tale limite.
La dimensione utilizzata per allocare un buffer deve corrispondere al numero di oggetti effettivamente copiati al suo interno.
Le API diagnostiche del kernel possono diventare superfici di attacco per la corruzione della memoria quando lo stato interno diventa incoerente.
La primitiva originale è un integer overflow, ma l'impatto risultante sulla sicurezza è una scrittura out-of-bounds nel kernel.
Le associazioni SCTP possono contenere grandi collezioni di trasporti peer, rendendo i limiti dei contatori e la logica di gestione delle liste critici per la sicurezza.
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 | Dettagli |
|---|
| CVE | CVE-2026-74469 |
| Nome in codice | DiagSpill |
| Componente | Linux Kernel |
| Sottosistema | SCTP / sock_diag |
| File interessato | net/sctp/associola.c |
| Funzione principale | sctp_assoc_add_peer() |
| Classe di bug | Integer overflow / Out-of-bounds write |
| Impatto | Corruzione della memoria del kernel |
| Impatto potenziale | Escalation locale dei privilegi |
| CVSS v3.1 | 7.0 — High |
| Attack Vector | Local |
| Attack Complexity | High |
| Privileges Required | Low |
| User Interaction | None |
| Stato | Patched |
| Proprietà di sicurezza | Vulnerabile | Corretto |
|---|
| Limite trasporti a 16 bit applicato | ❌ | ✅ |
| Wraparound del contatore impedito | ❌ | ✅ |
| Peer esistenti ancora utilizzabili | ✅ | ✅ |
| Dimensione payload diagnostico affidabile | ❌ | ✅ |
| Scrittura OOB su skb impedita | ❌ | ✅ |
| Corruzione memoria kernel mitigata | ❌ | ✅ |
| Branch | Release corretta |
|---|
| 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 |