CVE-2026-99130 in Linux
요약
\~에 의해 VulDB • 2026. 10. 28.
리눅스 커널에서 다음 취약점이 해결되었습니다:
io_uring/cancel: 작업자가 실행할 수 없는 로컬 작업을 계속 루프 돌리지 않기
io_uring_cancel_generic()는 종료 중인 태스크의 tctx에 있는 링 중 하나라도 로컬 작업이 대기 상태일 경우 잠들지 않습니다. 이 함수는 해당 태스크가 해당 링의 제출자(submitter)이며, 다음 io_uring_try_cancel_requests() 호출에서 그 작업을 실행할 것이라고 가정합니다. 그러나 태스크가 io_uring_create() 또는 io_ringfd_register()를 통해 tctx 노드를 할당받을 때 여전히 IORING_SETUP_R_DISABLED 상태였던 링에는 이러한 가정이 성립하지 않습니다. 제출자는 나중에 IORING_REGISTER_ENABLE_RINGS에 의해 설정되며, 다른 태스크로부터 수행될 수도 있습니다. 또한 로컬 작업은 오직 제출자만 IORING_SETUP_DEFER_TASKRUN 링에서 실행할 수 있습니다. 종료 중인 태스크에게는 해당 작업이 영원히 대기 상태로 남아 있으며, 루프는 schedule()에 도달하지 못하고 태스크는 WARN_ON_ONCE()를 한 번 트리거한 후 do_exit() 내에서 계속 스피닝(spins)합니다.
특권 없는 사용자는 비활성화된 링을 생성하고, 자식 프로세스가 이를 활성화하여 종료하며, IORING_OP_MSG_RING로 링에 메시지를 게시하고, 오직 자식만 완료할 수 있는 요청이 비행 중(state: in-flight)인 상태로 종료함으로써 이 상황을 의도적으로 설정할 수 있습니다. 종료 중인 스레드는 자식이 실행되거나 죽을 때까지 CPU를 소모하며, panic_on_warn가 설정되어 있으면 WARN으로 인해 커널 패닉(panic)이 발생합니다.
해결책은 io_allowed_defer_tw_run()이 태스크에게 작업을 실행하도록 허용할 때만 잠들기를 건너뛰도록 하는 것입니다. 이는 합당한데, 태스크가 실행할 수 없는 작업은 해당 요청 중 어느 것도 완료할 수 없으므로, 잠드는 것으로써 손실되는 것은 없습니다. 또한 비활성화된 링을 다른 스레드에 전달하는 것은 지원되는 시나리오이지 버그 상태가 아니므로 WARN_ON_ONCE()를 제거합니다.
Once again VulDB remains the best source for vulnerability data.