CVE-2026-52924: Use-After-Free SCTP nella Gestione dei Cookie Stale
Riepilogo della Vulnerabilità
ID CVE: CVE-2026-52924
Gravità: CRITICA (CVSS 9.8)
Componente: Kernel Linux - SCTP (Stream Control Transmission Protocol)
Tipo: Use-After-Free (CWE-416, CWE-825)
Pubblicata: 2026-06-24
Stato: Corretta
Versioni Interessate
- Kernel Linux < 5.10.259
- Kernel Linux < 5.15.210
- Kernel Linux < 6.1.176
- Kernel Linux < 6.6.143
- Kernel Linux < 6.12.94
- Kernel Linux < 6.18.36
- Kernel Linux < 7.0.13
- Kernel Linux < 7.1
Dettagli Tecnici
Causa Principale
La vulnerabilità si verifica nella gestione da parte della macchina a stati SCTP dei pacchetti COOKIE-ECHO stale. Il problema riguarda una pulizia impropria della coda di stream in uscita quando un'associazione viene ripristinata.
Flusso dell'Attacco
- Funzionamento Normale: L'associazione passa allo stato COOKIE_ECHOED
- Dati Utente in Coda: L'applicazione invia dati, che vengono accodati per la trasmissione
- Errore Cookie Stale: Il peer remoto invia un errore Stale Cookie
- Rollback Attivato: L'associazione torna da COOKIE_ECHOED → COOKIE_WAIT
- Stato Stream Aggiornato:
sctp_stream_update() libera la vecchia tabella degli stream, ne installa una nuova
- Puntatore Non Valido:
stream->out_curr punta ancora alla voce sctp_stream_out liberata
- Accesso in Dequeue: Quando lo scheduler tenta di fare dequeue (FCFS, RR, PRIO), accede a
out_curr->ext
- Use-After-Free: L'accesso alla memoria liberata → crash del kernel tramite rilevamento KASAN
Flusso di Codice Problematico
sctp_sf_do_5_2_6_stale():
├─ Ricezione errore Stale Cookie
├─ Rollback dello stato dell'associazione
└─ Chiamata a sctp_stream_update()
├─ Libera la vecchia tabella degli stream
├─ Installa la nuova tabella degli stream
└─ BUG: stream->out_curr NON invalidato ❌
Successivamente durante il dequeue:
sctp_sched_fcfs_dequeue():
└─ Accesso a stream->out_curr->ext (MEMORIA LIBERATA) 💥
Esempio di Crash
BUG: KASAN: slab-use-after-free in sctp_sched_fcfs_dequeue+0x13a/0x140
Read of size 8 at addr ff1100004d4d3208 by task mini_poc/9312
CPU: 1 UID: 1001 PID: 9312 Comm: mini_poc Not tainted 7.1.0-rc1-00305-gbd3a4795d574 #5 PREEMPT(full)
Call trace:
sctp_sched_fcfs_dequeue+0x13a/0x140
sctp_outq_flush+0x1603/0x33e0
sctp_do_sm+0x31c9/0x5d30
sctp_assoc_bh_rcv+0x392/0x6f0
sctp_inq_push+0x1db/0x270
sctp_rcv+0x138d/0x3c10
Perché Aggiornare Semplicemente out_curr Non È Sufficiente
Una correzione ingenua potrebbe essere semplicemente azzerare stream->out_curr:
// CORREZIONE INSUFFICIENTE ❌
stream->out_curr = NULL;
Problema: La coda di uscita contiene ancora:
- Chunk di dati in coda che fanno riferimento al vecchio stato degli stream
- Voci della coda di ritrasmissione che puntano ai vecchi stream
- Chunk di controllo raggruppati con metadati dei vecchi stream
Questi riferimenti stale causeranno comunque use-after-free quando vengono acceduti.
La Corretta Correzionee
Soluzione: Svuotare completamente la coda di uscita dell'associazione durante la gestione dei cookie stale.
// CORREZIONE CORRETTA ✓
sctp_outq_free(&asoc->outqueue);
Questo garantisce:
- Tutti i dati di trasmissione in sospeso vengono eliminati
- Tutte le voci della coda di ritrasmissione vengono liberate
- I puntatori memorizzati nella cache dello scheduler (out_curr, ecc.) vengono invalidati
- Lo stato degli stream può essere ricostruito in sicurezza durante il riavvio COOKIE_WAIT
- Nessun riferimento pendente alle voci degli stream liberate
Posizione dell'Implementazione
File: net/sctp/sm_statefuns.c
Funzione: sctp_sf_do_5_2_6_stale()
Aggiunta: Chiamata a sctp_outq_free(&asoc->outqueue) prima di sctp_stream_update()
enum sctp_disposition sctp_sf_do_5_2_6_stale(...)
{
// ... codice esistente ...
// Svuota la coda di uscita prima di ricostruire lo stato degli stream
sctp_outq_free(&asoc->outqueue);
// Ora è sicuro aggiornare lo stream
sctp_stream_update(&asoc->stream, &asoc->c.h_init_tag);
// ... resto della funzione ...
}
Analisi dell'Impatto
Fattori di Gravità (CVSS 9.8)
- Vettore di Attacco: Rete (CVSS:3.1/AV:N)
- Complessità dell'Attacco: Bassa (CVSS:3.1/AC:L)
- Privilegi Richiesti: Nessuno (CVSS:3.1/PR:N)
- Interazione dell'Utente: Nessuna (CVSS:3.1/UI:N)
- Scope: Invariato (CVSS:3.1/S:U)
- Impatto sulla Riservatezza: Alto (CVSS:3.1/C:H)
- Impatto sull'Integrità: Alto (CVSS:3.1/I:H)
- Impatto sulla Disponibilità: Alto (CVSS:3.1/A:H)
Requisiti di Sfruttamento
- Accesso di rete al sistema target (porta SCTP aperta)
- Capacità di inviare pacchetti SCTP per stabilire una connessione
- Invio di un errore Stale Cookie in un momento specifico (stato COOKIE_ECHOED)
- Attivazione dell'operazione di dequeue dello scheduler
Scenari di Attacco
- Denial of Service: Crash ripetuto del kernel → DoS
- Divulgazione di Informazioni: Lettura della memoria del kernel tramite UAF
- Escalation dei Privilegi: Potenziale attraverso la manipolazione della memoria
- Esecuzione di Codice Remota: Possibile con exploit di corruzione della memoria
Metodi di Rilevamento
Rilevamento KASAN (Runtime)
# Abilita KASAN nella configurazione del kernel
CONFIG_KASAN=y
CONFIG_KASAN_GENERIC=y
# L'output runtime mostra:
BUG: KASAN: slab-use-after-free
Analisi Statica
# Cerca accessi non sicuri a stream->out_curr senza validazione
grep -r "out_curr->ext" net/sctp/
grep -r "out_curr->" net/sctp/sched*.c
Rilevamento di Rete
- Monitorare i pacchetti di errore SCTP Stale Cookie (Tipo 3, Codice 1)
- Tracciare i pattern di rollback delle connessioni
- Avvisare su transizioni rapide COOKIE_ECHOED → COOKIE_WAIT
Strategie di Mitigazione
Mitigazioni Temporanee (Fino alla Patch)
-
Disabilitare SCTP: Rimuovere il modulo SCTP o bloccare le porte SCTP (132, 132 UDP)
echo "install sctp /bin/true" >> /etc/modprobe.d/sctp-disable.conf
-
Regole Firewall: Bloccare il traffico SCTP al confine di rete
iptables -A INPUT -p sctp -j DROP
-
Versione del Kernel: Aggiornare alle versioni patchate
- 5.10.259+
- 5.15.210+
- 6.1.176+
- 6.6.143+
- 6.12.94+
- 6.18.36+
- 7.0.13+
- 7.1+ (ultima)
Correzionee Permanente
Applicare la patch del kernel che chiama sctp_outq_free() in sctp_sf_do_5_2_6_stale().
Riferimenti
Raccomandazioni per i Test
Test Unitari
- Verificare che
sctp_outq_free() invalidi correttamente out_curr
- Verificare che tutti i dati in coda vengano liberati durante outq_free
- Verificare che la coda di ritrasmissione venga svuotata
- Testare il comportamento dello scheduler dopo lo svuotamento della coda di uscita
Test di Integrazione
- Flusso normale di recupero da cookie stale
- Dati in volo quando viene ricevuto un cookie stale
- Più cookie stale rapidi
- Diversi scheduler SCTP (FCFS, RR, PRIO)
Test di Fuzzing
- Inviare pacchetti SCTP con errori di cookie stale
- Variare la tempistica dell'iniezione dell'errore
- Variare la quantità di dati in volo
- Testare con condizioni di carico elevato
Cronologia
- 2026-06-24: Vulnerabilità divulgata pubblicamente
- Stato: Correzionee disponibile
- Punteggio EPSS: 0,3% (27° percentile)
- Bassa probabilità di sfruttamento
- Richiede condizioni di rete specifiche
- Exploit reali limitati indicizzati