普通网友 2025-11-26 20:30 采纳率: 98.7%
浏览 2
已采纳

CVE-2023-7105如何触发栈溢出漏洞?

在分析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 流的输出长度进行边界检查,可能导致写入超出预分配栈空间的缓冲区,从而实现越界写入。

    二、技术触发机制深度剖析

    1. 客户端与服务端建立 SSH 连接,并协商启用压缩(compression algorithm: zlib@openssh.com)。
    2. 攻击者控制的客户端发送一个经过精心构造的 zlib 压缩流,该流在解压后会产生大量输出数据。
    3. 服务端调用 inflate() 函数执行解压,将结果写入固定大小的栈上缓冲区(如 32KB 的临时 buffer)。
    4. 由于缺乏对解压后数据长度的有效验证,zlib 输出超过缓冲区容量。
    5. 越界写入覆盖相邻栈变量,可能包括函数返回地址、保存的寄存器或控制流关键标志位。
    6. 若攻击者能精确控制溢出内容和偏移,可劫持程序执行流,实现远程代码执行(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[连接继续但无法触发]
        
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月27日
  • 创建了问题 11月26日