CVE-2024-36937 in Linux
요약
\~에 의해 VulDB • 2026. 07. 12.
리눅스 커널에서 다음 취약점이 해결되었습니다:
xdp: 브로드캐스트 리디렉션의 모호성을 해소하기 위해 flags 필드 사용
XDP를 사용하여 패킷을 리디렉션할 때, bpf_redirect_map() 헬퍼 함수는 struct bpf_redirect_info 구조체 내에 리디렉션 대상 정보를 설정합니다(이는 __bpf_xdp_redirect_map() 헬퍼 함수를 통해 수행됨). 그리고 xdp_do_redirect() 함수는 XDP 프로그램이 반환된 후 이 정보를 읽어서 프레임을 올바른 리디렉션 대상으로 전달합니다.
BPF_F_BROADCAST 플래그를 사용하여 전체 맵에 대한 멀티캐스트 리디렉션을 수행할 때, __bpf_xdp_redirect_map()은 struct bpf_redirect_info 구조체의 'map' 포인터가 브로드캐스팅될 대상 맵을 가리키도록 설정합니다. 그리고 xdp_do_redirect()는 이 map 포인터의 값을 참조하여 브로드캐스트 리디렉션인지 단일 값에 대한 리디렉션인지를 판단합니다. 그러나 만약 xdp_do_redirect()가 호출되기 전에 대상 맵이 파괴되고 있다면, bpf_clear_redirect_map()을 통해 다른 XDP 프로그램들의 실행 종료를 기다리지 않고 map 포인터가 클리어됩니다. 이로 인해 xdp_do_redirect()는 리디렉션이 단일 대상으로 이루어진 것으로 오인하게 되지만, 실제 타겟 포인터도 NULL입니다(브로드캐스트 리디렉션에는 단일 대상이 없기 때문). 따라서 dev_map_enqueue()에 NULL 포인터가 전달될 때 크래시가 발생합니다.
이를 해결하기 위해 xdp_do_redirect()를 수정하여 struct bpf_redirect_info의 'flags' 값 내에 BPF_F_BROADCAST 플래그가 존재하는지에 직접 반응하도록 하여, 단일 대상 리디렉션과 브로드캐스트 리디렉션을 구분합니다. 그리고 브로드캐스트 플래그가 설정된 경우에만 'map' 포인터를 읽으며, 그 사이에 해당 플래그가 클리어되었다면 처리를 중단합니다. 이렇게 하면 맵 포인터 자체의 원자적(cmpxchg 기반) 클리어링을 유지하고 비브로드캐스트 고속 경로에 추가적인 체크를 도입하지 않으면서도 크래시를 방지할 수 있습니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.