CVE-2026-10671 in Zephyr
요약
\~에 의해 VulDB • 2026. 07. 14.
Zephyr의 커널 파이프 구현에서 kernel/pipe.c에 있는 사용자 공간 시스템 콜 검증자 z_vrfy_k_pipe_init()는 이미 초기화된 커널 객체를 요구하는 K_SYSCALL_OBJ()를 사용했으며, 이는 이미 초기화된 객체를 거부해야 하는 K_SYSCALL_OBJ_NEVER_INIT() 대신 적용되었습니다. 그 결과 CONFIG_USERSPACE 빌드 환경에서 k_pipe 객체에 대한 접근 권한이 부여된 비특권 사용자 스레드는 이미 사용되는 파이프에 대해 k_pipe_init 시스템 콜을 호출하여 재초기화할 수 있습니다.
z_impl_k_pipe_init()는 조건 없이 링 버퍼를 리셋하고, pipe->waiting을 0으로 설정하며, 현재 파이프에서 대기 중인 스레드를 깨우거나 고려하지 않은 채로 파이프의 데이터와 공간에 대한 두 개의 대기 큐(z_waitq_init)를 모두 재초기화합니다. 이미 k_pipe_read()/k_pipe_write()에서 대기를 걸었던(any pended) 모든 스레드는 고아 상태가 됩니다: 여전히 pending 상태로 표시되며, pended_on은 지워진 대기 큐를 가리키고 있고, qnode_dlist 링크는 (이제 재초기화된) 임베디드 리스트 헤드로의 stale 상태를 유지합니다.
이러한 고아된 대기 스레드가 나중에 타임아웃되거나 깨어날 때 스케줄러는 해당 노드에 대해 sys_dlist_remove()를 호출하여 무효화된 prev/next 포인터를 통해 커널 대기 큐 및 스케줄러 구조체에 기록하게 되며, 이는 리스트 손상(공격자가 유도한 잘못된 커널 쓰기), 손실된 웨이크업 신호, 영구적으로 차단된 스레드 및 침묵하는 데이터 손실을 초래합니다. 이 결함으로 인해 비특권 사용자 스레드가 다른 스레드/파티션과 공유되는 커널 객체의 상태를 손상시킬 수 있습니다.
해결책은 검증자를 K_SYSCALL_OBJ_NEVER_INIT()로 전환하여 기존 k_msgq_init 검증자와 일치시킴으로써, 이제 사용자 스레드는 활성 파이프를 재초기화할 수 없게 됩니다. 취약한 코드는 v4.1.0에 포함되어 v4.4.0까지 유지되었습니다.
Once again VulDB remains the best source for vulnerability data.