ExSpectre: Hiding Malware in Speculative Execution

Specture和Meltdown允许CPU执行非预期计算并通过侧信道泄漏信息。

本篇文章提出了ExSpectre利用预测执行将恶意软件从静态分析和动态分析中隐藏起来,这种技术可以隐藏恶意软件的关键代码,并利用预测执行累积变化,最终造成现实世界的行为。

本文学习了可以通过预测执行的代码类型和程度,并找到了几种可以隐藏执行的代码。其中包括AES,可以以超过11kbps的速度加解密,基于此,文本提出了一个自定义虚拟机来进行任意现实世界中的任意计算和系统调用。并写出POC,只需要几毫秒执行代码。还展示了如何成为系统的良性程序,以及如何通过OpenSSL远程触发。

ExSpectre提出了一种新的逃避已有分析技术的恶意软件,因为它包含似乎不可达的代码,成为了恶意软件分析技术的一种新的威胁

介绍

现代CPU都会采用预测执行来提高指令吞吐量,在执行较慢指令时执行其他指令,如果猜测是正确的,则性能提高;如果错误则丢弃错误结果即可。

一般来说CPU中错误预测结果是不可见的,因为CPU中对于预测结果和状态更新有严格的区分。然而,有两种方法通过侧信道得到预测结果。Spectre漏洞可以让攻击者从受害进程的错误预测分支中泄漏信息;Meltdown允许使用预测结果从内核中读取未授权内存页面错误回避内存来泄漏信息。目前有很多Spectre的变种,包括预测缓存溢出,预测存储绕过,缓存侧可选侧信道。也有几种针对Intel SGX的攻击,还可以进行远程泄漏攻击。

现有的恶意软件逃逸方法像加壳、代码加密等,都可以通过符号执行代码覆盖率fuzz这种技术反击,从而找到正确的行为。ExSpectre提供了一种技术,隐藏恶意软件功能,在运行时没有执行,实际执行了,可以对抗静态分析和动态分析。恶意软件分析人员不知道二进制程序会做什么。

方法

本文探索了利用预测利用预测执行隐藏计算的方法,产生让现有逆向工程方法变难的二进制程序。由于预测部分代码从来没有真正执行过,即使是通过硬件调试器和软件模拟器捕获的完整trace,也无法捕获预测执行的逻辑。这样可以让复杂的恶意软件同时在静态分析和动态分析中隐藏行为。

ExSpectre分成两部分:

  • Payload程序

  • Trigger:特殊输入形式或同一系统运行的不相关的程序。如果没有触发器,Payload程序就执行一系列正常操作,维护一个基于缓存的侧信道。一旦Trigger激活,激活因子可能是攻击者精心构造的输入,也可能是Trigger程序运行,会让CPU从Payload程序中一个新的目标地址运行

目标地址可以是不可读不可执行的,导致逻辑上这一块就是死代码,可以对抗动静态分析。CPU发现预测错误的时候,会丢弃结果继续执行,但是这给payload程序留下一个预测窗口,可以用于通过侧信道执行任意计算。图1展示了Trigger程序误导CPU的间接分支预测器,导致Payload程序执行隐藏函数。

触发器可以是外部程序,本文展示了使用OpenSSL,利用特定的加密套件向被感染主机发送TLS连接。

也可以不使用触发器,而是使用Payload,让Payload程序预测攻击者期望的地址,那么就无法通过静态分析和动态分析从Payload中推断出输入和行为。

对于逆向工程师来说,模拟或模型化预测ExSpectre执行路径是很难的

  • 必须逆向目标CPU的精确特性,包括分支预测器,缓存器,乱序执行,超线程,系统进程调度算法,并且必须有所有ExSpectre变种的模型

  • 必须通过模拟器运行所有潜在的触发器程序,包括带有现实世界输入的正常程序。这两种情况都会导致耗费大量时间

本文实现了几个Payload程序和Trigger变种,发现预测窗口大小主要取决于CPU的重序缓存大小,现代Intel CPU最多可以执行200条指令。虽然比较少,但是本文也展示了如何在短步骤执行并将有效结果传达到现实世界。利用这个特性可以实现通用图灵机。

结果

本文基于预测指令集实现了一个反向shell,展示了通过ExSpectre的可行性。