CVE-2026-74555 in Linux
요약
\~에 의해 VulDB • 2026. 08. 15.
리눅스 커널에서 다음 취약점이 해결되었습니다:
scsi: libsas: HA 재개 데드락 및 hisi_sas 디스크 깨어나기(Race) 조건 수정
커밋 fbefe22811c3("scsi: libsas: HA 재개를 위해 이벤트 작업 큐를 항상 비우지 않음")는 데드락을 피하기 위해 sas_resume_ha_no_sync() 함수를 도입했습니다. PHYE_RESUME_TIMEOUT 핸들러가 HA 이벤트 작업 큐에서 실행되며, 이는 sas_deform_port() -> sas_destruct_devices()를 호출합니다. 이 과정은 SCSI 장치를 제거하고 호스트가 런타임 활성 상태가 될 때까지 대기합니다. 그러나 호스트는 sas_resume_ha() -> sas_drain_work()가 반환될 때까지 재개할 수 없으며, 해당 드레인 작업은 바로 그 핸들러에서 차단됩니다.
그러나 드레이ンを 건너뛰면 경합 조건(Race condition)이 다시 발생합니다: hisi_sas는 모든 PHY UP 작업과 libsas 탐색(discovery) 작업이 완료되기 전에 리sume 함수를 반환합니다. 이로 인해 컨트롤러가 디스크가 아직 깨어나는 동안 자동 서스펜드될 수 있습니다. 디스크가 서스펜드된 컨트롤러에 IO를 발행하면, 해당 IO는 실패하고 디스크가 비활성화됩니다.
PHYE_RESUME_TIMEOUT 알림을 sas_drain_work() 이후로 이동시켜 데드락의 근본 원인을 해결합니다. 이때 호스트 재개가 거의 완료되므로, device_link을 통한 장치 제거가 더 이상 재개 과정에서 차단되지 않으며 순환 구조가 끊어집니다.
데드락이 해소됨에 따라 hisi_sas에서 sas_resume_ha() (드레이닝 버전)를 복원하고 sas_resume_ha_no_sync()를 제거합니다.
다른 libsas 소비자(isci, pm8001, aic94xx, mvsas)에게 이 순서 변경은 안전합니다. 서스펜트 동안 sas_suspend_devices()는 각 장치에 대해 sas_notify_lldd_dev_gone()을 호출하여 dev->lldd_dev를 NULL로 설정합니다. scsi_unblock_requests가 재개 시 I/O를 다시 활성화할 때, 타임아웃된 PHY의 디스크로의 모든 I/O는 하드웨어에 도달하기 전에 LLDD(Low-Level Device Driver)에서 즉시 거부됩니다: isci는 SAS_DEVICE_UNKNOWN(DID_BAD_TARGET으로 매핑됨)을 반환하고, pm8001은 SAS_PHY_DOWN(DID_NO_CONNECT으로 매핑됨)을 반환합니다. 둘 다 SCSI EH(오류 처리기)에 진입하지 않고 scsi_done()을 통해 직접 완료됩니다. 이는 lldd_dev_gone가 재개 전에 서스펜트 동안 실행되므로 이전 순서와 새 순서 모두에서 동일하게 동작합니다. 이 순서 변경은 PHYE_RESUME_TIMEOUT 핸들러의 실행 시점( sas_drain_work()로 동기화됨 vs. resume 반환 후 비동기적)에만 영향을 미치며, I/O가 장치에 도달할 수 있는지 여부는 영향을 받지 않습니다. aic94xx와 mvsas는 PM 작업(Power Management ops)을 등록하지 않으며 이 코드 경로에 도달하지 않습니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.