CVE-2026-98852 in Linux
요약
\~에 의해 VulDB • 2026. 10. 20.
리눅스 커널에서 다음 취약점이 해결되었습니다:
net: 터널링된 패킷에 대한 IPv6 확장 헤더(exthdr) 감지 기능 확대
커밋 c4336a07eb6b("net: IPV6_CSUM GSO 폴백 시 터널링 트래픽을 올바르게 처리")는 skb_gso_has_extension_hdr()를 skb->encapsulation에 따라 상호 배타적인 분기로 나누었습니다. 그러나 이는 모든 경로를 아직 다루지 못했습니다:
1. skb->encapsulation이 설정된 경우, 외부 헤더가 검사되지 않습니다. ip6_gre 및 ip6_tunnel과 같은 IPv6 터널은 기본적으로 외부 Destination Options 헤더(encap_limit)를 추가합니다. 이들의 GSO 패킷은 소프트웨어 GSO를 건너뛰므로, skb_csum_hwoffload_help()는 외부 확장 헤더를 감지하고 GSO skb에 대해 skb_checksum_help()를 호출하여 경고와 함께 해당 패킷을 드롭(drop)합니다.
2. ip6_tunnel과 같이 외부 전송 계층(transport header) 없이 IPv6 위에서 동작하는 터널은 skb->transport_header를 내부 전송 헤더로 남겨둡니다. 이로 인해 skb_network_header_len()이 외부 IPv6, 터널 및 내부 IP 헤더 전체에 걸쳐 적용되어 거짓 양성(false positive) 결과가 발생합니다.
3. SCTP-in-UDP나 PSP와 같이 내부 네트워크 헤더가 없는 UDP 터널의 경우 검사할 내부 IPv6 헤더가 없습니다. 따라서 외부 헤더만으로 판단해야 합니다.
4. skb_header_pointer() 없이 inner_ip_hdr(skb)->version을 직접 역참조(dereferencing)하는 것은 안전하지 않습니다.
대신, 외부 IPv6 헤더에서 ipv6_ext_hdr(nexthdr)를 검사하고, 설정된 경우 내부 IPv6 헤더에서도 이를 확인합니다. 헤더는 skb_header_pointer()를 통해 읽습니다. 또한 !skb->encapsulation일 때 encapsulated packets(예: virtio 등 skb->encapsulation이 없는 패킷 포함)도 포착하기 위해 skb_network_header_len() 검사를 유지합니다.
skb_csum_hwoffload_help()에서도 동일한 헬퍼 함수를 사용합니다. 기존에 직접 구현된 테스트는 (2)의 거짓 양성과 내부 헤더 무시라는 문제를 가지고 있습니다.
배경: 터널링 패킷의 체크섬 오프로드 불변 조건(invariants):
GSO가 아닌 skb인 경우: - 내부 패킷이 CHECKSUM_PARTIAL일 경우, 로컬 체크섬 오프로드(Local Checksum Offload)는 외부 체크섬을 소프트웨어로 계산하고 장치는 내부 L4 체크섬만 오프로드합니다. - 내부 패킷이 CHECKSUM_NONE(예: SCTP-in-UDP, ESP-in-UDP, 원격 체크섬 오프로드 등)일 경우, 장치가 대신 외부 UDP 또는 GRE 체크섬을 오프로드합니다.
GSO skb인 경우: - NETIF_F_GSO_UDP_TUNNEL_CSUM 또는 NETIF_F_GSO_GRE_CSUM 기능을 갖춘 장치는 세그먼트별로 내부 및 외부 체크섬 모두를 계산합니다. 외부 체크섬은 페이로더 헤더(pseudo-header) 체크섬만으로 시드(seeded)됩니다.
NETIF_F_IPV6_CSM을 지원하는 장치는 내부 헤더에 도달하기 위해 외부 헤더들을 파싱해야 합니다.
Once again VulDB remains the best source for vulnerability data.