# N/A
## 概述
GPAC v2.4.0 中 `dump_ttxt_sample` 函数存在栈溢出漏洞,攻击者可通过特制数据包导致拒绝服务(DoS)。
## 影响版本
GPAC 2.4.0
## 细节
`dump_ttxt_sample` 函数在处理文本样本数据时未对输入数据长度进行有效检查,导致栈缓冲区溢出。
## 影响
攻击者可利用该漏洞触发程序崩溃,造成拒绝服务。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: POC/gpac_boxDump/GPAC_tx3g.md at main · zakkanijia/POC · GitHub -- 🔗来源链接
标签:
神龙速读:
## 关键漏洞信息
### 1. 漏洞概述
- **项目/产品**: GPAC
- **影响组件**: ISO Media dump / Timed Text XML export (`MP4Box -ttx`), `isomedia/box_dump.c`
- **漏洞类型**: 基于栈的缓冲区溢出(越界写)通过未经检查的 `memcpy`
- **触发方式**: 一个带有 `tx3g` 定时文字样本的特殊 MP4 文件,其中文本长度字段很大,有效载荷以 UTF-16 BE BOM (`0xFE 0xFF`) 开头。
- **影响**: 最低导致服务拒绝(崩溃)。由于这是栈上的 OOB 写入,内存损坏可能可被利用,这取决于构建标志和栈布局(此报告中未演示)。
- **攻击向量**: 受害者运行 `MP4Box -ttx`(或任何转储定时文本轨迹的 GPAC 代码路径)在特殊构造的 MP4 文件上。
### 2. 影响版本
- **确认易受攻击的版本**: GPAC 2.4.0(ASan 下再现)
- **可能受影响的版本**: 其他包含相同 `dump_ttxt_sample` 逻辑的版本。
### 3. 根因
#### 3.1 位置
- **文件**: `src/isomedia/box_dump.c`
- **函数**: `dump_ttxt_sample(...)`
- **崩溃行 (GPAC 2.4.0 构建)**: `box_dump.c:3605`
#### 3.2 根因详细信息
`dump_ttxt_sample(...)` 在堆栈上分配一个固定大小的 UTF-16 缓冲区:
- `unsigned short utf16Line[10000];` → **20,000 字节**
当样本文本以 UTF-16 BE BOM 开头时,代码执行:
- `memcpy((char*)utf16Line, s_txt->text + 2, s_txt->len);`
攻击者通过 `tx3g` 样本的 16 位长度字段控制 `s_txt->len`。
如果 `s_txt->len > sizeof(utf16Line)`(即 > 20,000 字节),`memcpy` 将写入 `utf16Line` 缓冲区之外,导致堆栈损坏。这是一个经典的缺少边界检查问题 / 长度不匹配(它似乎还复制 `len` 字节从 `text+2` 开始,即它应该复制 `len-2` 并将其封顶。
### 4. 概念验证 (PoC) 和再现
#### 4.1 生成 PoC 的脚本附件:
**poc_tx3g_utf16_stack_overflow.py**
产生一个最小的 MP4 文件,其中包含一个 `tx3g` 样本:
- `text_len = 30000`
- 有效载荷以 `0xFE 0xFF` 开头
#### 4.2 生成 PoC
```bash
python3 poc_tx3g_utf16_stack_overflow.py
# 输出: poc_tx3g_utf16_stack_overflow.mp4
```
#### 4.3 再现命令
使用启用了 AddressSanitizer 的 GPAC 构建运行:
```bash
ASAN_OPTIONS=abort_on_error=1:detect_leaks=0:symbolize=1:print_stacktrace=1 ./bin/gcc/MP4Box -ttx 1 poc_t
```
#### 4.4 预期结果(关键摘录)
ASan 报告 `stack-buffer-overflow`,写操作起源于 `memcpy`:
- `WRITE of size 30000`
- `dump_ttxt_sample isomedia/box_dump.c:3605`
完整 ASan 输出见 `asan.txt` 文件。
### 5. 影响评估
- **最低影响**: 处理恶意 MP4 定时文本轨迹时崩溃导致的服务拒绝。
- **安全风险**: 这是一个栈越界写入(内存损坏)。可利用性取决于构建和环境,并且在此报告中未展示。
### 6. 建议修复方案
- 在 `memcpy` 之前,针对堆栈缓冲区大小验证复制长度,考虑 BOM 和终止符。
- 如果 `s_txt->len` 对该路径不合理地大,拒绝或返回错误。
- 考虑根据验证过的输入动态分配缓冲区大小。
```
此外,为了完整起见,还提供了相关的附件包括 ASan 输出文件、包含易受攻击代码的 C 文件以及生成 PoC 的 Python 脚本。
暂无评论