[하루한줄] 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
고정)만큼을 읽어 반환합니다. 그러나 중첩된 조각화 패킷의 확장 헤더의 크기를 제한하지 않아 확장 헤더 크기가 0xffd0
면NdisGetDataBuffer
함수는 0xffd0 + 0x28(패킷 헤더) = 0xfff8
크기만큼 읽고 NULL을 반환합니다. 결과적으로 반환된 NULL 값을 tcpip!Ipv6pReassembleDatagram
에서 참조하게 되고 NULL 포인터 역참조 취약점이 발생합니다.
해당 취약점은 악성 UDP 패킷을 IPv6를 통해 전송하여 원격으로 트리거할 수 있는 것으로 알려졌습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.