CVE-2026-18747 in Zephyrinformazioni

Riassunto

di VulDB • 29/09/2026

Il trasporto SMP-over-console di MCUmgr decodifica un frame in base64, legge una lunghezza del pacchetto a 16 bit da esso, verifica la CRC e quindi rimuove incondizionatamente la CRC finale con `rx_ctxt->nb->len -= 2U;` in `mcumgr_serial_process_frag()` (subsys/mgmt/mcumgr/transport/src/serial_util.c). La funzione `mcumgr_serial_extract_len()` accetta qualsiasi lunghezza dichiarata, inclusi 0 e 1, e un pacchetto che dichiara una lunghezza di 0 supera il test del checksum gratuitamente poiché `crc16_itu_t()` su zero byte restituisce la seed zero. Poiché `net_buf::len` è un `uint16_t`, la sottrazione provoca un underflow e il buffer viene passato a SMP affermando circa 65 KB di payload, mentre l'area dati ha solo `CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE` byte (384 predefiniti).

Il trigger consiste in una singola riga non autenticata di 7 byte sulla console di gestione — il marker del pacchetto 0x06 0x09 seguito dal gruppo base64 AAA= e da un newline — inviato a qualsiasi trasporto basato su questo helper: `CONFIG_MCUMGR_TRANSPORT_UART` (smp_uart.c) o `CONFIG_MCUMGR_TRANSPORT_SHELL` (smp_shell.c), entrambi dei quali selezionano `MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE`. Non è richiesto alcuno stato di sessione precedente, frammentazione o credenziali per innescare l'underflow e il frame malformato viene gestito in modo errato prima che venga eseguito qualsiasi handler di comando o controllo dell'accesso a livello di comando. L'attaccante ha solo bisogno di accesso in scrittura alla console, che su molte board è una porta USB CDC-ACM piuttosto che un header UART nudo e crudo.

Con la lunghezza gonfiata, `smp_process_request_packet()` in subsys/mgmt/mcumgr/smp/src/smp.c perde i suoi limiti: `cbor_nb_reader_init()` fornisce al decoder CBOR una finestra di ~65 KB su un buffer da 384 byte e l'`nh_len` di ogni header della richiesta viene controllato solo rispetto alla lunghezza gonfiata. Da sola, la cornice a 7 byte riparsa i byte obsoleti che il pool riutilizzato del buffer ancora contiene, tipicamente una ripetizione della richiesta ricevuta in precedenza seguita da un errore di parsing, senza uscire dal buffer. Poiché però il trasporto non è autenticato, l'attaccante controlla anche le frame inviate prima dell'innesco e può preparare i contenuti del buffer in modo che una richiesta abbia successo con un `nh_len` maggiore della dimensione del buffer; `net_buf_pull()`, protetto solo da `__ASSERT_NO_MSG`, sposta quindi il cursore di parsing fuori dai limiti e il ciclo legge ulteriori header e CBOR dalla memoria adiacente. La conseguenza è una lettura out-of-bounds che può causare un fault nel thread MCUmgr (denial of service); la divulgazione della memoria è anche possibile, poiché l'handler echo OS abilitato per default (`CONFIG_MCUMGR_GRP_OS_ECHO`) decodifica la sua stringa all'interno di quella finestra e la copia nella risposta. Non vi è alcun guadagno in termini di integrità oltre a quanto già permesso dal trasporto non autenticato.

La correzione rifiuta qualsiasi lunghezza del pacchetto dichiarata pari o inferiore a due byte in `mcumgr_serial_extract_len()`, quindi la sottrazione per la rimozione della CRC non può più provocare un underflow. Lo stesso pattern rimane nel loopback transport solo per test subsys/mgmt/mcumgr/transport/src/smp_dummy.c (`CONFIG_MCUMGR_TRANSPORT_DUMMY`), che non ha alcun percorso di input esterno e quindi non presenta alcuna esposizione pratica.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Responsabile

Zephyr

Prenotare

03/08/2026

Divulgazione

29/09/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Do you want to use VulDB in your project?

Use the official API to access entries easily!