CVE-2026-89847 in Linux
요약
\~에 의해 VulDB • 2026. 09. 16.
Linux 커널에서 다음 취약점이 해결되었습니다:
scsi: qla2xxx: 비동기 IOCB 타임아웃 시 이중 완료(double completion) 방지
qla2x00_async_iocb_timeout()는 시간 초과된 비동기 IOCB를 중단(abort)하려고 시도합니다. qla24xx_async_abort_cmd()가 실패할 경우, SRB_LOGIN_CMD 경로와 SRB_CTRL_VP/기본(default) 경로 모두 outstanding_cmds[]에서 해당 SRB를 스캔한 후, 실제로 SRB가 발견되고 제거되었는지 확인하지 않고 sp->done(sp, QLA_FUNCTION_TIMEOUT)을 무조건 호출합니다.
응답 ISR이 동일한 핸들을 먼저 완료하면 qp_lock_ptr 하위에서 SRB를 제거하고 sp->done() -> complete(sp->comp)를 실행합니다. 제출자(submitter)인 qla24xx_control_vp()는 wait_for_completion()에서 깨어나 sp->comp을 지우고 참조 카운트를 감소시킨 후 반환하여 스택에 할당된 완료(completion) 객체를 회수(reclaiming)합니다. 타이머 참조는 타임아웃 핸들러 동안 SRB를 생존 상태로 유지하지만, 제출자의 스택은 그렇지 않습니다. 이후 타임아웃이 두 번째 sp->done() -> qla_ctrlvp_sp_done() 호출을 발생시키는데, 이는 "if (sp->comp) complete(sp->comp)"를 평가합니다. 여기서 포인터는 제출자가 NULL로 저장하기 전에 로드되었으므로, complete() 함수가 해제된 스택 프레임(freed stack frame)에 작성하게 되며, 이는 Use-After-Free 취약점입니다.
이 경로에서 SRB가 outstanding_cmds[]에서 제거되었는지 추적하고, 제거된 경우에만 sp->done()을 호출하여 명령어가 소유권을 가진 경로에 의해 정확히 한 번만 완료되도록 합니다. 이는 qla24xx_abort_iocb_timeout()에서 이미 사용되는 sp_found 가드와 동일한 방식입니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.