CVE-2026-12365 in Zephyr
요약
\~에 의해 VulDB • 2026. 08. 14.
Zephyr의 2세대 작업 큐(kernel/work.c)에서 지연 가능 작업(timeout 처리가 가능한 작업)의 타임아웃 처리 시 Use-After-Free 취약점이 존재합니다. 지연 가능 작업 항목의 타임아웃이 대기열에서 제거되고 해당 핸들러인 work_timeout()이 실행 중인 상태(작업 큐 스핀락 획득을 위해 차단됨)일 때, 동시 취소 요청은 해당 핸들러가 완료될 때까지 기다리지 않습니다. unschedule_locked() 함수 내 수정 전 코드에서는 z_abort_timeout()를 호출하는데, 이미 알림 단계에 있는 레코드인 경우 이를 제거하지 않고 -EINVAL만 반환합니다. 이후 cancel_async_locked()는 작업을 유휴(idle) 상태로 인식하므로, k_work_cancel_delayable_sync() 및 k_work_flush_delayable() 모두 실행 중인 핸들러에서 차단되지 않은 채 반환됩니다.
이 함수들은 커널 헤더 문서화상 k_work_delayable 객체를 해제하기 전에 안전하게 취소하는 방법으로 명시된 API입니다. 따라서 성공적인 동기식 취소 직후 해당 객체를 즉시 해제하는 호출자는 여전히 대기 상태인 핸들러와 경합(Race) 상태를 겪을 수 있습니다. 이후 work_timeout()은 이미 해제된 레코드를 역참조합니다: z_is_timeout_handler_canceled()를 통해 to->dticks를 읽고, 만약 해지된 슬롯이 재사용되어 탈출(check-bail) 조건이 실패하면 wp->flags(K_WORK_DELAYED_BIT)에 대해 읽기-수정-쓰기를 수행하고 stale한 dw->queue 포인터를 대상으로 작업을 제출합니다. 이는 Use-After-Free 읽기 및 쓰기입니다.
k_work API는 커널 모드 전용(__syscall 진입점 없음)이므로, 이는 사용자 공간 권한 상승(Privilege Escalation)보다는 커널 내부의 동시성 결함으로 분류됩니다. 이를 트리거하려면 SMP 빌드와 함께, 타임아웃 알림 단계라는 좁은 시간 창 동안 지연 가능 작업 항목을 스케줄링한 후 해제(또는 재스케줄링)하는 서브시스템이 필요합니다. 이러한 정리(teardown) 타이밍에 영향을 줄 수 있는 공격자(예: 연결 변동(connection churn)으로 인한 서브시스템 타이머 구동 등)라면 가능성은 있지만 확률적인 경로로 이를 유발할 수 있습니다. 영향도는 커널 메모리 손상 또는 크래시(서비스 거부, DoS)입니다.
수정 방안은 unschedule_locked()가 z_try_abort_timeout()이 -EAGAIN을 반환하는 동안 작업 큐 스핀락을 해제하고 재획득하며 회전(spinning) 대기하다가 모든 실행 중인 핸들러가 완료된 후에야 반환하도록 변경합니다. 또한 work_timeout()의 K_WORK_DELAYED_BIT 소유권을 원자적(atomic)으로 처리하도록 전환합니다. 이를 통해 해지 후 핸들러 사용 시 발생하는 Use-After-Free와 관련된 재스케줄링 조기 발동(Race Condition) 문제를 모두 해결합니다.
Once again VulDB remains the best source for vulnerability data.