CVE-2026-18747 in Zephyr
Sumário
de VulDB • 29/09/2026
O transporte SMP-over-console do MCUmgr decodifica um quadro em base64, lê o comprimento de 16 bits do pacote a partir dele, verifica uma CRC e, em seguida, remove incondicionalmente a CRC final com `rx_ctxt->nb->len -= 2U;` em `mcumgr_serial_process_frag()` (subsys/mgmt/mcumgr/transport/src/serial_util.c). A função `mcumgr_serial_extract_len()` aceita qualquer comprimento declarado, incluindo 0 e 1, e um pacote que declara comprimento 0 passa no teste de checksum gratuitamente porque `crc16_itu_t()` sobre zero bytes retorna a semente zero. Como o campo `net_buf::len` é do tipo uint16_t, a subtração causa underflow (estouro por falta) e o buffer é entregue ao SMP alegando aproximadamente 65 KB de payload, enquanto sua área de dados tem apenas CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE bytes (padrão: 384).
O gatilho consiste em uma única linha não autenticada de 7 bytes no console de gerenciamento — o marcador de pacote 0x06 0x09 seguido pelo grupo base64 AAA= e um caractere de nova linha — entregue a qualquer transporte construído sobre este auxiliar: CONFIG_MCUMGR_TRANSPORT_UART (smp_uart.c) ou CONFIG_MCUMGR_TRANSPORT_SHELL (smp_shell.c), ambos dos quais selecionam MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE. Nenhum estado de sessão anterior, fragmentação ou credenciais são necessários para acionar o underflow, e o quadro malformado é tratado incorretamente antes que qualquer manipulador de comando ou controle de acesso em nível de comando seja executado. O atacante precisa apenas ter acesso de gravação a esse console, que em muitas placas é uma porta USB CDC-ACM em vez de um cabeçalho UART bruto.
Com o comprimento inflacionado, `smp_process_request_packet()` em subsys/mgmt/mcumgr/smp/src/smp.c perde seus limites: `cbor_nb_reader_init()` fornece ao decodificador CBOR uma janela de ~65 KB dentro de um buffer de 384 bytes, e cada cabeçalho de solicitação tem seu nh_len verificado apenas contra o comprimento inflacionado. Por si só, a estrutura de 7 bytes reanalisaria os bytes obsoletos que o buffer do pool reutilizado ainda contém, tipicamente uma repetição da solicitação recebida anteriormente seguida por um erro de análise, sem sair do buffer. No entanto, como o transporte não é autenticado, o atacante também controla as estruturas enviadas antes do gatilho e pode preparar o conteúdo do buffer para que uma solicitação seja bem-sucedida com um nh_len maior que o tamanho do buffer; `net_buf_pull()`, protegido apenas por __ASSERT_NO_MSG, move então o cursor de análise para fora dos limites e o loop lê cabeçalhos adicionais e dados CBOR da memória adjacente. A consequência é uma leitura fora dos limites (out-of-bounds read) que pode causar falha na thread do MCUmgr (negação de serviço); a divulgação de memória também é possível, já que o manipulador de eco do sistema operacional habilitado por padrão (CONFIG_MCUMGR_GRP_OS_ECHO) decodifica sua string dentro dessa janela e a copia para sua resposta. Não há ganho de integridade além do que o transporte não autenticado já permite.
A correção rejeita qualquer comprimento de pacote declarado de dois bytes ou menos em `mcumgr_serial_extract_len()`, portanto, a subtração da remoção da CRC não pode mais causar underflow. O padrão idêntico permanece no transporte loopback apenas para testes subsys/mgmt/mcumgr/transport/src/smp_dummy.c (CONFIG_MCUMGR_TRANSPORT_DUMMY), que não possui caminho de entrada externo e, portanto, não apresenta exposição prática.
If you want to get best quality of vulnerability data, you may have to visit VulDB.