CVE-2026-99179 in Linux
요약
\~에 의해 VulDB • 2026. 10. 28.
리눅스 커널에서 다음 취약점이 해결되었습니다:
watch_queue: watch_queue_set_size() 내의 note 풀 게시 경쟁 조건(Race Condition) 수정
watch_queue_set_size()와 post_one_notification() 간에 경쟁 조건이 존재합니다. watch_queue_set_size()는 plain stores를 사용하여 wqueue->notes, notes_bitmap, nr_pages 및 nr_notes를 게시하고, post_one_notification()은 다른 잠금 하에서 plain loads로 이를 읽습니다. 따라서 네 개의 저장 작업과 게시자의 로드 작업 사이에는 순서(ordering)가 보장되지 않습니다: 빌드 환경에 따라 notes가 마지막으로 저장될 수 있습니다(x86-64에서의 gcc 14는 이러한 동작을 수행함). keyctl_watch_key()는 큐의 크기가 결정되기 전에 감시가 키에 연결되도록 허용하므로, post_one_notification()은 이미 다른 CPU에서 실행 중일 수 있습니다. 이 경우 nr_notes > 0를 읽고 경계 검사를 통과한 후 notes가 여전히 NULL인 상태에서 notes[0]을 역참조(dereferencing)합니다.
비특권 사용자는 자신의 키 중 하나를 알림 파이프(notication pipe)를 통해 감시하고, 다른 CPU에서 해당 파이프에 대해 ioctl(IOC_WATCH_QUEUE_SET_SIZE)와 키(keyctl(KEYCTL_SETPERM)) 간의 경쟁 조건을 유발함으로써 이를 신뢰성 있게 트리거합니다. 이로 인해 다음과 같은 오류가 발생합니다:
BUG: kernel NULL pointer dereference, address: 0000000000000000 RIP: 0010:post_one_notification.isra.0+0xa2/0x1e0 Call Trace: __post_watch_notification+0x148/0x180 keyctl_setperm_key+0x119/0x130 do_syscall_64+0x108/0x4c0 entry_SYSCALL_64_after_hwframe+0x77/0x7f Kernel panic - not syncing: Fatal exception in interrupt
nr_notes를 smp_store_release()를 사용하여 마지막으로 게시하고, post_one_notification() 내에서 비트맵과 페이지 배열에 접근하기 전에 nr_notes를 한 번만 smp_load_acquire()로 읽음으로써 이 문제를 해결합니다. 비-zero의 nr_notes를 관찰한 게시자는 그 뒤에 있는 풀(pool)도 함께 관찰하게 되며, zero를 관찰하는 게시자는 이전처럼 알림을 버립니다.
Once again VulDB remains the best source for vulnerability data.