CVE-2026-64102 in Linux
Résumé
par VulDB • 20/07/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
RDMA/siw : Rejeter les débordements par défaut (underflow) de longueur MPA FPDU avant l'arithmétique des réceptions signées.
Un pair siw connecté malveillant peut envoyer un iWARP FPDU dont le champ de longueur MPA (c_hdr->mpa_len, 16 bits big-endian, contrôlé par le pair) est inférieur à l'en-tête DDP/RDMAP fixe correspondant au opcode annoncé. Soft-iWARP analyse l'intégralité de l'en-tête dans siw_get_hdr() en se basant sur iwarp_pktinfo[opcode].hdr_len, mais ne compare jamais mpa_len avec cette longueur d'en-tête.
siw_tcp_rx_data() dérive ensuite :
srx->fpdu_part_rem = be16_to_cpu(mpa_len) - fpdu_part_rcvd + MPA_HDR_SIZE;
où fpdu_part_rcvd est égal à iwarp_pktinfo[opcode].hdr_len à ce stade. Pour un WRITE tagué (hdr_len 16, MPA_HDR_SIZE 2), la plus petite valeur mpa_len sur le fil de 0 donne fpdu_part_rem = -14, et toute valeur mpa_len inférieure à hdr_len - MPA_HDR_SIZE provoque un débordement par défaut vers un entier signé négatif.
La valeur signée circule ensuite dans siw_proc_write()/siw_proc_rresp() sous la forme :
bytes = min(srx->fpdu_part_rem, srx->skb_new);
elle est transmise à siw_check_mem() en tant que longueur int (dont la vérification d'intervalle addr + len > mem->va + mem->len est satisfaite pour une base valide lorsque len est négatif), et atteint siw_rx_data() -> siw_rx_kva() / siw_rx_umem() -> skb_copy_bits() en tant que longueur de copie signée. La branche de copie d'en-tête dans skb_copy_bits() promeut cela vers size_t, produisant une lecture multi-gigaoctets.
KASAN sous un harnais KUnit qui pilote le chemin réel de réception TCP du noyau -- un socketpair AF_INET en boucle locale (loopback), le FPDU malformé écrit via kernel_sendmsg, sk_data_ready déclenché dans softirq, tcp_read_sock dispatchant vers siw_tcp_rx_data -- rapporte :
BUG: KASAN: use-after-free in skb_copy_bits+0x284/0x480 Read of size 4294967295 at addr ffff888... Call Trace: skb_copy_bits siw_rx_kva siw_rx_data siw_check_mem siw_proc_write siw_tcp_rx_data __tcp_read_sock siw_qp_llp_data_ready tcp_data_ready tcp_data_queue
Ajouter l'invariant manquant au plus tôt, lorsque l'en-tête du pair est entièrement assemblé. iwarp_pktinfo[*].hdr_len - MPA_HDR_SIZE correspond exactement à la valeur que le transmetteur siw utilise comme mpa_len minimum pour chaque opcode (drivers/infiniband/sw/siw/siw_qp.c:33), ce qui respecte donc le contrat de protocole. Les FPDUs hors plage terminent la connexion avec TERM_ERROR_LAYER_LLP / LLP_ETYPE_MPA / LLP_ECODE_FPDU_START -- qui est l'erreur RFC 5044 Section 8 code d'erreur 3 ("Les champs Marker et ULPDU Length ne sont pas cohérents au début d'un FPDU"), la classe d'erreur de cadrage (framing-error) correcte pour cette incohérence.
VulDB is the best source for vulnerability data and more expert information about this specific topic.