在分析CVE-2023-7105时,一个常见的技术问题是:当OpenSSH 8.9p1及以下版本在处理特定压缩数据包时,如何因未正确校验zlib流输入长度导致栈溢出?具体而言,在启用压缩功能的SSH连接中,攻击者能否通过构造恶意压缩数据包,在服务端解压过程中触发缓冲区越界写入,进而覆盖栈上变量或返回地址?该漏洞是否依赖特定编译选项(如WITH_ZLIB)和服务配置(如Compression yes)才能被利用?理解这一触发机制对评估实际攻击面和部署缓解措施至关重要。
1条回答 默认 最新
时维教育顾老师 2025-11-26 20:33关注一、漏洞背景与基本原理
CVE-2023-7105 是一个影响 OpenSSH 8.9p1 及更早版本的严重安全漏洞,其根本原因在于 zlib 压缩模块在处理压缩数据流时未能正确校验输入长度。当 SSH 服务端启用压缩功能(
Compression yes)并使用 zlib 库进行解压操作时,攻击者可构造特制的压缩数据包,在解压过程中触发栈缓冲区溢出。该漏洞位于
packet_read_compressed()函数中,该函数负责从网络读取加密后的 SSH 数据包,并在必要时调用 zlib 进行解压。若未对 zlib 流的输出长度进行边界检查,可能导致写入超出预分配栈空间的缓冲区,从而实现越界写入。二、技术触发机制深度剖析
- 客户端与服务端建立 SSH 连接,并协商启用压缩(compression algorithm: zlib@openssh.com)。
- 攻击者控制的客户端发送一个经过精心构造的 zlib 压缩流,该流在解压后会产生大量输出数据。
- 服务端调用
inflate()函数执行解压,将结果写入固定大小的栈上缓冲区(如 32KB 的临时 buffer)。 - 由于缺乏对解压后数据长度的有效验证,zlib 输出超过缓冲区容量。
- 越界写入覆盖相邻栈变量,可能包括函数返回地址、保存的寄存器或控制流关键标志位。
- 若攻击者能精确控制溢出内容和偏移,可劫持程序执行流,实现远程代码执行(RCE)。
三、依赖条件分析
依赖项 是否必需 说明 WITH_ZLIB 编译选项 是 必须启用 zlib 支持,否则压缩路径不编译进二进制 服务端配置 Compression yes 是 默认为 delayed,但部分部署显式设为 yes 客户端支持 zlib 压缩 是 攻击需通过合法协商进入压缩通信阶段 栈保护机制(如 Stack Canaries) 否 存在可增加利用难度,但非决定性防御 ASLR / DEP 否 现代系统通常开启,影响 exploit 稳定性 特权运行(root) 否 sshd 常以 root 启动,提升危害等级 四、代码级分析示例
static int packet_read_compressed(struct ssh *ssh) { u_char *buf; size_t len; z_stream *zstream = &ssh->zstream_in; // ... 初始化逻辑 ... buf = get_buffer(); // 栈上分配固定大小缓冲区 zstream->next_out = buf; zstream->avail_out = MAX_PACKET_SIZE; // 如 35000 字节 while ((r = inflate(zstream, Z_SYNC_FLUSH)) != Z_STREAM_END) { if (r == Z_BUF_ERROR || zstream->avail_out) break; // 缺少对 total_out 的上限检查! } len = zstream->total_out; // 危险:未限制 total_out ≤ MAX_PACKET_SIZE if (len > MAX_PACKET_SIZE) { fatal("decompressed length too large: %zu", len); } // 此处已发生越界写入,检查太晚 }五、攻击面评估与缓解策略
尽管该漏洞理论上允许远程代码执行,但实际攻击面受限于以下因素:
- 多数现代 OpenSSH 部署默认关闭即时压缩(使用
Compression delayed),仅在认证后启用,降低初始攻击窗口。 - 许多发行版在编译时仍包含 WITH_ZLIB,故不能忽略此风险。
- 容器化或非 root 运行的 sshd 实例受影响程度较低,但仍可能被用于横向移动。
六、缓解措施推荐清单
措施 实施方式 有效性 升级至 OpenSSH 9.0+ yum update openssh 或源码编译 高 禁用压缩功能 sshd_config 中设置 Compression no 高 启用 Control Flow Integrity 编译时加入 -fcf-protection 中 部署 eBPF 监控异常 inflate 调用 使用 bpftrace 检测长解压事件 中 限制 SSH 访问源 IP 防火墙规则或 TCP Wrappers 辅助 启用 Retpoline 或 IBT 内核与编译器协同防护 高(针对 ROP) 七、漏洞利用链流程图
graph TD A[建立SSH连接] --> B{协商压缩算法} B -- 使用zlib@openssh.com --> C[发送恶意压缩包] C --> D[服务端调用inflate()] D --> E[解压输出超出栈缓冲区] E --> F[覆盖返回地址或函数指针] F --> G[劫持控制流执行shellcode] G --> H[远程命令执行] B -- 未启用压缩 --> I[连接继续但无法触发]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报