# N/A
## 概述
GPAC v2.4.0 中的 `pcmreframe_flush_packet` 函数存在栈溢出漏洞,攻击者可通过构造恶意 WAV 文件触发该漏洞,导致拒绝服务(DoS)。
## 影响版本
GPAC v2.4.0
## 细节
漏洞位于 `pcmreframe_flush_packet` 函数,处理 WAV 文件时未对数据长度进行有效验证,导致栈溢出。
## 影响
攻击者可利用该漏洞造成程序崩溃,实现拒绝服务攻击。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: POC/gpac_rawpcm/GPAC_RFPCM.md at main · zakkanijia/POC · GitHub -- 🔗来源链接
标签:
神龙速读:
## 关键漏洞信息
### 1. 概述
- **项目/产品**: GPAC
- **受影响组件**: PCM reframer filter rfpcm (`src/filters/reframe_rawpcm.c`)
- **漏洞类别**: 堆栈溢出(通过未经检查的 `memcpy` 的边界写入)
- **触发条件**: 处理包含大量通道数的恶意构造的 `.wav` 文件,当反向播放启用时,`bytes_per_sample = channels * (bits_per_sample / 8) > 100`
- **影响**: 至少导致服务拒绝(崩溃)。由于这是堆栈越界写入,内存损坏可能被利用,具体依赖于编译标志和堆栈布局(此处未演示)。
- **攻击向量**: 在支持反向播放或以负播放速度运行的 GPAC 基础应用中,受害者打开/播放一个构造的 `.wav` 文件。
### 2. 影响版本
- **已确认漏洞版本(代码审计)**: GPAC 2.4.0
- **潜在影响版本**: 其他包含相同 `rfpcm` 反向交换逻辑的版本。
### 3. 根因
#### 3.1 位置
- **文件**: `src/filters/reframe_rawpcm.c`
- **函数**: `pcmreframe_flush_packet(GF_PCMReframeCtx *ctx)`
- **代码区域**: 反向播放样本交换循环
#### 3.2 根因细节(用于可变尺寸样本的固定尺寸堆栈缓冲区)
- 当 `ctx->reverse_play` 启用时,`pcmreframe_flush_packet` 将样本原地反转:
- 计算 `nb_bytes_in_sample = ctx->Bps * ctx->ch`。
- 使用固定大小的堆栈缓冲区 `char store[100]` 作为交换临时缓冲区。
- 不检查是否小于 `sizeof(store)`,直接将 `nb_bytes_in_sample` 字节复制到 `store` 中。
- 由于通道数量 `ctx->ch` 和 `ctx->Bps`(从 WAV 位深度派生的每样本字节数)受 WAV 头部控制,当 `channels=64` 和 `bits_per_sample=16` 时,`nb_bytes_in_sample = 64 * 2 = 128 > 100`,导致堆栈缓冲区溢出。
- 当 `evt->play.speed < 0` 在 `pcmreframe_process_event(...)` 中时,启用反向播放。
### 4. 概念验证 (PoC) 和复现
#### 4.1 PoC 生成器
- 附件: `poc_rfpcm_reverse_stack_overflow.py`
- 生成了 `poc_rfpcm_reverse_stack_overflow.wav`,包含:
- `channels=64`
- `bits_per_sample=16`
- `bytes_per_sample(所有通道)=128 (>100)`
#### 4.2 生成 PoC
```bash
python3 poc_rfpcm_reverse_stack_overflow.py
```
#### 4.3 复现命令(推荐)
```bash
ASAN_OPTIONS=abort_on_error=1:detect_leaks=0:symbolize=1:print_stacktrace=1 \
./bin/gcc/gpac -speed=-1 -i poc_rfpcm_reverse_stack_overflow.wav:rfpcm -o null
```
### 5. 影响评估
- **最小影响**: 当反向播放请求在构造的 `.wav` 文件上时,发生崩溃 (DoS)。
- **安全风险**: 堆栈越界写入(内存损坏)。利用性依赖于构建和环境,此处未演示。
### 6. 建议修复
- 替换 `char store[100];` 以使用大小为 `nb_bytes_in_sample` 的缓冲区(堆或动态大小的堆栈缓冲区),或者在复制前至少使用 `nb_bytes_in_sample <= sizeof(store)` 进行边界检查。
### 7. 附件
- `reframe_rawpcm.c`: 漏洞 `rfpcm` 代码
- `poc_rfpcm_reverse_stack_overflow.py`: 可运行的 PoC 生成器
暂无评论