
CVE-2026-99999에 대한 시뮬레이션 전용 개념 증명으로, 게스트에서 호스트로의 힙 메모리 노출을 가능하게 하는 Linux 커널 virtio-net IPv4 csum_start 검증 버그입니다.
악성 virtio-net 체크섬 메타데이터를 통한 Linux 커널 정보 노출.
CVSS 9.3 CRITICAL | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
발견: Paulos | CNA: kernel.org | 게시: 2026-10-15
⚠️ 이는 교육 / 검증용 PoC입니다. --simulate 모드에서만 실행됩니다
(네트워크 I/O 없음, root 권한 불필요). 실제 운영 중인 시스템을 익스플로잇하지 않고
공격 체인을 로컬에서 시연합니다.
게스트 VM은 virtio_net_hdr에 csum_start == 0을 담은 virtio-net 프레임을
전송할 수 있습니다. 이는 전송 계층 헤더가 아닌 IPv4 헤더를 가리킵니다.
호스트에서 GSO 세그멘테이션 중 skb_checksum_help()가
[csum_start, csum_start + csum_offset + 2) 범위를 대상으로 체크섬을 재계산하고,
그 결과를 csum_start + csum_offset에 다시 기록합니다.
csum_start = 0이고 csum_offset = 0일 때, 이 쓰기는 IHL 바이트
(IP 오프셋 0)에 적용되어 값을 0x45(IHL 5 → 20바이트)에서 0x4F
(IHL 15 → 60바이트)로 손상시킵니다. 이후 커널의 ip_do_fragment()는
IP 헤더가 20바이트만 존재하는데도 60바이트를 읽게 되어, 각 아웃바운드
프래그먼트마다 호스트 커널 힙 메모리의 인접한 ~32–64바이트를 끌어옵니다.
영향: 게스트에서 호스트로의 지속적인 커널 힙 메모리 노출.
공격 표면: virtio-net NIC와 TAP 브리징이 활성화된 KVM/QEMU 호스트, 또는 호스트가 GSO를 통해 virtio-net 프레임을 처리하는 모든 VM→호스트 통신 경로.
| 오프셋 | 필드 | csum_offset=0 손상 | csum_offset=6 손상 |
|---|---|---|---|
| 0 | 버전 + IHL | ✅ IHL 바이트 | |
| 1 | TOS | ||
| 2–3 | 전체 길이 | ||
| 4–5 | 식별자 | ||
| 6–7 | 플래그 / 프래그먼트 오프셋 | ✅ 플래그/프래그 오프셋 (하위) | |
| 8 | TTL | ||
| 9 | 프로토콜 | ||
| 10–11 | 헤더 체크섬 | ||
| 12–15 | 출발지 IP | ||
| 16–19 | 목적지 IP |
Guest VM
→ constructs virtio_net_hdr with csum_start=0 (pointing at IP header)
→ sends frame through virtio-net to host
Host kernel (GSO segmentation path)
→ skb_checksum_help() called
→ writes checksum result to csum_start + csum_offset
→ if csum_offset=0: writes IHL byte (0x45 → 0x4F)
→ ip_do_fragment() reads 60B header when only 20B exist
→ ~32–64B heap memory included in each outbound fragment
| csum_offset | 손상된 필드 | 결과 | CVSS 벡터 |
|---|---|---|---|
0 (기본값) | IHL 바이트 (오프셋 0) | OOB 힙 읽기 → 메모리 누출 | 정보 노출 |
6 | Flags/FragOffset (오프셋 6) | 프래그먼트 재조립 중단 | 가용성 |
수정 커밋 이전의 모든 Linux 커널 버전.
영향 없음 (패치됨): 5.10.272+, 5.15.223+, 6.1.190+, 6.12.113+, 6.18.57+, 7.2.11+
커널 버전 확인:
uname -r
cat /proc/version
요구 사항: Python 3.6+만 필요합니다. pip 패키지, 네트워크, root 권한이 필요하지 않습니다.
# Clone
git clone https://github.com/01luyicheng/CVE-2026-99999.git
cd CVE-2026-99999
# Run — IHL corruption / heap-leak simulation (CVSS 9.3 path, default)
python3 CVE-2026-99999_pwnescape.py --simulate
# Simulate with 5 datagrams and 8 fragments each
python3 CVE-2026-99999_pwnescape.py --simulate -n 5 -f 8
# Flags/FragOffset corruption path (fragment reassembly disruption)
python3 CVE-2026-99999_pwnescape.py --simulate -c 6
--simulate 없이 스크립트를 실행하면 전체 취약점 설명을 출력하고 종료됩니다:
python3 CVE-2026-99999_pwnescape.py
| 플래그 | 설명 | 기본값 |
|---|---|---|
--simulate | 익스플로잇 체인 시뮬레이션 실행 (필수) | — |
-c, --csum-offset | 0 = IHL 바이트 (OOB 읽기, 기본값); 6 = Flags/FragOffset | 0 |
-n, --num-packets | 시뮬레이션할 데이터그램 수 | 3 |
-f, --fragments | 데이터그램당 프래그먼트 수 (최소 2) | 4 |
시뮬레이션은 5단계로 실행됩니다 (네트워크 불필요):
csum_start=0 (IPv4 IHL 바이트를 가리킴)과
설정 가능한 csum_offset을 가진 virtio_net_hdr을 추가합니다.csum_start + csum_offset에 대한
커널 쓰기를 로컬에서 시뮬레이션하여, 어떤 IP 헤더 바이트가
어떤 값으로 덮어쓰이는지 보여줍니다.csum_offset=0)의 경우 약 32–64B의 힙 메모리 누수를 명시합니다.python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 0
csum_start=0, csum_offset=0 → 쓰기가 IHL 바이트에 적용됨 → IHL 5→15 →
ip_do_fragment()가 20B만 존재하는데 60B를 읽음 → 프래그먼트당 약 32–64B의 힙 메모리
누출.
python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 6
csum_start=0, csum_offset=6 → 쓰기가 Flags/FragOffset 바이트에 적용됨 →
프래그먼트 재조립 메타데이터 손상 → 프래그먼트 재조립 실패.
이 PoC는 독립적으로 검토되었습니다. 주요 결과:
전체 기술 리뷰 보고서는 보안상의 이유로 내부 저장소
(CVE-2026-99999-internal)에 보관되어 있습니다.
패치 상태 확인:
# Check if your kernel has the fix (look for commit 6785011f8b16abf40b1e9d8b2)
cat /proc/config.gz 2>/dev/null | zcat | grep CONFIG_IPV4
# Or check dmesg for related errors after heavy network activity from a VM
6785011f8b16abf40b1e9d8b2 (stable 트리), f43798c27684 (메인라인)<[email protected]> 패치 시리즈이 도구는 격리된 실험실 환경에서의 승인된 보안 연구 및 교육만을 목적으로 합니다.
csum_offset=0 (IHL/OOB 읽기 경로); 죽은 코드 정리; 상세 검토 보고서를 내부 저장소로 이동; SEO를 위해 README 재작성.csum_offset 로직 수정; 기본값을 OOB 읽기 경로로 설정 (-c 0);
--csum-offset CLI 플래그 추가; 고장난 --tap 경로 제거.--simulate 모드; IP 헤더 바이트
레이아웃 수정.