最近 Qualys公司 (一家专注于云安全的科技公司) 广为人知 你发现了什么 一种绕过 malloc 的方法 和双重保护以使用 OpenSSH 9.1 中的漏洞启动交叉。
到目前为止,已经确定 这种脆弱性只是“理论上的”, 因为它不太可能创建有效的漏洞。 与此同时,创建有效漏洞利用的可能性仍然是一个大问题。
关于漏洞,有人提到 绕过保护的技巧 double free 并在 malloc 释放后使用 就是重新分配被占用的内存 通过 options.kex_algorithms 一旦它是免费的。
从 malloc 的角度来看,不会尝试释放、读取或写入已经空闲的内存; 然而,从 sshd 的角度来看,会发生别名攻击,因为指向两个不同对象的两个不同指针指向同一块内存,并且对一个对象的写入会覆盖另一个对象。
这打开了一个充满可能性的世界。
我们开始调查 Debian 书虫(它使用 glibc 代码
malloc),但我们最终切换到 OpenBSD 7.2,因为 OpenBSD
malloc(尽管它的防御性很强的编程)有两个特性
让它对这个特别的免费双重错误特别有趣:
该漏洞是由于双重释放 预认证阶段的内存区域。 为漏洞创造条件, 只需更改 SSH 客户端的横幅 到“SSH-2.0-FuTTYSH_9.1p1”(或另一个旧的 SSH 客户端)来实现设置“SSH_BUG_CURVE25519PAD”和“SSH_OLD_DHGEX”标志设置这些标志后,“options.kex_algorithms”缓冲区的内存被释放两次。
Qualys 研究人员,在漏洞操纵过程中, 能够控制处理器寄存器“%rip”, 包含指向要执行的下一条语句的指针的 。 开发的漏洞利用技术允许将控制权转移到过时的 OpenBSD 7.2 环境中 sshd 进程地址空间中的任何点,该环境默认随 OpenSSH 9.1 一起提供。
快速更新:我们能够任意控制“rip” 通过这个错误(即我们可以在 sshd 的任何地方跳转 地址空间)在未打补丁的 OpenBSD 7.2 安装(运行
默认情况下为 OpenSSH 9.1)。 这绝不是故事的结局:这个电子对于第 1 步,跳过 malloc 和双重保护。下面 可能根本不可行的步骤是:
– 第 2 步,不顾 ASLR、NX 和 ROP 执行任意代码
保护(这可能需要信息泄露,要么
同一个错误或次要错误);– 第 3 步,逃离 sshd 沙箱(通过一个小错误,要么在
特权父进程或减少内核攻击
肤浅)。
值得注意的是,所提出的原型只是攻击第一阶段的实施: 要创建有效的漏洞,您需要绕过 ASLR、NX 和 ROP 保护机制,并突破沙箱隔离,这是不太可能的。
解决绕过ASLR、NX和ROP的问题需要获取地址信息,这可以通过识别导致信息泄露的另一个漏洞来完成。 特权父进程或内核进程中的错误可以帮助突破沙箱。
提到该漏洞的工作方式如下:
- -首先,在 compat_kex_proposal() 中释放 options.kex_algorithms,假装 ssh 客户端是一个旧的“FuTTY”客户端。
- - 其次,重新分配options.kex_algorithms占用的片段,结构为EVP_AES_KEY,大小为264字节,在密钥交换阶段选择“aes128-ctr”密码。 这种重新分配的发生概率约为 1/32。
- – 第三,在 kex_assemble_names() 中(通过 mm_getpwnamallow())(再次)释放被 options.kex_algorithms 占用的块(现在被 EVP_AES_KEY 结构占用)。 当且仅当块的第一个字节是“+”、“-”或“^”时才会发生这种情况(否则 kex_assemble_names() 返回错误并调用 fatal_fr())。
- – 第四,被 options.kex_algorithms 占用的块(现在仍然被引用为 EVP_AES_KEY 结构)被重新分配,一个 300'A' 字节的字符串,“authctxt->user”或“authctxt ->style”在认证阶段。 这种重新分配以约 2/32 的概率发生,它有效地用“A”字节覆盖了整个 EVP_AES_KEY 结构。
- – 最后,当 sshd 调用 EVP_Cipher() 时,它跳转到 0x4141414141414141,因为 EVP_AES_KEY 结构包含一个函数指针,该指针被我们的“A”字节覆盖并由 CRYPTO_ctr128_encrypt_ctr32()(通过 EVP_Cipher())调用。
最后,如果你有兴趣了解更多,可以咨询详情 在下面的链接中。