CVE-2026-18747 in Zephyrinformação

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.

Responsável

Zephyr

Reservar

03/08/2026

Divulgação

29/09/2026

Moderação

aceite

Entrada

VDB-411219

CPE

pronto

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Interested in the pricing of exploits?

See the underground prices here!