RCE 总是可以利用崩溃吗?

信息安全 开发 脆弱性 研究 模糊测试
2021-08-22 07:24:54

阅读团队撰写的使用模糊测试寻找漏洞的论文,我注意到许多人将崩溃标记为 DoS 漏洞。而在其他论文和研究中,他们在崩溃后更深入,并试图利用它来获得 RCE。

我的问题是是否所有与内存相关的崩溃都会导致 RCE 或者有一些特权,他们甚至没有尝试。

2个回答

除了拒绝服务 (DoS) 之外,许多崩溃都无法被利用。最常见的示例是读取 NULL 指针;试图取消引用指向(或任何接近)0 的指针将失败,除非异常/信号被捕获,否则将导致程序崩溃。然而,仅仅因为程序在给定无效输入时尝试从零读取并不意味着如果给定不同的无效输入,它会做任何更令人兴奋的事情。

确定崩溃的可利用性很棘手。您可以使用一些启发式方法(写入通常比读取更糟糕,如果指令指针指向不可执行的代码 - 违反 NX/DEP - 这几乎肯定是可利用的,如果读取的是空指针,那么这不太可能是可利用)但它们并不完全准确。有一些工具可以分析故障转储并尝试为您猜测(例如,Microsoft 为windbg将执行此分析的 Windows 调试器发布了“!exploitable”命令;Linux 调试器也有类似的工具)。要确定,你需要分析导致内存损坏的程序流程,看看你对它有多大的影响,以及你是否可以让它做任何真正危险的事情。

考虑由尝试访问内存位置0x0(即空指针取消引用)引起的段错误。

也许代码的一部分认为它是用一个变量完成的,并将指针设置为 null,也许在正常操作下它确实是用它完成的,但是模糊测试发现了一些边缘情况,在它之后尝试再次读取该变量被设置为空。

这肯定会导致崩溃,因为您的应用程序正在尝试读取内核内存,而内核对此很生气,但不允许您执行任何类似 RCE 的操作。