CVE-2026-89968 in Linux
요약
\~에 의해 VulDB • 2026. 09. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
nvmet-tcp: 미요청 H2CData PDU 거부
nvmet_tcp_handle_h2c_data_pdu()는 TTAG가 유효한 범위 내의 명령 인덱스인지와 해당 명령의 데이터 버퍼가 매핑되어 있는지 여부만 확인한 후 H2CData PDU를 수락합니다. 타겟이 해당 명령에 대해 R2T(Ready To Transfer)를 전송하여 실제로 데이터를 요청했는지 여부는 전혀 검증하지 않습니다.
원격 호스트는 이를 악용할 수 있습니다. 공격자는 R2T 경로를 사용하는 쓰기 명령을 제출하고, 타겟이 R2T를 전송하기 전에 해당 명령의 태그에 대한 H2CData PDU를 보냅니다. 이 데이터가 명령을 조기에 완료시키고, 이후 명령이 동기적으로 실패(예: nvmet_check_transfer_len()에서 감지된 길이 불일치)하면 두 번째로 완료됩니다. 각 완료 시 nvmet_tcp_queue_response()가 호출되므로, 동일한 명령이 여전히 연결되어 있는 상태에서 queue->resp_list에 두 번 추가됩니다. 두 번째 llist_add()는 노드가 자신을 가리키게 만듭니다(lentry->next == lentry).
그 후 nvmet_tcp_process_resp_list()는 이러한 자기 참조 노드를 순회하며 해당 명령을 resp_send_list에 두 번 추가합니다. CONFIG_DEBUG_LIST가 활성화된 경우 이는 "list_add double add" 검사를 트리거하여 커널 BUG를 발생시킵니다. 비활성화된 경우 루프가 종료되지 않으며 nvmet_tcp 작업 큐가 멈춥니다(소프트 락업). 이 취약점은 원격에서 유발할 수 있으며, allow_any_host 서브시스템의 경우 인증이 필요하지 않습니다.
명령에 대해 R2T가 전송되었는지 여부를 추적하고, 그 전에 도착하는 H2CData PDU를 거부합니다. 해당 플래그는 명령 재사용 시(nvmet_tcp_get_cmd()에서 cmd->flags를 0으로 설정) 초기화되며, 단일 요청된 트랜스퍼의 여러 H2CData PDU 동안에는 설정 상태가 유지됩니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.