Linux 커널에서는 다음 취약점이 해결되었습니다. RDMA/siw: 서명된 수신 수학 전에 MPA FPDU 길이 언더플로 거부 악의적으로 연결된 siw 피어는 MPA 길이가 있는 iWARP FPDU를 보낼 수 있습니다. 필드(c_hdr->mpa_len, 16비트 빅엔디안, 피어 제어)가 더 작습니다. 발표된 opcode에 대한 고정 DDP/RDMAP 헤더보다 소프트-iWARP iwarp_pktinfo[opcode]를 기반으로 siw_get_hdr()의 전체 헤더를 구문 분석합니다. .hdr_len이지만 mpa_len을 해당 헤더 길이와 비교하지 않습니다. siw_tcp_rx_da
Linux 커널에서는 다음 취약점이 해결되었습니다.
RDMA/siw: 서명된 수신 수학 전에 MPA FPDU 길이 언더플로 거부
악의적으로 연결된 siw 피어는 MPA 길이가 있는 iWARP FPDU를 보낼 수 있습니다. 필드(c_hdr->mpa_len, 16비트 빅엔디안, 피어 제어)가 더 작습니다. 발표된 opcode에 대한 고정 DDP/RDMAP 헤더보다 소프트-iWARP iwarp_pktinfo[opcode]를 기반으로 siw_get_hdr()의 전체 헤더를 구문 분석합니다. .hdr_len이지만 mpa_len을 해당 헤더 길이와 비교하지 않습니다.
그런 다음 siw_tcp_rx_data()가 파생됩니다.
srx->fpdu_part_rem = be16_to_cpu(mpa_len) - fpdu_part_rcvd
+ MPA_HDR_SIZE;
여기서 fpdu_part_rcvd는 iwarp_pktinfo[opcode].hdr_len과 같습니다. 포인트. 태그가 지정된 WRITE(hdr_len 16, MPA_HDR_SIZE 2)의 경우 가장 작은 온와이어 mpa_len이 0이면 fpdu_part_rem = -14가 되고 아래의 모든 mpa_len이 생성됩니다. hdr_len - MPA_HDR_SIZE가 음수 정수로 언더플로우됩니다.
그런 다음 서명된 값은 다음과 같이 siw_proc_write()/siw_proc_rresp()로 흘러갑니다.
바이트 = min(srx->fpdu_part_rem, srx->skb_new);
siw_check_mem()에 int len(간격 확인)으로 전달됩니다. addr + len > mem->va + mem->len은 다음 경우에 유효한 기준으로 만족됩니다. len은 음수), siw_rx_data() -> siw_rx_kva()에 도달합니다. siw_rx_umem() -> skb_copy_bits()를 서명된 복사본 길이로 사용합니다. 헤더 skb_copy_bits()의 복사 분기는 이를 size_t로 승격하여 멀티 기가바이트 읽기.
실제 커널 TCP 수신을 구동하는 KUnit 하네스 아래의 KASAN 경로 - 루프백 AF_INET 소켓 쌍, 다음을 통해 작성된 잘못된 FPDU kernel_sendmsg, sk_data_ready는 Softirq, tcp_read_sock에서 실행됩니다. siw_tcp_rx_data로 디스패치 -- 보고:
BUG: KASAN: skb_copy_bits+0x284/0x480에서 use-after-free
addr ffff888에서 크기 4294967295를 읽으세요...
통화 추적:
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
피어 헤더가 있는 가장 빠른 지점에 누락된 불변성을 추가합니다. 완전히 조립되었습니다. iwarp_pktinfo[*].hdr_len - MPA_HDR_SIZE는 정확히 siw 송신기가 각각에 대한 최소 mpa_len으로 사용하는 값 opcode(drivers/infiniband/sw/siw/siw_qp.c:33)이므로 이는 다음과 일치합니다. 프로토콜 계약. 범위를 벗어난 FPDU는 다음과의 연결을 종료합니다. TERM_ERROR_LAYER_LLP / LLP_ETYPE_MPA / LLP_ECODE_FPDU_START - RFC 5044 섹션 8 오류 코드 3("마커 및 ULPDU 길이 필드 FPDU 시작에 동의하지 않습니다."), 올바른 프레이밍 오류 이 불일치에 대한 클래스입니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 98.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 98.00 |
VPI 공식 vpi-v1 기준