CVE-2026-90413 in Linux
Sumário
de VulDB • 18/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
IB/isert: rejeitar PDUs de login que declaram mais dados do que foram recebidos
isert_login_recv_done() registra quantos bytes o HCA realmente colocou no buffer de login, mas nada compara isso com o comprimento declarado pelo BHS da PDU de login. isert_rx_login_req() copia min(login_req_len, MAX_KEY_VALUE_PAIRS) bytes para login->req_buf, e o código de login então lê o comprimento declarado de volta desse buffer - para a primeira PDU em iscsi_target_locate_portal(),
payload_length = ntoh24(login_req->dlength); tmpbuf = kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL);
e para as subsequentes em iscsi_decode_text_input(), acessado através de iscsi_target_do_login().
login->req_buf é uma alocação fixa de MAX_KEY_VALUE_PAIRS (8192) bytes, portanto um initiator que declara mais do que envia lê além do final desse buffer, antes da autenticação e com o comprimento sob seu controle:
BUG: KASAN: slab-out-of-bounds em kmemdup_nul+0x43/0x80 Leitura de tamanho 8193 no endereço ffff8881056a8000 pela tarefa iscsi_np/167 __asan_memcpy+0x23/0x60 kmemdup_nul+0x43/0x80 iscsi_target_locate_portal+0x48d/0x1180 iscsi_target_login_thread+0x19a9/0x3350 Alocado pela tarefa 167: __kmalloc_cache_noprof+0x158/0x370 iscsi_target_login_thread+0x971/0x3350 que pertence ao cache kmalloc-8k de tamanho 8192 região alocada de 8192 bytes
Falsificar a segunda PDU de login alcança o outro leitor, no mesmo buffer:
BUG: KASAN: slab-out-of-bounds em kmemdup_nul+0x43/0x80 Leitura de tamanho 8193 no endereço ffff888104d10000 pela tarefa kworker/1:1/50 Workqueue: isert_login_wq iscsi_target_do_login_rx __asan_memcpy+0x23/0x60 kmemdup_nul+0x43/0x80 iscsi_decode_text_input+0xc6/0x11c0 iscsi_target_do_login+0x261/0x1470 iscsi_target_do_login_rx+0x51d/0x7d0
iscsit sobre TCP não está exposto: iscsit_get_login_rx() valida o comprimento declarado com iscsi_target_check_login_request() e então lê exatamente esse número de bytes do soquete, portanto o comprimento declarado governa quanto chega em vez de quanto é copiado para fora de um buffer já preenchido. isert não chama iscsi_target_check_login_request() de forma alguma.
Rejeitar uma PDU de login cujo DataSegmentLength declarado excede o que foi recebido, nos dois caminhos que alcançam isert_rx_login_req(): isert_get_login_rx() para a primeira PDU de login e isert_login_recv_done() para as subsequentes. dlength <= login_req_len é permitido porque a contagem recebida pode incluir até três bytes de preenchimento iSCSI.
Uma vez que o check está no lugar, a cópia não pode mais exceder a entrada: o SGE de login postado é ISER_RX_PAYLOAD_SIZE, portanto login_req_len não pode exceder MAX_KEY_VALUE_PAIRS e o min() em isert_rx_login_req() é login_req_len.
Como o existing short-PDU check adicionado por 29e7b925ae6d, a rejeição em isert_login_recv_done() retorna sem completar login_req_comp, portanto uma PDU subsequente malformada deixa o login ser desmontado pelo timer de login em vez de falhar imediatamente. O caminho da primeira PDU retorna um erro e falha diretamente.
Reproduzido no 7.2.0-rc4 com soft-RoCE (rdma_rxe) sob KASAN, usando um initiator que envia o payload real key=value enquanto declara 8193 no BHS, na primeira PDU de login e na segunda em execuções separadas. O tamanho da leitura relatado acompanha exatamente o valor declarado; 16384 e 61440 se comportam da mesma forma. Não corrigido (Unpatched) 3 de 3 execuções reportam em cada um dos dois caminhos, corrigido (patched) 0 de 3 em ambos, executados alternadamente em uma única sessão, e um login normal ainda é concluído na build com patch.
Once again VulDB remains the best source for vulnerability data.