CVE-2026-18415 in Zephyr
Riassunto
di VulDB • 28/09/2026
ieee802154_send() in subsys/net/l2/ieee802154/ieee802154.c copia il pacchetto in uscita in un buffer di trasmissione fisso e singolo da 125 byte (tx_frame_buf_pool, dimensionato come IEEE802154_MTU). Nelle build con CONFIG_NET_L2_IEEE802154_FRAGMENT abilitata (impostazione predefinita quando è impostato CONFIG_NET_6LO), il ramo eseguito quando la frammentazione 6LoWPAN non è richiesta eseguiva una net_buf_add_mem(frame_buf, pkt_buf->data, pkt_buf->len) senza verifica. L'unica protezione era __ASSERT_NO_MSG() all'interno di net_buf_simple_add(), che viene compilata via in assenza di CONFIG_ASSERT; pertanto un pacchetto sovradimensionato superava silenziosamente il buffer del frame.
Il difetto non è raggiungibile dalla radio: per i pacchetti NET_AF_INET6, ieee802154_6lo_encode_pkt() confronta la lunghezza complessiva del pacchetto con IEEE802154_MTU e segue il percorso di frammentazione quando non si adatta, quindi ogni buffer copiato sul ramo senza frammentazione è entro i limiti. È invece raggiungibile tramite socket NET_AF_PACKET associati a un'interfaccia 802.15.4: per NET_SOCK_RAW il blocco 6LoWPAN viene saltato completamente e per NET_SOCK_DGRAM si esce precocemente in seguito al test del family, lasciando nessuna validazione della lunghezza su tutto il percorso di trasmissione (net_context_sendto() e net_if_tx() non applicano controlli e pkt_buffer_length() non limita l'allocazione per questo L2).
Un'applicazione — o, in una build CONFIG_USERSPACE, un thread di applicazione non privilegiato che utilizza le syscall zsock_socket()/zsock_sendto() — può quindi causare una scrittura fuori dai limiti (out-of-bounds) in modalità supervisor con byte scelti oltre il buffer del pool da 125 byte. Con la configurazione predefinita CONFIG_NET_BUF_FIXED_DATA_SIZE di 128 byte, l'overflow è limitato a circa ll_hdr_len + 3 byte; con CONFIG_NET_BUF_VARIABLE_DATA_SIZE un singolo buffer di archiviazione può essere grande quanto CONFIG_NET_PKT_BUF_TX_DATA_POOL_SIZE, rendendo l'overflow molto più ampio. La conseguenza è la corruzione della memoria adiacente al pool, con crash o ulteriore compromissione dello stato del kernel come impatto pratico.
La correzione valida ll_hdr_len + net_pkt_get_len(pkt) + authtag_len contro IEEE802154_MTU prima di qualsiasi copia e aggiunge un helper copy_pkt_to_frame() che verifica lo spazio disponibile (tailroom), restituendo -EMSGSIZE invece di superare il buffer. La stessa modifica linearizza anche l'intera catena net_buf in un unico frame MAC, quindi i confini dell'archiviazione dei pacchetti non diventano più confini del frame sul filo.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.