🔴 严重 | CVE-2026-64621 — FreeRDP before 3.28.0 (affected 3.x through 3.27.1...
🔴 【深度分析】严重安全漏洞:CVE-2026-64621
CVSS 评分: 严重(9.3)🔴 状态: Undergoing Analysis 发布时间: 2026-07-20
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-64621 |
| CVSS 评分 | 9.3 🔴 |
| 严重程度 | 严重 |
| CVSS 向量 | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X |
| CWE 分类 | CWE-415 |
| 发布时间 | 2026-07-20 |
| 最后更新 | 2026-07-23 |
| 状态 | Undergoing Analysis |
| 数据来源 | disclosure@vulncheck.com |
CVSS 评分:9.3(严重)
CVSS 向量: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
危害等级: 紧急(Critical)
CWE: CWE-415(双重释放 Double Free)
漏洞概述
FreeRDP 是一款广泛使用的远程桌面协议(RDP)开源实现,支持多种客户端(如 xfreerdp、sdl-freerdp、wlfreerdp)。在 3.28.0 之前的 3.x 版本(受影响范围 3.0.0 ~ 3.27.1)中,freerdp_client_rdp_file_apply_to_settings() 函数(位于 client/common/file.c)在处理 .rdp 连接文件中的 selectedmonitors 字段时存在 双重释放(double-free) 漏洞。攻击者可通过诱骗用户打开特制的 .rdp 文件,触发可控大小的堆内存二次释放,进而可能导致拒绝服务、内存损坏甚至远程代码执行。该漏洞影响所有 FreeRDP CLI 客户端,且无需特殊配置即可触发。
受影响组件与版本
| 组件 | 受影响版本范围 | 修复版本 |
|---|---|---|
| FreeRDP | 3.x(3.0.0 至 3.27.1 包含) | 3.28.0 |
| 客户端程序 | xfreerdp、sdl-freerdp、wlfreerdp | 3.28.0 |
注意:FreeRDP 2.x 分支不受影响,漏洞仅存在于 3.x 系列。
漏洞原理分析
触发路径
漏洞位于 FreeRDP 的 RDP 连接文件解析逻辑中。当用户使用 xfreerdp /myfile.rdp 等方式加载 .rdp 文件时,解析函数会顺序处理文件中的各个字段。其中,selectedmonitors 字段用于指定会话使用的显示器 ID 列表,其值以逗号分隔的数字形式表示,例如 selectedmonitors:s:0,2,3。
解析过程中,freerdp_client_rdp_file_apply_to_settings() 函数会调用 strtoul 逐个转换令牌为整数,并存储到动态分配的 MonitorIds 数组中。该数组的生命周期由 FreeRDP 的 settings 对象(rdpSettings)管理。
双重释放的成因
在解析过程中,若某个数字令牌转换失败(例如 strtoul 返回错误或遇到不合法的字符),代码会进入错误处理路径,该路径释放了之前已分配的 MonitorIds 数组。然而,错误处理代码未将 settings->MonitorIds 指针置为 NULL,导致该指针成为悬垂指针(dangling pointer)。随后,在正常的资源清理阶段(freerdp_settings_free())会再次释放同一个缓冲区,从而触发 双重释放(double-free)。
具体流程如下:
settings->MonitorIds指向一块动态分配的内存(大小为nMonitorIds * sizeof(UINT32))。- 解析时遇到过大或非法的 monitor token,
strtoul返回错误,进入错误路径。 - 错误路径调用
free(settings->MonitorIds)释放该内存,但 未将settings->MonitorIds置为 NULL。 - 后续解析继续执行(或跳过错误后继续),最终函数返回。
- 当该 RDP 连接会话结束,
freerdp_settings_free()被调用,该函数会再次释放settings->MonitorIds(此时指向已释放内存),导致 double-free。
攻击向量
攻击者可以构造一个包含超大或非法 monitor tokens 的 .rdp 文件(例如 selectedmonitors:s:999999 或非数字字符),并诱骗受害者使用 FreeRDP 客户端打开该文件。触发 double-free 后,攻击者可能利用堆管理器的行为来覆盖关键数据结构,进而实现代码执行或信息泄露。由于 double-free 的大小由攻击者通过 monitor tokens 数量控制(决定了 MonitorIds 数组的大小),因此该漏洞具有可控大小的堆内存操作能力,增强了利用潜力。
影响评估
利用难度分析(基于 CVSS 4.0 向量)
| 维度 | 值 | 解释 |
|---|---|---|
| 攻击向量 (AV) | 网络 (N) | 攻击者可通过网络传递恶意 .rdp 文件(如邮件、下载链接) |
| 攻击复杂度 (AC) | 低 (L) | 无需特殊技巧,只需构造符合格式的文件即可触发 |
| 攻击前提 (AT) | 无 (N) | 无需绕过任何安全机制 |
| 权限要求 (PR) | 无 (N) | 无需任何认证或授权 |
| 用户交互 (UI) | 无 (N) | 根据 CVSS 定义,用户在打开文件时的操作不计入“用户交互”?此处向量为 N,但实际利用仍需用户主动打开文件,属于典型的 social engineering 场景,实际难度略高于向量表述 |
| 机密性/完整性/可用性 (C/I/A) | 高 (H) | 成功利用可导致完全控制受影响进程的内存状态,可致信息泄露、数据篡改或服务崩溃 |
综合评价:尽管 CVSS 4.0 向量中 UI 为 N(通常表示无需用户交互),但实际攻击链中攻击者必须诱导用户打开恶意文件。这一社会工程学步骤是唯一的门槛。一旦用户打开文件,攻击者即可在低复杂度下触发 double-free。由于 double-free 的堆块大小可控,且现代堆管理器(如 glibc ptmalloc)中针对 double-free 的防护机制(如 tcache 的 key 检查)可能被绕过,因此该漏洞具备 远程代码执行(RCE) 的潜力。
实际威胁场景
- 针对性攻击:通过钓鱼邮件或即时通讯工具发送恶意
.rdp文件,诱导运维人员或远程办公用户使用 FreeRDP 客户端打开。 - 横向移动:在内网环境中,攻击者可能篡改共享的 RDP 配置或文件服务器上的
.rdp文件,批量影响多个用户。 - 提权与持久化:在受影响的主机上,若 FreeRDP 以高权限运行,漏洞利用可能实现特权提升。
修复建议
官方补丁
- 更新至 FreeRDP 3.28.0 或更高版本。该版本已在
freerdp_client_rdp_file_apply_to_settings()中修正了错误处理逻辑,确保释放后清除指针,同时添加了额外的输入验证。 - 下载地址:https://github.com/FreeRDP/FreeRDP/releases/tag/3.28.0
临时缓解措施
如果无法立即升级,可采取以下措施降低风险:
- 限制 .rdp 文件来源:仅接受来自可信来源的配置文件,并教育用户不要打开未知或可疑的
.rdp文件。 - 启用输入验证:在 Firewall 或 IDS/IPS 层面过滤包含异常大的
selectedmonitors字段的 RDP 文件(例如令牌超过合理范围)。 - 使用沙箱或容器:在隔离环境中运行 FreeRDP 客户端,减少漏洞利用对主机的直接影响。
- 监控堆异常:部署内存安全检测工具(如 AddressSanitizer)辅助发现利用尝试。
参考资料
- CVE 详情页:https://nvd.nist.gov/vuln/detail/CVE-2026-64621
- FreeRDP 官方公告:https://github.com/FreeRDP/FreeRDP/releases/tag/3.28.0
- CWE-415 双重释放:https://cwe.mitre.org/data/definitions/415.html
- CVSS 4.0 规范:https://www.first.org/cvss/v4-0/cvss-v40-specification.pdf
- 漏洞发现者:disclosure@vulncheck.com(VulnCheck 团队披露)
声明:本分析基于 NVD 提供的公开数据及漏洞描述编写,技术细节以 FreeRDP 官方修复补丁和实际代码审计为准。若后续分析阶段提供更多信息,本文可能更新。