
CVE-2026-59346에 대한 PoC - VMware의 VMXNET3 TSO 세그멘테이션 경로에서 발생하는 32비트 정수 오버플로, 게스트에서 호스트로의 크래시.
| CVE | CVE-2026-59346 |
| 분석 문서 | cyberstan.co.uk/vmxnet3-tso-overflow |
| ZDI 권고 | ZDI-26-647 |
| 벤더 권고 | VMSA-2026-0007 |
| CVSSv3 | 9.3 (벤더) / 7.5 (ZDI) |
| 수정 버전 | Workstation / Fusion 26H1u1 |
| 신고 경로 | Trend Micro Zero Day Initiative |
VMXNET3 TSO 세그멘테이션 루틴은 할당 크기를 32비트 imul을 사용하여 seg_count * per_seg_size로 계산합니다. 실제 곱이 2^32를 초과하면 결과가 랩어라운드되어 할당자는 잘린 값을 받습니다. 이어지는 세그멘테이션 루프는 할당 크기가 아닌 seg_count에 의해 구동되므로, 랩어라운드된 곱으로 크기가 결정된 버퍼에 세그먼트당 per_seg_size 바이트를 기록합니다.
이 코드 경로에 대한 이전 수정(CVE-2025-41236)은 MSS, per_seg_size, 또는 그 합이 9216을 초과하는 패킷을 거부하는 범위 검사를 추가했습니다. 이러한 검사는 개별 디스크립터 필드를 제한하지만 실제로 랩어라운드되는 값인 곱은 제한하지 않습니다. 9216 한도보다 훨씬 낮은 매개변수로도 여전히 오버플로에 도달합니다.
전체 근본 원인 분석, 주석이 달린 디스어셈블리 및 힙 구조: cyberstan.co.uk/vmxnet3-tso-overflow.
원시 TX 디스크립터를 작성할 수 있는 충분한 권한을 가진 게스트 사용자는 게스트가 제공한 패킷에서 가져온 내용으로 호스트 vmware-vmx 프로세스에 대규모 범위 초과 쓰기를 유발할 수 있습니다. 이 PoC에서는 쓰기가 매핑되지 않은 메모리에 도달할 때까지 진행되고 호스트 프로세스가 SIGSEGV로 종료되어 VM의 전원이 꺼집니다.
벤더는 이 문제를 하이퍼바이저 컨텍스트에서 임의 코드 실행을 허용하는 것으로 평가했습니다. 공개된 PoC는 메모리 안전성 위반만을 입증하며 크래시에서 멈춥니다.
vmware-vmx VMXNET3 백엔드를 공유하는 모든 VMware 데스크톱 하이퍼바이저 제품: Workstation, Fusion, Player. VMXNET3는 최신 게스트의 기본 어댑터입니다. 권위 있는 영향받는 버전 목록은 VMSA-2026-0007을 참조하십시오.
이 PoC는 게스트 내부에서 실행되는 Linux 커널 모듈입니다. 커널 내 드라이버의 TSO 로직을 우회하여 VMXNET3 TX 링 디스크립터를 직접 작성한 다음 도어벨 MMIO 레지스터를 울립니다.
# 게스트 VM 내부에서, root 권한으로:
# 커널 헤더
apk add linux-virt-dev # Alpine
# apt install linux-headers-$(uname -r) # Debian / Ubuntu
make
insmod vmxnet3_tso_trigger.ko
호스트 vmware-vmx 프로세스가 크래시하고 게스트의 전원이 꺼집니다. VM에서 저장되지 않은 상태를 잃을 수 있으므로 다시 실행하려면 먼저 스냅샷을 찍으십시오.
게스트에 VMXNET3 어댑터가 필요합니다. lspci | grep -i vmxnet으로 확인하거나 .vmx 파일에서 ethernet0.virtualDev = "vmxnet3"를 확인하십시오. 이 모듈은 NIC와 직접 통신하므로 인터페이스가 활성화되어 있고 vmxnet3 드라이버에 바인딩되어 있어야 합니다.
| 매개변수 | 기본값 | 용도 |
|---|---|---|
ifname | eth0 | VMXNET3 어댑터가 지원하는 인터페이스 |
dryrun | 0 | 1은 디스크립터를 작성하지만 도어벨을 건너뛰므로 아무것도 트리거되지 않음 |
wait_ms | 0 | 디스크립터 설정과 도어벨 쓰기 사이의 지연(ms) |
txwarm | 0 | 오버플로 패킷 전에 링을 통해 밀어넣을 TSO 패킷 |
warmup | 0 | 트리거 전에 발행할 호스트 측 할당 |
freechunk | 0 | 트리거 전에 생성하고 부분적으로 해제할 동일 크기 할당 |
warmup과 freechunk는 오버플로가 발생하기 전에 호스트 힙을 형성합니다. 크래시를 재현하는 데는 필요하지 않으므로 할당 레이아웃을 조사하는 경우가 아니면 0으로 두십시오.
먼저 드라이런으로 모듈이 링을 찾고 매개변수를 계산하는지 호스트를 건드리지 않고 확인하십시오:
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
예상 출력에는 계산된 지오메트리와 찾은 TX 링이 포함됩니다:
tso_v8: per_seg=6240 (0x1860), HDR_TOTAL=6222, MSS=1
tso_v8: PARAMS: alloc=... overflow=... seg_count=... paylen=...
tso_v8: ring at priv+N: base=... sz=... n2f=... gen=...
tso_v8: DRYRUN -- descriptors written but NOT triggered
링을 찾지 못하면 모듈은 TX ring not found를 기록하고 중단합니다. 이는 일반적으로 드라이버 레이아웃 차이를 의미하며, 해당 커널에 맞게 find_tx_ring()의 검색 휴리스틱을 조정해야 합니다.
그런 다음 필요하면 기본이 아닌 인터페이스에서 실제로 트리거하십시오:
insmod vmxnet3_tso_trigger.ko ifname=eth1
게스트가 호스트 프로세스와 함께 종료되므로 마지막 메시지가 디스크에 도달하지 못할 수 있습니다. 이를 캡처하려면 journal에 의존하지 말고 콘솔을 관찰하십시오:
dmesg -w
VM의 vmware.log에서 호스트 측 크래시를 확인하십시오. vcpu-0 스레드에서 할당자를 통과하는 백트레이스와 함께 PANIC: Unexpected signal: 11이 표시됩니다.
ifname은 브리지나 보조 e1000 어댑터가 아닌 VMXNET3 장치를 지정해야 합니다.need N entries but ring has M slots와 함께 중단됩니다.| 호스트 | Ubuntu 24.04 LTS, 커널 6.17.0, glibc 2.39 |
| 하이퍼바이저 | VMware Workstation Pro 25.0.1 (빌드 25219725) |
| 게스트 | Alpine Linux, 커널 6.12, VMXNET3 NIC |
분석에서 참조된 심볼 오프셋은 빌드 25219725에 특정합니다. 취약한 패턴은 빌드 전반에 걸쳐 동일하지만 오프셋은 다를 수 있습니다.
vmxnet3_tso_trigger.c 트리거 모듈
Makefile out-of-tree 커널 모듈 빌드
곱셈은 64비트로 수행되어야 하며, 결과는 할당자에 도달하기 전에 범위가 제한되어야 합니다. 오버플로는 두 피연산자가 아닌 곱의 속성이므로 개별 디스크립터 필드를 제한하는 것만으로는 충분하지 않습니다.
| 날짜 | 이벤트 |
|---|---|
| 2026 | Trend Micro ZDI에 신고 |
| 2026년 9월 | Broadcom이 26H1u1에서 패치 (VMSA-2026-0007) |
| 2026년 9월 | ZDI-26-647 공개 |
수정이 배포된 후 조정된 공개 하에 게시되었습니다. 소유하거나 테스트 권한이 있는 시스템에만 실행하십시오. 호스트 하이퍼바이저 프로세스를 크래시시키므로 중요하게 여기는 대상에는 사용하지 마십시오.
Stan S - cyberstan.co.uk · @0xCyberstan