libssh2 CVE-2026-55200:整数溢出导致的远程代码执行漏洞(POC已公开)

导语:著名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_lenauth_len 相加写入了 total_num

2.2 整数溢出的精确计算

当攻击者发送 packet_length = 0xffffffff(32位无符号整数的最大值)、mac_len = 0auth_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服务器,等待目标连接并发送畸形数据包,即可触发堆溢出获得代码执行权限。无需用户交互,攻击路径被动且隐蔽。


六、修复建议

  1. 升级libssh2:升级到官方发布的最新版本(≥ 1.11.2),或应用上游commit 97acf3df 中的修复补丁
  2. 网络层防护:在边界防火墙对SSH流量进行适度异常检测,标记非标准长度的数据包
  3. 限制出站SSH连接:特别是自动连接未知SSH服务器的场景
  4. 关注供应链:确认所用工具的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

版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容