CVE-2026-93781 in Linux
요약
\~에 의해 VulDB • 2026. 09. 24.
리눅스 커널에서 다음 취약점이 해결되었습니다:
scsi: core: scsi_eh_lock_door()에서 태그 할당 시 블로킹하지 않음
scsi_restart_operations() 호출 시 호스트가 여전히 SHOST_RECOVERY 상태이므로, 즉 호스트가 SHOST_RUNNING으로 전환되고 scsi_run_host_queues()가 큐를 재시작하기 전에 scsi_eh_lock_door()가 호출됩니다. 이 함수는 플래그 없이 scsi_alloc_request()를 통해 요청을 할당하므로, 모든 태그가 이미 사용 중인 경우 blk_mq_get_tag()이 무료 스케줄링 태그(sched tag)를 기다리며 블로킹될 수 있습니다.
이러한 태그들은 에러 처리 중 scsi_eh_flush_done_q()에 의해 재큐된 명령어들이 보유하고 있을 수 있습니다. 이러한 명령어는 호스트가 SHOST_RECOVERY 상태를 벗어나고 scsi_run_host_queues()가 호출되어 큐를 재시작할 때까지 디스패치될 수 없습니다 - 이는 scsi_eh_lock_door()가 반환한 *후*에 발생합니다.
이는 순환 의존성을 형성합니다:
- SCSI 에러 핸들러 스레드에서 실행되는 scsi_eh_lock_door()는 재큐된 명령어가 보유하고 있는 sched tag를 기다립니다; - 재큐된 명령어는 에러 핸들러 스레드가 scsi_restart_operations()를 벗어나고 큐를 재시작할 때까지 완료되지 않으며 sched tag를 해제하지 못합니다.
단일 드라이버 태그(예: USB 저장 장치)가 있는 디바이스의 경우, 이는 제출될 수 없는 I/O와 함께 확실한 데드락(deadlock)을 유발합니다. 이 문제는 저희 환경에서도 재현되었습니다.
잠금(locking) 작업은 최선의 노력을 다하는(best-effort) 운영이며, scsi_eh_lock_door()는 요청 할당이 실패할 경우 이미 조용히 반환합니다. sched tag를 사용할 수 없는 경우 블로킹 대신 할당이 실행되도록 scsi_alloc_request()에 BLK_MQ_REQ_NOWAIT 플래그를 전달합니다. 이는 순환 의존성을 끊고 에러 핸들러가 큐 재시작을 완료하도록 하며, 이후 대기 중인 명령어들이 정상적으로 디스패치됩니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.