CVE-2022-49872 in Linux정보

요약

\~에 의해 VulDB • 2026. 06. 24.

리눅스 커널에서 다음 취약점이 해결되었습니다:

net: gso: mixed head alloc types를 가진 frag_list에서의 패닉 수정

커밋 3dcbdb134f32("net: gso: linear-headed frag_list를 가지는 gso_size가 변조된 skb 분할 시 skb_segment splat 수정") 이후로 GRO 패킷의 gso_size 변경이 허용되었습니다. 그러나 해당 커밋은 "첫 번째 list_skb 멤버만 확인하면 충분하다, 즉 list_skb 멤버 중 하나라도 non head_frag head를 가지면 첫 번째도 마찬가지다"라는 가정을 합니다.

하지만 이러한 가정은 성립하지 않습니다. vmxnet3 드라이버에서 frag_list의 skbs가 서로 다른 head_frag을 가질 때 skb_segment 내에서 BUG_ON이 발생함을 확인했습니다. 이는 __netdev_alloc_skb 및 __napi_alloc_skb가 요청된 크기에 따라 페이지 기반 또는 kmalloced인 skb를 반환할 수 있기 때문입니다. 그 결과, GRO 패킷 내 마지막 작은 skb는 kmalloced될 수 있습니다.

이를 수정할 수 있는 세 가지 위치가 있습니다:

(1) GRO에서 head_frag을 확인하고 서로 다른 head_frag을 가진 skbs에 대한 GRO를 허용하지 않을 수 있습니다. 그러나 이는 gso_size 변경이 없는 정상적인 포워딩 경로에서 마지막 패킷의 !head_frag이 문제가 되지 않는 경우 성능 저하로 이어집니다.

(2) bpf_skb_net_grow 및 bpf_skb_net_shrink 내에서 NETIF_F_SG가 바람직하지 않음을 나타내는 플래그를 설정합니다. 이는 sk_buff 내 비트 하나를 소모해야 합니다. 또한, frag_list의 모든 skbs가 페이지 기반일 때 해당 플래그는 해제될 수 있습니다. 좋은 성능을 유지하려면 bpf_skb_net_grow/shrink이 frag_list를 순회해야 합니다.

(3) NETIF_F_SG를 지워야 하는지 결정할 때 skb_segment 내에서 frag_list를 순회합니다. 물론 이는 속도를 늦춥니다.

본 패치는 (3)을 구현합니다. skb_segment 내에서의 성능 영향을 제한하기 위해, gso_size가 변경된 SKB_GSO_DODGY 플래그가 설정된 skbs에 대해서만 리스트를 순회합니다. 따라서 정상적인 경로는 이를 타격받지 않습니다.

마지막 skb만 확인해도 되지만 어쨌든 전체 리스트를 순회해야 하므로 안전한 쪽을 선택했습니다.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

책임이 있는

Linux

예약하다

2025. 05. 01.

모더레이션

수락

항목

VDB-306982

EPSS

0.00166

출처

Do you know our Splunk app?

Download it now for free!