SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

如您所知,飞地中执行的代码的功能受到严重限制。 它无法进行系统调用。 它不能执行 I/O 操作。 它不知道主机应用程序代码段的基地址。 它无法跳转或调用主机应用程序代码。 它不知道管理主机应用程序的地址空间结构(例如,映射了哪些页面或这些页面上位于哪些类型的数据)。 它不能要求操作系统将主机应用程序的一块内存映射到它(例如,通过 /proc/pid/maps)。 天真的尝试盲目地读取主机应用程序的任意内存区域,更不用说尝试写入,迟早(很可能是前者)会导致飞地程序的强制终止。 每当主机应用程序无法访问安全区请求的虚拟地址空间区域时,就会发生这种情况。

鉴于如此严酷的现实,病毒编写者是否能够利用 SGX 飞地来实现其恶意目标?

– 探测地址以查看它们是否可以被读取
– 探测地址的可写性的黑客攻击
– 重定向控制流的黑客
– 上面列出的三个黑客给恶棍带来了什么?
– 恶棍如何利用这些黑客手段来制造 ranzowari

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

基于以上所述,人们普遍认为飞地只能为宿主应用程序提供服务,而飞地不能行使自己的主动权,包括恶意的主动权。 这意味着飞地对于病毒编写者来说没有实际价值。 这种仓促的假设是 SGX 保护不对称的原因之一:主机应用程序代码无法访问 enclave 内存,而 enclave 代码可以读取和写入任何主机应用程序内存地址。

因此,如果恶意 enclave 代码能够代表主机应用程序进行任意系统调用、代表其执行任意代码、扫描主机应用程序的内存并在其中找到可滥用的 ROP 链,那么它就可以完全控制主机应用程序,从而隐形模式。 它不仅可以窃取和加密用户文件,还可以代表用户行事。 例如,代表他发送网络钓鱼电子邮件或进行 DoS 攻击。 即使是最现代的保护机制也无需担心,例如堆栈金丝雀和地址清理。

我们将向您展示攻击者用来克服上述限制的一些技巧,以利用 SGX 达到自己的恶意目的:ROP 攻击。 要么执行伪装成主机应用程序进程的任意代码(类似于恶意软件经常使用的进程空洞),要么伪装现成的恶意软件(以使其恶意软件免受防病毒和其他防御机制的迫害)。

黑客探测地址以查看它们是否可以被读取

由于飞地不知道主机应用程序可以访问虚拟地址空间的哪些范围,并且由于飞地在尝试读取不可访问的地址时被迫终止,因此攻击者面临着找到一种方法来故障排除的任务。宽容地扫描地址空间。 找到一种方法来映射可用的虚拟地址。 恶人通过滥用Intel的TSX技术来解决这个问题。 使用 TSX 的副作用之一:如果将内存访问函数置于 TSX 事务中,则 TSX 会抑制因访问无效地址而产生的异常,而不会到达操作系统。 如果尝试访问无效内存地址,则仅中止当前事务,而不是整个 enclave 程序。 那。 TSX 允许 enclave 安全地访问交易中的任何地址 - 没有崩溃的风险。

如果 指定地址可用 主机应用程序中,TSX 交易通常会成功。 在极少数情况下,它可能会因外部影响而失败,例如中断(例如调度程序中断)、缓存驱逐或多个进程同时修改内存位置。 在这些罕见的情况下,TSX 返回一个错误代码,指示故障是暂时的。 在这些情况下,您只需要重新启动事务即可。

如果 指定地址不可用 主机应用程序时,TSX 会抑制发生的异常(不通知操作系统)并中止事务。 错误代码将返回到 enclave 代码,以便它可以对事务已取消的事实做出反应。 这些错误代码表明相关地址对于主机应用程序不可用。

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

这种从 enclave 内部对 TSX 的操作对于恶棍来说有一个很好的功能:由于大多数硬件性能计数器在执行 enclave 代码时不会更新,因此不可能跟踪 enclave 内执行的 TSX 事务。 因此,操作系统完全看不到对 TSX 的恶意操纵。

此外,由于上述黑客攻击不依赖于任何系统调用,因此无法通过简单地阻止系统调用来检测或阻止; 这通常会给打击猎蛋行为带来积极的结果。

恶棍使用上述黑客技术在主机应用程序代码中搜索适合形成 ROP 链的小工具。 同时,他也不需要探查每一个地址。 从虚拟地址空间的每一页探测一个地址就足够了。 探测所有 16 GB 内存大约需要 45 分钟(在 Intel i7-6700K 上)。 结果,恶棍收到了适合构建 ROP 链的可执行页面列表。

探测地址可写性的黑客

要执行飞地版本的 ROP 攻击,攻击者需要能够搜索主机应用程序的可写未使用内存区域。 攻击者使用这些内存位置注入伪造的堆栈帧并注入有效负载(shellcode)。 最重要的是,恶意飞地无法要求主机应用程序为其自身分配内存,而是可以滥用主机应用程序已分配的内存。 当然,如果他能够在不摧毁飞地的情况下找到这些区域的话。

犯罪分子利用 TSX 的另一个副作用来进行搜索。 首先,和前面的情况一样,它会探测该地址是否存在,然后检查该地址对应的页面是否可写。 为此,攻击者使用以下技巧:他在 TSX 交易中放置一个写入函数,并在该函数完成后但在完成之前强行中止该交易(显式中止)。

通过查看 TSX 交易的返回码,攻击者可以了解该交易是否可写。 如果是“明显堕胎”,反派就会明白,如果他坚持下去,录音就会成功。 如果该页是只读的,则事务会以“显式中止”以外的错误结束。

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

TSX 的这种操纵还有另一个对恶棍有利的功能(除了无法通过硬件性能计数器进行跟踪之外):由于只有在事务成功时才会提交所有内存写入命令,因此强制事务完成可确保被探测的内存单元保持不变。

黑客重定向控制流

当从 enclave 执行 ROP 攻击时(与传统的 ROP 攻击不同),攻击者可以获得 RIP 寄存器的控制权,而无需利用被攻击程序中的任何错误(缓冲区溢出或类似的情况)。 攻击者可以直接覆盖存储在堆栈上的RIP寄存器的值。 特别是,它可以用自己的 ROP 链替换该寄存器的值。

但是,如果 ROP 链很长,则覆盖主机应用程序堆栈的大部分可能会导致数据损坏和意外的程序行为。 试图秘密实施攻击的恶棍对这种状况并不满意。 因此,它为自己创建一个假的临时堆栈帧并将其 ROP 链存储在其中。 伪造的堆栈帧被放置在随机可写内存位置,而真实的堆栈完好无损。

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

上面列出的三个黑客给恶棍带来了什么?

(1)首先,恶意飞地通过 hack 探测地址以查看它们是否可以读取, – 在主机应用程序中搜索可滥用的 ROP 小工具。

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

(2) 然后由 hack 用于探测地址的可写性, – 恶意飞地识别主机应用程序内存中适合注入有效负载的区域。

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

(3) 接下来,Enclave 从步骤 (1) 中发现的 gadget 创建一条 ROP 链,并将该链注入到主机应用程序堆栈中。

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

(4) 最后,当主机应用程序遇到上一步中创建的 ROP 链时,恶意负载开始执行 - 具有主机应用程序的权限和进行系统调用的能力。

恶棍如何利用这些黑客手段来制造 ranzowari

主机应用程序通过 ECALL 之一将控制权转移到 enclave 后(不怀疑该 enclave 是恶意的),恶意 enclave 会在主机应用程序的内存中搜索可用空间以注入代码(将这些单元序列视为可用空间)充满零)。 然后通过 hack 探测地址以查看它们是否可以读取, – enclave 在主机应用程序中搜索可执行页面并生成一个 ROP 链,该链在当前目录中创建一个名为“RANSOM”的新文件(在真正的攻击中,enclave 会加密现有的用户文件)并显示勒索消息。 同时,主机应用程序天真地认为飞地只是将两个数字相加。 这在代码中看起来是什么样的?

为了便于理解,我们通过定义介绍一些助记符:

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

我们保存RSP和RBP寄存器的原始值,以便在执行有效负载后恢复主机应用程序的正常操作:

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

我们正在寻找合适的堆栈框架(请参阅“重定向控制流的黑客”部分中的代码)。

寻找合适的 ROP 小工具:

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

找到注入有效负载的地方:

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

我们构建一条ROP链:

SGX 恶意软件:恶棍如何利用英特尔新技术实现其预期目的以外的目的

这就是英特尔旨在对抗恶意程序的 SGX 技术被恶棍利用以达到相反目标的方式。

来源: habr.com

添加评论