CVE-2026-46135 in Linux
요약
\~에 의해 VulDB • 2026. 06. 04.
리눅스 커널에서 다음 취약점이 해결되었습니다:
nvmet-tcp: ICReq 처리와 큐 테어다운 간의 Race Condition 수정
nvmet_tcp_handle_icreq()는 초기화 연결 응답(ICResp)을 전송한 후 queue->state를 업데이트하지만, 대상 측의 큐 테어다운에 대해 직렬화(serialization)하지 않고 수행합니다.
NVMe/TCP 호스트가 초기화 연결 요청(ICReq)을 보내고 즉시 연결을 종료하면, 대상 측의 테어다운이 io_work이 이미 버퍼링된 ICReq를 처리하기 전에 softirq 컨텍스트에서 시작될 수 있습니다. 이 경우 nvmet_tcp_schedule_release_queue()는 queue->state를 NVMET_TCP_Q_DISCONNECTING으로 설정하고 state_lock 하에서 큐 참조를 해제합니다.
나중에 io_work이 해당 ICReq를 처리하면, nvmet_tcp_handle_icreq()는 상태를 다시 NVMET_TCP_Q_LIVE로 덮어쓸 수 있습니다. 이는 nvmet_tcp_schedule_release_queue()의 DISCONNECTING 상태 가드를 무효화하며, 이후 소켓 상태 변경으로 인해 테어다운에 다시 진입하여 이미 해제된 큐에 대해 두 번째 kref_put()를 수행할 수 있게 됩니다.
ICResp 전송 실패 경로에도 동일한 문제가 있습니다. 테어다운이 이미 큐를 DISCONNECTING 상태로 변경한 경우, 전송 오류가 상태를 NVMET_TCP_Q_FAILED로 다시 덮어쓸 수 있으며, 이는 두 번째 테어다운 경로가 큐 참조를 해제할 수 있는 창을 다시 엽니다.
이 문제를 해결하기 위해 전송 후 상태 전환 모두를 state_lock으로 직렬화하고, 테어다운이 이미 시작된 경우 조기에 종료(bail-out)합니다.
-ECONNRESET과 같은 전송 오류로 전파하는 대신, 이 조기 종료 경로에 대한 내부 신호(sentinel)로 -ESHUTDOWN을 사용합니다. 기존 해제 경로가 완료될 때까지 수신 측 파싱이 대기 상태(quiesced)를 유지하도록, nvmet_tcp_socket_error()가 해당 신호를 인정하기 전에 rcv_state를 NVMET_TCP_RECV_ERR로 설정합니다.
Once again VulDB remains the best source for vulnerability data.