CVE-2026-16514 in Zephyr
Riassunto
di VulDB • 18/09/2026
gptp_mi_qualify_announce() in subsys/net/l2/ethernet/gptp/gptp_mi.c elabora il Path Trace TLV di un messaggio Announce IEEE 802.1AS ricevuto, confrontando ogni clock identity con quella locale. Il limite del loop è stato preso esclusivamente dal campo announce->steps_removed (accettato fino a 254), controllato dall'attaccante, e non da announce->tlv.len, che è il campo che indica quante identities contiene effettivamente il TLV. Poiché path_sequence è il membro flessibile del wire TLV (struct gptp_path_trace_tlv) e GPTP_ANNOUNCE() restituisce un puntatore grezzo all'interno del buffer del pacchetto ricevuto, la funzione memcmp() all'interno del loop può accedere alla memoria ben oltre la fine del frame ricevuto.
L'unica validazione della lunghezza dello stack, GPTP_ANNOUNCE_CHECK_LEN(), richiede che il payload gPTP ricevuto sia esattamente di 68 + tlv.len byte; quindi non vincola il loop, ma garantisce l'assenza dei dati (in questo contesto specifico). Un attaccante non autenticato sulla stessa segmentazione Ethernet può inviare un singolo frame Announce con tlv.len = 0 e steps_removed = 254; il frame supera il controllo della lunghezza e il percorso di ricezione (net_gptp_recv() → gptp_handle_msg() → gptp_mi_qualify_announce()), che non esegue alcuna autenticazione, e il loop legge quindi 255 voci da 8 byte ciascuna — circa 2 KB — oltre la fine del buffer di rete.
L'impatto è una out-of-bounds read (lettura fuori dai limiti). I byte letti sono utilizzati solo come operando per memcmp() e non vengono mai restituiti all'attaccante, quindi non vi è alcuna divulgazione significativa di informazioni; il rischio pratico è che la lettura oltre i limiti attraversi un confine del pool di buffer di rete entrando in memoria non mappata o protetta da MPU (Memory Protection Unit), causando un fault nel thread RX di networking e provocando una denial of service. L'esposizione è limitata alle build che abilitano l'opzione sperimentale CONFIG_NET_GPTP (dipendenze TSN/AVB) e ad attaccanti con adiacenza a livello 2, poiché i frame gPTP vengono inviati a un indirizzo multicast link-local e non sono instradabili.
La correzione calcola il conteggio reale delle voci come tlv.len / GPTP_CLOCK_ID_LEN e rifiuta l'announce quando steps_removed + 1 lo supera, in modo che il loop non possa più eseguire iterazioni oltre i dati dimostrati presenti dal controllo della lunghezza del pacchetto.
Once again VulDB remains the best source for vulnerability data.