# FreeRDP 平面压缩RLE堆缓冲区溢出漏洞
## 概述
`freerdp_bitmap_decompress_planar` 在解码前未验证 `nSrcWidth`/`nSrcHeight` 是否超出 `planar->maxWidth`/`maxHeight`,导致 RLE 解码时可能发生堆缓冲区溢出。
## 影响版本
3.21.0 之前的版本
## 细节
该漏洞存在于 FreeRDP 的 `freerdp_bitmap_decompress_planar` 函数中。在执行 RLE 解码前,未对源宽高(`nSrcWidth`、`nSrcHeight`)与最大宽高限制(`planar->maxWidth`、`planar->maxHeight`)进行校验。恶意 RDP 服务器可利用此问题向客户端发送特制的位图数据,触发越界写入。
## 影响
- 客户端崩溃(拒绝服务)
- 堆内存损坏
- 在特定条件下可能存在远程代码执行风险,取决于内存分配器行为和堆布局
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: Release 3.21.0 · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
- **Version**: 3.21.0
- **Release Notes**: Bugfix release with new API functions for input data validation improvements.
- **Fixed Vulnerabilities**: CVE-2026-23530, CVE-2026-23531, CVE-2026-23532, CVE-2026-23533, CVE-2026-23534, CVE-2026-23732, CVE-2026-23883, CVE-2026-23884. (Medium client-side vulnerabilities)
- **Contributor**: ehdgks0627
- **Changes**: Includes fixes for various issues, such as monitor resolution, RPCX upgrades, krb cache, RDPDR checks, codec length checks, glyph length checks, format string checks and warnings, double free errors, and code warnings cleanup.
标题: Heap-buffer-overflow in planar_decompress_plane_rle · Advisory · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
从截图中可以获取以下关于漏洞的关键信息:
### 漏洞概览
- **漏洞类型**: Heap-buffer-overflow
- **影响组件**: `planar_decompress_plane_rle` 函数
- **严重性**: Medium
### 受影响版本及修复版本
- **受影响版本**: <= 3.20.2
- **已修复版本**: 3.21.0
### 漏洞详情
- **问题描述**: `freerdp_bitmap_decompress_planar` 函数在RLE解码之前没有验证 `nSrcWidth` 和 `nSrcHeight` 是否在 `planar->maxWidth` 和 `maxHeight` 范围内。
- **问题核心**: 缓冲区大小只在上下文重置时计算,导致 `freerdp_bitmap_planar_context_reset` 函数从 `maxWidth` 和 `maxHeight` 计算 `maxPlaneSize` 并重分配 `pTempData`、`rlePlanesBuffer` 和 `deltaPlanesBuffer`。
- **关键代码片段**:
- 缓冲区重分配代码:
```c
tmp = winpr_aligned_realloc(context->pTempData, context->maxPlaneSize, 6, 32);
if (!tmp)
return FALSE;
context->pTempData = tmp;
```
- 解码路径信任未经验证的维度,导致 `freerdp_bitmap_decompress_planar` 调用 `planar_decompress_plane_rle` 时基于 `nWidth` 和 `nHeight` 编写。
- 缺乏检查 `nSrcWidth` 和 `nSrcHeight` 是否在 `maxWidth` 和 `maxHeight` 范围内。
- 大小不匹配导致堆溢出。
### 证明概念 (PoC)
- **步骤**:
1. 发送具有更大 `width` 和 `height` 的 `CreateSurface`,确保表面尺寸超出 `maxWidth` 和 `maxHeight`。
2. 发送包含带有RLE标志和NA位设置的平面位图的 `WireToSurface1`,并确保位图头的 `width` 和 `height` 足够大,以使解码循环超越上下文缓冲区边界。
### 漏洞影响
- **潜在风险**: 恶意服务器可以触发客户端堆缓冲区溢出,导致崩溃(DoS)和潜在的堆损坏,存在代码执行风险,具体取决于分配器行为和堆布局。
标题: FreeRDP/libfreerdp/codec/planar.c at 38514dfa5813aa945a86cfbcec279033f8394468 · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_MISC
标题: FreeRDP/libfreerdp/codec/planar.c at 38514dfa5813aa945a86cfbcec279033f8394468 · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_MISC
标题: FreeRDP/libfreerdp/codec/planar.c at 38514dfa5813aa945a86cfbcec279033f8394468 · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_MISC
暂无评论