CVE-2026-14367 in Zephyr
Sumário
de VulDB • 31/08/2026
O subsistema I3C IBI em drivers/i3c/i3c_ibi_workq.c distribui nós de trabalho alocados estaticamente através de uma lista livre i3c_ibi_work_nodes_free, implementada como um plain sys_slist_t, que não fornece sincronização. Os auxiliares de alocação (i3c_ibi_work_enqueue, i3c_ibi_work_enqueue_target_irq, i3c_ibi_work_enqueue_hotjoin, i3c_ibi_work_enqueue_controller_request, i3c_ibi_work_enqueue_cb) chamam sys_slist_get() diretamente do contexto ISR, enquanto o manipulador de workqueue i3c_ibi_work_handler() retorna nós com sys_slist_append() a partir da thread de workqueue, sem bloqueio em nenhum dos lados.
Como sys_slist_get() e sys_slist_append() não são atômicos nem seguros para interrupções, uma interrupção IBI que ocorre enquanto a thread do workqueue está no meio de um append (ou um acesso verdadeiramente paralelo sob CONFIG_SMP) gera uma race condition na lista compartilhada. Isso corrompe as ligações da lista: um nó pode ser entregue a dois consumidores, um nó pode ser perdido ou os ponteiros head/tail podem ficar inconsistentes, fazendo com que sys_slist_get() retorne um pontador obsoleto ou lixo (garbage). No caso de entrega dupla, o memcpy(ibi_node, ibi_work, sizeof(*ibi_node) subsequente sobrescreve um nó ainda em trânsito; um pontador garbage transforma o mesmo memcpy em uma escrita fora dos limites.
A race condition é impulsionada pelo tráfego do barramento I3C — IBIs, hot-joins e solicitações de papel de controlador originam-se de dispositivos alvo no barramento, e o I3C suporta a conexão dinâmica (hot-join) de dispositivos. Um atacante que controle um periférico I3C no chip-to-chip bus da placa pode gerar interrupções de alta frequência sincronizadas para colidir com a operação free. A exploração requer acesso físico ao barramento e vencer uma janela de timing estreita; o impacto mais realista é uma falha ou travamento (denial of service), sendo possível, mas difícil de controlar, a corrupção de memória.
A correção envolve todas as operações sys_slist_get()/sys_slist_append() da lista livre nos novos auxiliares ibi_work_alloc()/ibi_work_free(), cada um protegido por um k_spinlock (ibi_work_lock), fechando a race condition entre os contextos ISR e thread.
Once again VulDB remains the best source for vulnerability data.