Haitam-lazaar/libextractor-ole2-rce

GitHub: Haitam-lazaar/libextractor-ole2-rce

该项目是 GNU libextractor OLE2 插件中基于栈的 VLA 缓冲区溢出漏洞的概念验证,展示了通过恶意 .doc 文件实现远程拒绝服务及多线程环境下远程代码执行的完整利用链。

Stars: 0 | Forks: 0

# GNU libextractor ≤ 1.14 中基于栈的缓冲区溢出(OLE2 插件) ## 摘要 GNU libextractor 的 OLE2 插件中存在一个基于栈的缓冲区溢出漏洞,在处理精心构造的 `.doc` 文件时,允许**远程拒绝服务**(崩溃)和**代码执行**。该漏洞位于 `process_star_office()`(`ole2_extractor.c:349`)中,该函数根据攻击者控制的文件数据在栈上分配了高达 4MB 的变长数组(VLA)。 **主要影响:** 远程拒绝服务 —— 导致任何处理该恶意文件的应用程序崩溃 **次要影响:** 通过相邻线程栈绕过 `-fstack-clash-protection` 实现远程代码执行 | 字段 | 值 | |-------|-------| | 严重程度 | **高** (DoS) / **严重** (多线程进程内模式下的 RCE) | | CWE | CWE-121(基于栈的缓冲区溢出) | | 攻击向量 | 网络(任何文件处理路径) | | 所需权限 | 无 | | 用户交互 | 无 | | 受影响版本 | 1.14 及之前的所有版本 | ## 受影响软件 - GNU libextractor ≤ 1.14(所有带有 OLE2 插件的版本) - 任何使用 libextractor 处理不受信任的 `.doc` 文件的应用程序 - GNUnet(文件共享索引器) ## 快速演示 ``` # 生成恶意 .doc python3 poc/gen_payload.py exploit.doc # 任何使用 libextractor 处理此文件的应用程序都会崩溃: extract exploit.doc # CLI tool → OLE2 plugin worker crashes gnunet-publish exploit.doc # GNUnet → gnunet-helper-fs-publish crashes ``` ## 概念验证(实验室演示) ![远程代码执行演示](https://raw.githubusercontent.com/Haitam-lazaar/libextractor-ole2-rce/main/screenshots/poc_demo.gif) *上面的动画演示了 `lab-setup/` 目录中提供的自动化实验室环境。只需运行 `docker compose up`,攻击者容器就会自动生成恶意 `.doc` payload,并将其上传到存在漏洞的文档索引 Web 服务中。`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 ``` ## 复现 ### 崩溃 / DoS(适用于任何系统) ``` # 从源码构建 libextractor ./configure && make && sudo make install # 生成触发文件 python3 poc/gen_payload.py exploit.doc # 使任何 libextractor 消费者崩溃 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 实验室 ``` 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](docs/BYPASS.md))。 ## 官方补丁(libextractor 1.15) ``` - 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)在我的独立安全研究期间发现。 ## 许可证 我的研究仅供教育和防御目的。请负责任地使用。
标签:Cutter, Go语言工具, PoC, 安全漏洞, 客户端加密, 拒绝服务攻击, 暴力破解, 栈溢出, 版权保护, 编程工具, 请求拦截, 远程代码执行, 逆向工具