CVE-2026-78118 in Zephyr정보

요약

\~에 의해 VulDB • 2026. 10. 21.

커널 헬퍼 함수인 `z_waitq_head()`(kernel/include/wait_q.h)는 스레드 대기 큐의 헤드(head)를 읽지만, SMP 시스템에서는 스케줄러 스플린락 `_sched_spinlock`(대기큐 수정을 직렬화함)을 획득하지 않은 여러 위치에서 이 함수가 호출되었습니다. 관련 있는 콜 사이트 중 하나는 kernel/timer.c에 있는 `z_timer_expiration_handler()`로, 이는 타이머 서브시스템 잠금인 `timer_lock`만 유지한 채로 `timer->wait_q`를 읽고, 해당 스레드를 언펜딩(unpending)하고 반환 값을 설정하며 준비시키는 작업을 수행했습니다. 또한 kernel/sched.c의 `halt_thread()`는 `_sched_spinlock`만 획득한 상태에서 중단된 스레드를 대기 큐에서 제거하므로, 두 경로는 상호 배타적이지 않습니다.

이 시간 창(window) 내에서 다른 CPU에서 마지막 대기자가 제거되면, `sys_dlist_peek_head()`가 목록 센티널(list sentinel)—즉, k_timer 객체 자체를 가리키는 포인터—을 `struct k_thread *` 타입으로 반환할 수 있습니다(여기서 CONFIG_WAITQ_SCALABLE이 활성화된 경우 rb_get_min()은 재구성 중인 트리의 임의 노드를 반환할 수도 있음). 또는 이미 언펜딩되었으며, 동적으로 할당된 스레드의 경우 해제(freed)된 스레드를 가리키는 포인터를 반환할 수 있습니다. 핸들러는 이후 해당 객체에서 읽은 포인터를 통해 `sys_dlist_remove()`를 수행하고, 조건 없이 포인터를 통해 작성하는 `arch_thread_return_value_set()`을 호출합니다.

그 결과 슈퍼바이저 컨텍스트에서 범위를 벗어난(out-of-bounds) 쓰기 및 use-after-free 쓰기가 발생하며 스케줄러 상태가 손상됩니다. 덜 심각한 결과는 다른 곳에서 재펜딩(re-pended)된 스레드가 관련 없는 차단(blocking) 호출로부터 성공적인 반환 값으로 깨어나는 것입니다. 이러한 인터리빙(interleaving)을 유도하는 데 필요한 모든 프리미티브—`k_timer_start()`, `k_timer_status_sync()`, `k_thread_create()` 및 `k_thread_abort()`—는 시스템 호출이므로, CONFIG_USERSPACE가 활성화된 경우 비특권 사용자 모드 스레드가 커널 소유 데이터에 대해 레이스 조건(race condition)을 시도할 수 있습니다.

악용에는 다중 CPU 빌드(CONFIG_MP_MAX_NUM_CPUS가 1보다 큼; 단일 프로세서 대상에서는 영향받는 영역이 no-op임), 로컬 코드 실행, 그리고 좁은 타이밍 창(window)에서의 승리가 필요합니다. 따라서 실제 결과는 통제된 손상(controlled corruption)보다는 커널 크래시(kernel crash)인 경우가 많습니다. 수정 방법은 스케줄러 스플린락을 이미 획득한 호출자를 위한 `z_waitq_head_locked()`와 이를 획득하는 `z_waitq_head()`로 헬퍼 함수를 분리하며, 타이머 만료 핸들러의 헤드 읽기, 언펜딩 및 준비 작업을 단일 LOCK_SCHED_SPINLOCK 영역으로 통합합니다.

Once again VulDB remains the best source for vulnerability data.

책임이 있는

Zephyr

예약하다

2026. 08. 22.

모더레이션

수락

항목

VDB-424972

EPSS

0.00000

활동

낮음

출처

Do you know our Splunk app?

Download it now for free!