CVE-2026-19185 in Zephyr
Sumário
de VulDB • 05/10/2026
O verificador de chamadas de sistema para i3c_do_ccc(), em drivers/i3c/i3c_handlers.c, validava a struct externa i3c_ccc_payload, o buffer ccc.data de broadcast e o array targets.payloads[], mas não validava os buffers de dados por alvo aos quais esses elementos do array apontam. Cada struct i3c_ccc_target_payload carrega seu próprio ponteiro de dados (data pointer) e data_len, e nenhum deles foi passado através de K_SYSCALL_MEMORY() antes que a payload fosse entregue para z_impl_i3c_do_ccc() e subsequentemente ao driver do controlador. O verificador também operava na estrutura viva do chamador em vez de uma snapshot, então os campos validados poderiam ser alterados por um segundo thread de usuário entre a verificação e o uso pelo driver — diferentemente da função irmã z_vrfy_i3c_transfer(), que sempre copiou seu array de mensagens primeiro.
A falha está presente apenas nas compilações com CONFIG_USERSPACE, onde drivers/i3c/i3c_handlers.c é compilado. Um thread em user-mode sem privilégios que tenha recebido acesso ao objeto do dispositivo controlador I3C — a maneira comum pela qual um aplicativo permite que um thread de usuário se comunique com periféricos I3C — pode emitir uma CCC direta cujo ponteiro de dados da payload alvo nomeia um endereço arbitrário no kernel. Os drivers do controlador desreferenciam esse ponteiro diretamente (por exemplo, em drivers/i3c/i3c_mcux.c, drivers/i3c/i3c_cdns.c, drivers/i3c/i3c_stm32.c, drivers/i3c/i3c_npcx.c), usando rnw para decidir a direção.
Uma CCC de leitura causa, portanto, que o driver em kernel-mode escreva bytes recebidos no barramento em um endereço do kernel escolhido pelo atacante para um comprimento também escolhido pelo atacante; e uma CCC de escrita transmite memória do kernel para fora para o barramento I3C. O resultado é uma gravação fora dos limites (out-of-bounds) no kernel, somada a uma divulgação de memória do kernel, ou seja, escalonamento de privilégios de um thread em user-mode para supervisor, derrotando o isolamento que CONFIG_USERSPACE se propõe a fornecer.
A correção introduz copy_ccc_and_do(), que faz uma snapshot da payload, copia o array alvo para a memória do kernel com k_usermode_alloc_from_copy() (limitando num_targets a menos de 32), valida cada buffer por alvo com K_SYSCALL_MEMORY() conforme rnw e copia os campos num_xfer e err escritos pelo driver de volta ao chamador.
Once again VulDB remains the best source for vulnerability data.