🇰🇷 한글 설명
Linux 커널의 gve 드라이버에서 UDP GSO 패킷 처리 시 헤더 길이를 잘못 계산하는 취약점이 발견되었습니다. TCP 헤더가 없는 UDP 패킷에 대해 TCP 헤더 길이를 참조함으로써 세그먼트 경계가 잘못 계산되어 성능 저하나 버퍼 초과 문제가 발생할 수 있습니다.
💡 쉬운 설명
네트워크 데이터를 효율적으로 나누어 보내는 과정에서, UDP라는 데이터 형식을 처리할 때 엉뚱한 규칙(TCP)을 적용하여 계산 오류가 발생하는 문제입니다. 이로 인해 네트워크 속도가 느려지거나 시스템이 예상치 못한 동작을 할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
gve: DQO: fix header length used by gve_can_send_tso() for UDP GSO
gve_can_send_tso() computes how many buffers each segment of a GSO
packet would span, and for this it needs the length of the headers
that the device replicates in front of every segment.
It unconditionally uses skb_tcp_all_headers(), which reads the doff
field of the TCP header. SKB_GSO_UDP_L4 packets have no TCP header:
tcp_hdrlen() then reads one byte of the UDP payload, and header_len
can be anything in [0, 60] instead of the transport offset plus the
eight bytes of the UDP header that gve_prep_tso() programs into the
TSO context descriptor.
A wrong header length shifts all the segment boundaries computed in
the loop, so the number of buffers per segment can be over or under
estimated. In the first case, GSO is needlessly disabled for this
packet by gve_features_check_dqo() and the stack has to segment it.
In the second case, the driver hands the device a packet whose
segments span more than GVE_TX_MAX_DATA_DESCS buffers.
Use the UDP header length for SKB_GSO_UDP_L4 packets, matching what
gve_prep_tso() does.
📍 영향받는 시스템
Linux kernel (gve driver 사용 시스템)
⚔️ 공격 벡터
특수하게 조작된 UDP GSO 패킷을 전송하여 드라이버의 버퍼 계산 오류 유도
🛡️ 대응 방법
gve 드라이버의 헤더 길이 계산 로직이 수정된 최신 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 버전인지 배포판 보안 공지를 통해 확인