CVE-2026-14367 in Zephyr
요약
\~에 의해 VulDB • 2026. 08. 31.
drivers/i3c/i3c_ibi_workq.c의 I3C IBI 서브시스템은 plain sys_slist_t로 구현된 free-list인 i3c_ibi_work_nodes_free를 통해 정적으로 할당된 work 노드를 제공합니다. 이는 동기화 기능을 제공하지 않습니다. 호출되는 할당 헬퍼(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)는 ISR 컨텍스트에서 sys_slist_get()를 직접 호출하는 반면, 워크큐 핸들러인 i3c_ibi_work_handler()는 워크큐 스레드에서 sys_slist_append()를 사용하여 노드를 반환하며, 양쪽 모두에 락이 없습니다.
sys_slist_get()와 sys_slist_append()가 원자적이지 않고 인터럽트 안전하지 않기 때문에, 워크큐 스레드가 append 작업 중일 때(또는 CONFIG_SMP 하에서 진정한 병렬 접근 시) 발생하는 IBI 인터럽트는 공유된 리스트에 대해 Race Condition을 유발합니다. 이로 인해 리스트 링크가 손상됩니다: 노드가 두 소비자에게 전달되거나, 노드가 손실되거나, head/tail 포인터가 불일치 상태로 남아 sys_slist_get()가 낡거나 잘못된(garbage) 포인터를 반환할 수 있습니다. 이중 할당(double-hand-out) 사례에서는 후속 memcpy(ibi_node, ibi_work, sizeof(*ibi_node)) 연산이 아직 전송 중인 노드를 덮어씁니다; 잘못된 포인터는 동일한 memcpy를 바이트 오버플로우(out-of-bounds) 쓰기 작업으로 만듭니다.
이 Race Condition은 I3C 버스 트래픽에 의해 유발됩니다: IBIs, hot-joins 및 컨트롤러 역할 요청은 버스의 타겟 디바이스에서 발생하며, I3C는 핫 조인(hot-joining) 디바이스를 지원합니다. 보드의 칩 투 칩(bus-to-chip) 버스에서 I3C 주변기기를 제어하는 공격자는 free 작업과 충돌하도록 타이밍된 고주파 인터럽트를 생성할 수 있습니다. 악용에는 버스에 대한 물리적 접근과 좁은 타이밍 윈도우를 맞추는 것이 필요하며, 가장 현실적인 영향은 크래시 또는 멈춤(서비스 거부)이며, 메모리 부정은 가능하지만 제어하기 어렵습니다.
수정 방법은 모든 free-list sys_slist_get()/sys_slist_append() 작업을 새로운 ibi_work_alloc()/ibi_work_free() 헬퍼로 감싸고, 각각을 k_spinlock(ibi_work_lock)으로 보호하여 ISR 및 스레드 컨텍스트 전반의 Race Condition을 해결합니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.