有很多可用的答案详细说明了防病毒和反恶意软件程序的工作原理,包括有关签名、启发式、沙盒等的详细信息。但是,关于反漏洞利用程序(例如 EMET、MBAE 和HitmanPro.Alert)实际上检测和防止漏洞。
如果不将调试器附加到进程,在漏洞利用期间实际发生的操作似乎几乎不可能检测到,这似乎会产生不可接受的性能影响。
反漏洞利用程序用于检测和缓解漏洞利用尝试的不同方法是什么?
有很多可用的答案详细说明了防病毒和反恶意软件程序的工作原理,包括有关签名、启发式、沙盒等的详细信息。但是,关于反漏洞利用程序(例如 EMET、MBAE 和HitmanPro.Alert)实际上检测和防止漏洞。
如果不将调试器附加到进程,在漏洞利用期间实际发生的操作似乎几乎不可能检测到,这似乎会产生不可接受的性能影响。
反漏洞利用程序用于检测和缓解漏洞利用尝试的不同方法是什么?
我将根据我对CBMC 编译器的经验来回答这个问题。我从未使用过HitmanPro、 malwarebytes anti-exploit或Microsoft 的 EMET,但我看不出他们有什么理由会做与 CBMC 完全不同的事情。
如果我们查看恶意软件字节反漏洞利用视频(由 OP 友情研究),我们会发现 MBAE 可以通过识别下载的恶意文件来找到漏洞利用。这正是现代反病毒程序的工作方式:它检查已知恶意软件的签名(或“利用有效负载”,如果你想这样称呼它)并在匹配时停止执行。
在这种特定情况下,我们可以争辩说 Anti-Exploit 只是一个反病毒程序的重新命名。从理论上讲,您可以争辩说 AV(反病毒)仅检查文件的签名,而 AE(反漏洞利用)检查有效负载(例如,在下载文件时)您也可以争辩说 AE 搜索 CVE,而 AV 搜索恶意软件签名. 但所有现代 AV 都执行所有这些:它们会在 CVE 出现时进行更新,它们会检查网络流量(下载的文件)的签名,并且它们会实时进行。所以我会争辩说,从那个视频中,我们可以得出结论,AE 只是重新命名的 AV。
然而,还有更多:AE 承诺能够找到零日漏洞。这将与 AV 不同。
如果不运行程序,您将无法在程序中找到零日漏洞利用。但是运行一个狡猾的程序是不明智的。这是因为,如果运行时环境中存在可利用点,则运行程序可能会利用该漏洞。沙盒是一种选择,但沙盒通常会违反他们的赢家。那么,我们如何在不执行程序的情况下执行程序呢?象征性的执行救援。
正如我在答案开头所说的那样,我将使用 CBMC,这是我过去某个时候需要的工具。它执行符号执行,但它是一种研究工具。没有人真正认为符号执行可以发现程序可能存在的所有问题。
CBMC 是一个 C 编译器(也有 VHDL 的商业版本),它不会将程序编译成机器代码。相反,它将程序编译成一种称为 GOTO 的语言,它是程序的简化符号表示。然后使用 GOTO 处理器(CBMC 的一部分)来运行程序的符号表示。
符号表示更容易推理,并且可以在输入范围广泛的情况下运行程序。例如,CBMC/GOTO 在 C 程序中很好地捕捉到的一件事是缓冲区溢出。
现在,CBMC 在 C 和 VHDL 程序上工作,但同样可以用汇编来完成。虽然它不如从源代码构建符号表示准确(因为反汇编并不完美),但它允许执行程序的符号表示并检查编码错误。
缓冲区溢出是人们认为可以在程序集中找到的最简单的事情,但其他可能性可能包括未经检查的输入(至少在 CBMC 中以符号表示形式跟踪输入)或打开网络套接字(因为它是已知的系统调用)。
免责声明:我不知道 AE 是如何实际构建的,但如果我必须构建可以自动找到零日漏洞利用的东西,那么我会尝试符号执行。符号执行并非没有问题(开放研究社区知道,一些未公开的来源可能已经找到了其中一些的解决方案):
反漏洞利用程序使用不同的方法。如果您知道漏洞利用的工作原理以及它使用什么样的漏洞利用技术(ROP、堆喷射等),那么就很容易理解反漏洞利用产品。
我们以“堆喷射”为例。这是维基百科的定义;“一般来说,喷射堆的代码试图将某个字节序列放在目标进程内存中的预定位置,方法是让它在进程的堆上分配(大)块,并用正确的方法填充这些块中的字节价值观。”
如果您查看堆喷射漏洞,大多数情况下它们会将内存喷射到更高的地址,然后将易受攻击的程序的执行更改为可预测的地址,例如“0x0c0c0c0c”。是的,这种地址实际上是我们在浏览器中借助 Javascript 分配/喷射的内存中的预定位置。
那么反漏洞利用程序如何防止这种情况呢?这是一个非常简单且常用的方法;假设您想保护 Firefox 免受堆喷射攻击。每当 Firefox 进程启动时,您可以将自己注入其中,然后您可以在 Firefox 中预先分配这些常见的堆喷射地址(0x0c0c0c0c)。因此,如果使用常见可预测地址(0x0c0c0c0c、0a0a0a0a 等)的堆喷射漏洞利用将无法对抗受保护的 firefox 进程。预先分配地址的简单 API 调用;VirtualAlloc(SprayAddress, 0x400, MEM_RESERVE,PAGE_NOACCESS)
这只是反漏洞程序如何工作的一个基本示例。当然,还有更复杂的方法和技术用于防止其他利用方法。