# update_pointer_new 堆使用后释放漏洞
## 概述
FreeRDP 在 `xf_Pointer_New` 函数中存在双重释放漏洞,导致使用 ASan 时触发 Use-After-Free(UAF)。恶意服务器可利用此漏洞在客户端触发崩溃(拒绝服务),并可能导致堆内存损坏,存在潜在的代码执行风险。
## 影响版本
3.21.0 之前的所有版本。
## 细节
`xf_Pointer_New` 在失败路径中会释放 `cursorPixels`,随后 `pointer_free` 调用 `xf_Pointer_Free` 再次释放同一内存,造成双重释放。
## 影响
恶意 RDP 服务器可诱导客户端触发该 UAF,导致程序崩溃(DoS)、堆内存损坏,具体危害取决于内存分配器行为和堆布局,可能进一步导致远程代码执行。
是否为 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-use-after-free in update_pointer_new · Advisory · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
### 关键信息总结
**漏洞概要**
- **类型**: Heap-use-after-free
- **CVE ID**: CVE-2026-23883
- **CWE**: CWE-416
- **严重性**: Moderate
**影响版本**
- 受影响版本: <= 3.20.2
- 已修复版本: 3.21.0
**漏洞描述**
- `xf_Pointer_New` 在`freerdp_image_copy_from_pointer_data`调用失败时释放`cursorPixels`,之后在`pointer_free`调用`xf_Pointer_Free`再次释放`cursorPixels`,触发UAF。
**漏洞细节**
- **xf_Pointer_New**:
```c
if (!freerdp_image_copy_from_pointer_data(
(BYTE*)xpointer->cursorPixels, CursorFormat, 0, 0, 0, pointer->width, pointer->height,
pointer->xorMaskData, pointer->lengthXorMask, pointer->andMaskData, pointer->lengthAndMask,
pointer->xorBpp, &context->gdi->palette))
{
winpr_aligned_free(xpointer->cursorPixels);
goto fail;
}
```
- **update_pointer_color**:
```c
if (!IFCALLRESULT(TRUE, pointer->New, context, pointer))
goto out_fail;
if (!pointer_cache_put(cache->pointer, pointer_color->cacheIndex, pointer, TRUE))
goto out_fail;
return IFCALLRESULT(TRUE, pointer->Set, context, pointer);
out_fail:
pointer_free(context, pointer);
return FALSE;
```
- **xf_Pointer_Free**:
```c
winpr_aligned_free(xpointer->cursorPixels);
```
**影响**
- 恶意服务器可以触发客户端堆使用后释放,导致崩溃(DoS)和潜在的堆损坏,存在代码执行风险,取决于分配器行为和相邻堆布局。
标题: FreeRDP/client/X11/xf_graphics.c at 3370e30e92a021eb680892dda14d642bc8b8727c · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
从这个网页截图中,可以获取到以下关于漏洞的关键信息:
- 代码修改记录显示一个提交是关于修复格式字符串问题的,这可能表明之前存在一个潜在的格式字符串漏洞,该漏洞可能被利用来执行任意代码或导致程序崩溃。提交信息中提到“fix wlog format string to match arguments”,这表明修复了日志函数`wlog`中的格式字符串问题,使其与参数匹配。
- 文件`client/x11/xf_graphics.c`包含与绘图和颜色解码相关的代码。虽然在截图中没有直接显示漏洞,但与图形处理和颜色格式相关的复杂代码可能隐藏着缓冲区溢出、整数溢出或其他类型的漏洞,特别是在处理用户输入或网络数据时。
- 代码中使用了多种颜色格式(如`PIXEL_FORMAT_RGBA32`、`PIXEL_FORMAT_BGRX32`等),并且在处理这些格式时进行了一些转换和分配操作。如果这些转换和分配操作没有正确处理边界条件或输入验证,可能会导致内存安全问题,例如缓冲区溢出或未初始化内存访问。
- 虽然截图中没有显示具体的漏洞,但是可以推测出,如果`xf_graphics.c`文件中存在漏洞,可能是由于以下原因:
- **格式字符串漏洞**:在修复之前存在的`wlog`函数格式字符串问题。
- **缓冲区溢出**:在处理图形数据、颜色转换或分配内存时,如果没有正确处理边界条件,可能会导致缓冲区溢出。
- **内存管理问题**:在分配和释放内存时,如果没有正确处理,可能会导致内存泄漏或双重释放问题。
- **整数溢出**:在计算图形数据大小或索引时,如果没有正确处理整数溢出,可能会导致意外的行为或安全问题。
请注意,这只是一个基于代码结构和功能的推测,实际的漏洞需要通过详细的代码分析和安全测试来确认。
标题: FreeRDP/client/X11/xf_graphics.c at 3370e30e92a021eb680892dda14d642bc8b8727c · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
## 关键漏洞信息
- **文件路径**: `FreeRDP/client/X11/xf_graphics.c`
- **提交信息**:
- 作者: akallabeth
- 提交时间: 4天前
- 提交ID: 884887d
- 修改内容: 修复了printf的格式字符串错误,以匹配参数。
- **代码问题**:
- **潜在内存泄漏**: 在`xf_Pointer_GetCursorForCurrentScale`函数中,如果没有成功分配内存(例如通过`realloc`),可能引起内存泄漏。
- **错误处理**: 多处错误处理直接使用`return FALSE;`,缺乏对错误原因的详细记录。
- **权限和环境变量**:
- 使用了`X11`、`xf_utils.h`、`xf_event.h`等头文件,需要注意这些依赖的版本和环境配置。
这些信息提示可能存在内存管理不当和错误处理不完全的问题,需要进一步审查和验证。
标题: FreeRDP/libfreerdp/cache/pointer.c at 3370e30e92a021eb680892dda14d642bc8b8727c · FreeRDP/FreeRDP · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
### 关键漏洞信息总结
#### 1. 漏洞类型
- **越界访问**或**内存管理错误**:在处理指针和内存分配时,可能存在越界访问或内存泄露等问题。
#### 2. 潜在问题代码
- **行 323-335**:涉及内存分配和指针操作,可能存在内存管理不当。
```c
if (lengthAndMask > UINT32_MAX)
return FALSE;
pointer->lengthAndMask = (UINT32)lengthAndMask;
```
- **行 640-652**:涉及指针操作和内存分配,可能存在越界访问。
```c
if (lengthXorMask > UINT32_MAX)
return FALSE;
pointer->lengthXorMask = (UINT32)lengthXorMask;
```
#### 3. 影响范围
- **FreeRDP库中与指针处理相关的部分**:该代码片段主要涉及指针和内存管理,影响范围广泛,可能影响到使用FreeRDP库的所有相关应用。
#### 4. 修复建议
- **加强边界检查**:在内存分配和指针操作处增加严格边界检查,确保不会越界访问。
- **内存释放检查**:在释放内存时,确保所有相关指针和内存块都被正确释放,避免内存泄露。
- **使用现代化内存管理工具**:考虑使用如valgrind等工具进行内存管理调试,确保代码健壮性。
#### 5. 其他注意事项
- **代码审查**:定期进行代码审查,特别是涉及内存管理和指针操作的代码段。
- **单元测试**:增加相关单元测试用例,确保在各种边界条件下代码的正确性。
```
这些关键信息表明,在处理指针和内存相关操作时,需要特别注意边界检查和内存释放,以避免潜在的安全漏洞。
暂无评论