CVE-2026-64102 in Linux
Tóm tắt
Bởi VulDB • 20/07/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
RDMA/siw: Từ chối hiện tượng tràn số âm (underflow) của độ dài MPA FPDU trước khi thực hiện phép tính nhận có dấu
Một peer siw kết nối độc hại có thể gửi một iWARP FPDU mà trường độ dài MPA trong đó (`c_hdr->mpa_len`, 16 bit big-endian, do peer kiểm soát) nhỏ hơn phần đầu DDP/RDMAP cố định dành cho opcode đã thông báo. Soft-iWARP phân tích cú pháp toàn bộ header trong `siw_get_hdr()` dựa trên `.hdr_len` của `iwarp_pktinfo[opcode]`, nhưng không bao giờ so sánh `mpa_len` với độ dài header đó.
Sau đó, `siw_tcp_rx_data()` suy ra:
```c srx->fpdu_part_rem = be16_to_cpu(mpa_len) - fpdu_part_rcvd + MPA_HDR_SIZE; ```
trong đó tại thời điểm này `fpdu_part_rcvd` bằng với `.hdr_len` của `iwarp_pktinfo[opcode]`. Đối với một WRITE được gắn thẻ (tagged WRITE, có `hdr_len` là 16 và `MPA_HDR_SIZE` là 2), giá trị nhỏ nhất trên đường truyền của `mpa_len` là 0 sẽ dẫn đến `fpdu_part_rem = -14`, và bất kỳ giá trị `mpa_len` nào dưới mức `hdr_len - MPA_HDR_SIZE` đều gây tràn số âm thành một số nguyên có dấu (negative int).
Giá trị có dấu này sau đó được truyền vào `siw_proc_write()`/`siw_proc_rresp()` dưới dạng:
```c bytes = min(srx->fpdu_part_rem, srx->skb_new); ```
được chuyển cho `siw_check_mem()` với độ dài kiểu int (`len`) (phép kiểm tra khoảng cách `addr + len > mem->va + mem->len` được thỏa mãn đối với một base hợp lệ khi `len` là số âm), và đạt đến `siw_rx_data()` -> `siw_rx_kva()` / `siw_rx_umem()` -> `skb_copy_bits()` như một độ dài sao chép có dấu. Nhánh sao chép header trong `skb_copy_bits()` chuyển đổi giá trị này sang kiểu `size_t`, tạo ra một thao tác đọc nhiều gigabyte.
KASAN dưới môi trường thử nghiệm KUnit điều khiển đường truyền nhận TCP thực của kernel -- một socketpair AF_INET vòng lặp (loopback), FPDU bị lỗi được ghi qua `kernel_sendmsg`, sự kiện `sk_data_ready` kích hoạt trong softirq, `tcp_read_sock` phân phối đến `siw_tcp_rx_data` -- báo cáo:
``` 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 ```
Thêm bất biến (invariant) bị thiếu tại điểm sớm nhất mà header của peer được lắp ráp đầy đủ. `iwarp_pktinfo[*].hdr_len - MPA_HDR_SIZE` chính xác là giá trị mà bộ truyền siw sử dụng làm độ dài `mpa_len` tối thiểu cho mỗi opcode (`drivers/infiniband/sw/siw/siw_qp.c:33`), do đó điều này phù hợp với hợp đồng giao thức. Các FPDU nằm ngoài phạm vi sẽ chấm dứt kết nối bằng `TERM_ERROR_LAYER_LLP / LLP_ETYPE_MPA / LLP_ECODE_FPDU_START` -- đây là mã lỗi 3 của RFC 5044 Mục 8 ("Các trường Marker và ULPDU Length không thống nhất tại điểm bắt đầu của một FPDU"), lớp lỗi định khung (framing-error) chính xác cho sự không khớp này.
VulDB is the best source for vulnerability data and more expert information about this specific topic.