
QEMU 11.1.2 - High - 로컬/원격 - OOB - COLO filter-rewriter short IPv4 L4 힙 오버플로
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-colo-l4-oob
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - COLO filter-rewriter
분류: OOB (힙 버퍼 오버플로 READ/WRITE). 도달 범위: 로컬(게스트) / 원격(COLO 피어).
parse_packet_early는 L2에 더해 ip_hl*4가 들어맞기만 하면 IPv4를 받아들인다. 최소 L4 헤더를 요구하지 않는다. 이어서 fill_connection_key는 남은 길이를 확인하지 않고 transport_header에서 4바이트를 읽는다. filter-rewriter는 g_malloc0(size)로 프레임을 복사하는데, SYN이 연결을 TCPS_SYN_RECEIVED로 옮긴 뒤 conn->offset != 0인 ACK가 오면, 캡처된 길이가 전송 헤더에서 끝나는 경우 th_ack / th_seq를 그 청크 너머에 쓴다.
COLO는 기본값이 아니다. -object filter-rewriter(및 colo-compare)가 구성된 경우에 켜진다. 해당 rewriter에서의 게스트 TX/RX는 가상화 보안 모델에 포함된다. primary_in / secondary_in 상의 COLO 피어는 네트워크 프로토콜이며, 역시 신뢰할 수 없다.
34바이트 IPv4/TCP 프레임이면 filter-rewriter에서 ASan 힙 버퍼 오버플로 READ를 일으키기에 충분하다.
| ID | 아직 CVE 없음 |
| CWE | CWE-125 / CWE-787 |
| CVSS | High: 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| 제품 | QEMU |
| 영향 받음 | v11.1.2 (4fc49f46), COLO rewriter/compare 활성화 시 |
| 인증 | COLO rewriter netdev 상의 게스트, 또는 COLO compare 피어 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18770 / 18771 루프백 소켓 |
누가: COLO가 활성화된 NIC 상의 신뢰할 수 없는 게스트, 또는 적대적인 COLO compare 피어. 게스트-호스트 / 피어-호스트. QEMU 사용자 공간 힙.
| 방법 | 싱크 | 권한 |
|---|---|---|
| 전체 헤더 SYN 이후의 짧은 IPv4/TCP ACK (34바이트 프레임, 길이가 전송 헤더에서 끝남) | filter-rewriter handle_primary_tcp_pkt / fill_connection_key | filter-rewriter에서 ASan 힙 버퍼 오버플로 READ. 전체 헤더 TCP를 제어하면 QEMU는 살아 있다. |
| 동일한 L4 하한 누락 | parse_packet_early net/colo.c:43-98 | 버퍼 내에 L4 헤더가 없는데도 패킷이 TCP로 분류된다. |
SYN 이후 conn->offset != 0이면 rewriter는 net/filter-rewriter.c:112-114 및 :216-218에서 th_ack / th_seq를 저장한다. IP 옵션(ip_hl > 5)은 그 쓰기를 다음 힙 청크로 밀어낸다. 게스트가 트리거할 수 있는 호스트 힙 WRITE.
colo-compare fill_pkt_tcp_info는 pkt->size와 대조하지 않고 th_off<<2로 header_size를 설정한다. payload_size는 언더플로한다. colo_compare_packet_payload는 두 패킷 할당 너머로 수십 킬로바이트를 memcmp한다. 크래시와 호스트 힙 READ.
rewriter READ 시 ASan 하에서 QEMU가 중단된다. ASan이 없으면 이는 하이퍼바이저 프로세스 내의 실제 힙 OOB이다.
net_fill_rstate가 packet_len > NET_BUFSIZE를 거부).랩은 RIP 제어나 게스트-호스트 셸을 입증하지 않는다. 분류는 COLO가 활성화된 netdev에서의 QEMU 프로세스 힙 OOB이다.
net/colo.c를 읽으며 L4를 포함하는 길이 하한을 찾았습니다. 하한은 Ethernet에 VLAN과 vnet_hdr를 더한 값입니다. ip_hl은 짧은 꼬리에서 가져옵니다. 그런 다음 fill_connection_key가 transport_header를 신뢰합니다. filter-rewriter는 항상 struct tcp_hdr의 오프셋 13에서 th_flags를 로드합니다.
잘못된 접근: TAP 길이를 COLO 경계로 취급(다른 경로); 오버플로를 첫 패킷으로 전송(rewriter는 conn->offset이 활성화되도록 SYN이 먼저 필요); colo-compare th_off 언더플로를 주 증거로 삼음(rewriter READ가 먼저 발생).
cd lab
./run.sh
오직 루프백 소켓 127.0.0.1:18770(filter-rewriter netdev)과 18771(colo-compare)만을 대상으로 합니다. Pin은 github.com/qemu/QEMU 태그 v11.1.2 / 4fc49f46에서 클론되었습니다. ASan. configure 시점에 COLO 프록시가 활성화됩니다. Witness 전용입니다.
SUCCESS qemu-colo-l4-oob asan=heap-buffer-overflow access=READ sink=filter-rewriter control=alive QEMU-COLO-L4-OOB-WITNESS
재현: python3 qemu-colo-l4-oob-Abraxas-Labs.py.
parse_packet_early는 IP 헤더 뒤에 전체 L4 헤더(TCP 20, UDP 8, SCTP 12, AH 8)를 요구해야 하며, size가 transport_header에서 끝나거나 그 이전에서 끝나는 경우 거부해야 합니다. fill_connection_key와 재작성기(rewriter)의 th_* 저장은 남은 길이를 확인해야 합니다. colo-compare는 payload_size를 계산하기 전에 pkt->size에 맞지 않는 th_off<<2를 거부해야 합니다.
4fc49f46dc95d4a27de2509e7fceb2931e91faebparse_packet_early · filter-rewriterGNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 실습 환경 전용입니다. 보증은 제공되지 않습니다.