CVE-2026-99191 in Linux
요약
\~에 의해 VulDB • 2026. 10. 28.
리눅스 커널에서 다음 취약점이 해결되었습니다:
calipso: calipso_skbuff_setattr()에서 BIG TCP payload_len 유지
calipso_skbuff_setattr()는 삽입하거나 크기를 조정하는 옵션의 길이에 따라 payload_len을 조정합니다.
payload = ntohs(ip6_hdr->payload_len); ip6_hdr->payload_len = htons(payload + len_delta);
GRO(Generic Receive Offload)는 IPV6_MAXPLEN보다 큰 BIG TCP 패킷을 생성할 수 있으며, 이러한 패킷에 대해 payload_len == 0으로 저장합니다. 그런 다음 ipv6_payload_len()은 skb->len로 폴백(fallback)됩니다. CALIPSO로 매핑된 목적지로 전달되는 그러한 패킷의 경우, 위의 코드는 len_delta(또는 축소 시에는 65536 + len_delta)를 payload_len에 기록하며, ipv6_payload_len()은 더 이상 skb->len로 폴백되지 않습니다. nf_tables, conntrack 및 sch_cake는 이 동작에 의존합니다.
동일한 산술 연산은 패킷이 IPV6_MAXPLEN을 초과하여 커질 때 오버플로우(wrap)되며, IPV6_MAXPLEN 미만으로 축소되는 BIG TCP 패킷은 실제 길이를 다시 가져야 합니다.
ipv6_gro_complete()가 수행하는 방식과 같이 ipv6_set_payload_len()을 사용하여 skb 길이에서 payload_len을 설정합니다. 이는 IPV6_MAXPLEN 초과 시 0을 저장하고 그 외의 경우 실제 길이를 저장합니다. 네트워크 헤더는 방금 skb->data로 재설정되었으므로, skb->len - sizeof(*ip6_hdr)가 페이로드 길이입니다.
SELinux permissive 모드에서 최소한의 mdp 생성 정책(network_peer_controls=1), "netlabelctl calipso add pass doi:16" 및 fd00:2::/64를 CALIPSO DOI 16으로 매핑하는 NetLabel 매핑을 사용하여 하나의 커널(arm64, QEMU)에서 테스트되었습니다. calipso_skbuff_setattr()는 레벨만 포함하는 라벨을 추가하는 테스트 전용 debugfs 훅(netlbl_skbuff_setattr() 통해 호출됨 - 이 패치에는 포함되지 않음)을 통해 호출되었으며, 호출 후 payload_len은 다음과 같습니다:
case before fix after fix real length 1000, unlabeled 1016 1016 1016 70000 GSO, payload_len 0 16 0 70016 65530 GSO, grows past MAXPLEN 10 0 65546 65540 GSO with a 24 byte hop header, shrinks below MAXPLEN 65528 65532 65532 1000 with a 24 byte hop header 992 992 992
(0은 ipv6_payload_len()이 실제 길이를 반환함을 의미합니다.) 순방향 경로에서, 라우터를 통해 레이블 없는 UDP를 서버로 주입하는 클라이언트의 경우, 라우터는 CALIPSO 옵션을 추가하며 이 패치가 적용된 상태에서 서버는 모든 데이터그램(Udp6InDatagrams 5, Ip6InTruncatedPkts 0)을 전달합니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.