# N/A
## 概述
GPAC v2.4.0 中的 `oggdmx_parse_tags` 函数存在越界读取漏洞。
## 影响版本
GPAC v2.4.0
## 细节
漏洞位于 `oggdmx_parse_tags` 函数,在处理 OGG 文件的标签信息时未正确验证数据边界,导致越界读取。
## 影响
攻击者可利用该漏洞读取越界内存数据,可能导致信息泄露或崩溃。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: POC/dmx_ogg/GPAC_oggdmx_parse_tags_offbyone.md at main · zakkanijia/POC · GitHub -- 🔗来源链接
标签:
神龙速读:
## 漏洞关键信息
- **项目:** GPAC
- **组件:** OGG demuxer filter (`src/filters/dmx_ogg.c`)
- **函数:** `oggdmx_parse_tags(...)`
- **漏洞类型:** Off-by-one out-of-bounds read/write (1 byte)
- **测试版本:** GPAC-2.4.0 (local build, clang-17 + ASan/UBSan)
- **报告人:** zakka
- **日期:** 2025-12-19
### 摘要
函数 `oggdmx_parse_tags()` 从攻击者控制的 OGG/OpusTags 元数据中读取一个 32 位长度 (`t_size`) 并仅检查:
```cpp
if (size < t_size) return;
```
随后执行以下操作:
```cpp
sep = data[t_size];
data[t_size] = 0;
...
data[t_size] = sep;
```
当 `size == t_size` 时,访问 `data[t_size]` 就变成了 `data[size]`,这是有效缓冲区范围之外的一个字节,导致 1 字节的 OOB 读取和写入(off-by-one)。
### 根源分析
代码假定 `t_size` 是 `data` 缓冲区的有效索引,但边界检查允许相等。
### 影响/严重性说明
- OOB 恰好为 1 字节。
- 写入是瞬时的,这通常能避免直接利用。
- 实际影响仍可能包括未定义行为和潜在崩溃,具体取决于缓冲区布局和分配器行为。
- 在许多构建中,ASan 可能不会报告,因为访问可能落在同一底层分配内(缓冲区内溢出),但 OOB 相对于函数的 `size` 合同仍然是真实的。
### 提议修复措施
调整边界检查,以禁止在访问 `data[t_size]` 之前相等:
```cpp
- if (size < t_size) return;
+ if (size <= t_size) return;
```
或等效地确保在访问 `data[t_size]` 之前 `t_size < size`。
暂无评论