0x0OZ/CVE-2026-7482-PoC
GitHub: 0x0OZ/CVE-2026-7482-PoC
针对 Ollama GGUF 模型加载器堆越界读取漏洞(CVE-2026-7482)的 1-Day 概念验证,演示了通过伪造截断 GGUF 文件绕过前端验证并实现堆内存泄露的完整利用链。
Stars: 2 | Forks: 1
# CVE-2026-7482: Ollama 堆越界读取 (1-Day PoC)
本仓库包含针对 **CVE-2026-7482** 的 1-Day 概念验证 exploit 链,该漏洞是 Ollama 的 GGUF 模型加载器(0.17.1 之前的版本)中存在的一个未经身份验证的越界读取漏洞。
**注意:** 这是一个 1-Day 安全研究复现。我并非此 CVE 的原始发现者。本 PoC 是基于公开的安全公告细节构造的,旨在出于教育和防御性研究的目的,演示该漏洞的利用机制。
## 漏洞概述
通过向 `/api/create` 端点提供一个恶意构造的、截断的 GGUF 文件,攻击者可以强制 `fs/ggml/gguf.go` 和 `server/quantization.go` 中的量化解析器读取超出已分配堆缓冲区的范围。然后,通过 `/api/push` 端点将生成的模型产物推送到攻击者控制的 Docker Registry,从而实现泄露内存的窃取。
## 技术细节:漏洞利用原语
在此次 1-Day 研究中,复现崩溃非常简单,但要实现稳定的数据窃取且不让服务器崩溃或触发 API 验证拦截,则需要特定的架构伪造:
1. **前端验证绕过:** payload 必须被标记为 `F16` (`general.file_type = 1`) 以满足 Ollama API 严格的预检机制。
2. **量化器强制转换:** 我们请求进行 `Q4_K_M` 降量化操作。因为 payload 被视为 F16,C++ `ggml` 后端被迫处理该 payload,而不是执行安全的 1:1 内存拷贝。
3. **完美的块对齐:** 目标张量 (`token_embd.weight`) 必须被塑造成一个二维矩阵,其中最内层维度恰好为 `256`(例如,`[num_rows, 256]`)。这与 `Q4_K_M` 的块要求严格对齐,防止后端跳过该层。
4. **物理截断:** 物理文件被截断为 32 字节。当矩阵乘法循环运行时,它会命中 EOF 并直接越界读取到相邻的堆空间中。
## 前置条件
```
pip install requests numpy gguf
```
您还需要一个公开可访问的 HTTP 监听器(如 Ngrok)来捕获窃取的 Docker 层推送数据。
## 使用方法
**1. 启动恶意 Registry**
启动监听器以捕获泄露的内存数据块。
```
sudo python3 registry.py
```
**2. 伪造恶意 Payload**
生成截断的 GGUF 文件。您可以在脚本内调整 `TARGET_LEAK_SIZE_MB`,以控制每次请求会读取多少堆内存。(建议:0.5MB 到 2.0MB,以避免因访问未映射页面而导致段错误)。
```
python3 forge.py
```
**3. 发起攻击**
编辑 `exploit.py` 以填入目标 IP 和您的恶意 registry URL,然后执行:
```
python3 exploit.py
```
**4. 分析产物**
registry 会将泄露的堆转储放到 `exfils/` 目录中。
*关于数据完整性的说明(量化陷阱):* 虽然 exploit 成功捕获并外泄了多达数兆字节的 server 堆内存,但这些数据在发生越界读取期间,经受住了 Ollama 的 `Q4_K_M` 降量化算法处理。后端将原始内存字节强制转换为 `float16`,并应用了有损的 4-bit 块压缩方案。因此,泄露的内存在数学层面上已被破坏。标准的 ASCII 提取工具将输出无意义的二进制乱码,这使得通过这种特定的强制转换路径来恢复明文凭据在实际操作中是不可行的。
## 免责声明
本项目仅用于教育和授权的漏洞研究目的。请勿对您不拥有或未获得明确测试授权的系统使用此工具。
标签:1day漏洞, AI安全, AI风险缓解, C++, Chat Copilot, CISA项目, CVE, CVE-2026-7482, Docker, GGUF, Go语言, LLM评估, Ollama, OOB, PoC, XXE攻击, 内存泄露, 堆溢出, 大模型安全, 安全防御评估, 实时告警, 情报收集, 插件系统, 数字签名, 数据擦除, 数据窃取, 暴力破解, 漏洞复现, 漏洞研究, 程序破解, 网络安全, 越界读取, 逆向工具, 隐私保护