[하루한줄] CVE-2021-24086: Windows IPv6 denial of service vulnerability

URL

Analysis of a Windows IPv6 Fragmentation Vulnerability: CVE-2021-24086

Target

  • Windows

Explain

Microsoft가 2월에 패치한 Windows의 IPv6 서비스 거부 취약점에 대한 세부 분석 정보가 공개되었습니다.

IPv6 source node는 최대 전송 단위(MTU) 보다 큰 패킷을 보내기 위해 패킷을 조각화(Fragmentation)해 전송하고 이를 수신할 때 다시 조립합니다. Windows에서는 IPv6 패킷의 중첩 조각화를 허용해 조각화된 IPv6 패킷에 다른 조각화된 패킷을 구성할 수 있는데, 조각화된 패킷을 재조립하는 tcpip!Ipv6pReassembleDatagram 에서 NULL 포인터 역참조 취약점이 발생합니다.

수신한 조각화 패킷을 처리하는 tcpip!Ipv6pReceiveFragment는 중첩된 조각화 패킷을 수신하면 tcpip!Ipv6pReassembleDatagram을 재귀적으로 호출합니다. 해당 함수는 확장 헤더의 크기를 1500으로 제한한 뒤 NdisGetDataBuffer 를 호출해 패킷 데이터가 있는 NET_BUFFER 구조체에서 확장 헤더 크기 + 패킷 헤더 크기(0x28 고정)만큼을 읽어 반환합니다. 그러나 중첩된 조각화 패킷의 확장 헤더의 크기를 제한하지 않아 확장 헤더 크기가 0xffd0NdisGetDataBuffer 함수는 0xffd0 + 0x28(패킷 헤더) = 0xfff8 크기만큼 읽고 NULL을 반환합니다. 결과적으로 반환된 NULL 값을 tcpip!Ipv6pReassembleDatagram 에서 참조하게 되고 NULL 포인터 역참조 취약점이 발생합니다.

해당 취약점은 악성 UDP 패킷을 IPv6를 통해 전송하여 원격으로 트리거할 수 있는 것으로 알려졌습니다.