如您所知,安全区中执行的代码在功能上受到严重限制。 他无法拨打系统电话。 它无法执行I / O操作。 他不知道主机代码段的基地址。 它不能跳转并调用主机代码。 他对引导主机应用程序的地址空间的结构一无所知(例如,提升了哪些页面或在这些页面上放置了哪种数据)。 他不能要求操作系统向主机应用程序添加一块内存(例如,通过/ proc / pid / maps)。 天真地尝试读取主机应用程序的盲目的任意内存区域(更不用说写尝试了),迟早(而不是第一次)都会导致安全区程序的强制完成。 每当主机应用程序无法访问安全区请求的虚拟地址空间区域时,就会发生这种情况。
面对如此严酷的现实,病毒编写者是否能够使用SGX安全区来实现其恶意目标?
-破解探测地址的可能性
-黑客探索地址的可写性
-Hack重定向控制流
-是什么使恶棍上面列出的三个技巧
-恶棍如何利用这些hack来创建ranzomvari

基于以上所有内容,通常认为安全区域仅能够为主机应用程序提供服务,并且安全区域无法主动采取行动,包括恶意攻击。 这意味着飞地对于病毒编写者不具有实用价值。 这种仓促的假设是SGX保护不对称的原因之一:主机应用程序代码无法访问安全区内存,而安全区代码可以读取和写入主机应用程序的任何内存地址。
因此,如果恶意安全区代码成功地代表主机应用程序进行了任意系统调用,代表其执行任意代码,扫描了主机应用程序的内存并找到了适合其中滥用的ROP链,则它将能够完全控制在隐身模式下托管应用程序。 它不仅可以窃取和加密用户文件,还可以代表用户执行操作。 例如,以他的名义发送网络钓鱼电子邮件或进行DoS攻击。 同时,您甚至不用担心最现代的保护机制,例如堆栈金丝雀和地址清理。
我们将展示一些黑客,利用这些黑客,小人可以克服上述限制,并试图利用SGX的恶意功能:进行ROP攻击。 执行伪装成主机锯切过程的任意代码(类似于恶意软件经常使用的挖空心过程),或掩盖已准备好的恶意软件(以免其恶意软件被防病毒和其他保护机制迫害)。
破解探测地址的可能性
由于安全区不知道主机应用程序可以使用哪些虚拟地址空间范围,并且由于当您尝试读取无法访问的地址时,安全区被强行终止,因此反派将面临寻找故障转移地址空间扫描方法的任务。 寻找一种映射可用虚拟地址的方法。 恶棍通过滥用英特尔的TSX技术解决了这个问题。 它使用TSX的副作用之一:如果将内存访问功能放在TSX事务中,则TSX会在访问操作系统之前抑制由于访问无效地址而引起的异常。 当您尝试访问无效的内存地址时,仅当前事务被中断,而不是整个安全区程序被中断。 T.O. TSX允许飞地安全地从交易中访问任何地址,而不会崩溃。
如果指定的地址可用于主机应用程序,则TSX事务通常会成功。 在极少数情况下,它可能由于外部影响而失败,例如中断(例如,调度程序中断),缓存溢出或通过多个进程同时更改存储单元。 在这些罕见情况下,TSX返回错误代码,指示发生的故障是暂时的。 在这些情况下,您只需要重新启动事务即可。
如果指定的地址对于主机应用程序不可用 ,则TSX抑制异常(不通知OS)并取消事务。 将错误代码返回到安全区代码,以便它可以响应事务已取消的事实。 这些错误代码表示该地址不适用于主机应用程序。


从安全区内部对TSX进行的这种操作对于反派来说是一个不错的功能:由于在安全区代码执行时,大多数硬件性能计数器均未更新,因此无法使用它们来跟踪安全区内部执行的TSX事务。 因此,使用TSX'om进行的恶意欺诈对于操作系统仍然是完全不可见的。
另外,由于上述骇客不依赖任何系统调用,因此仅通过阻止系统调用就无法检测到或阻止这种攻击; 在对抗“打蛋”中通常会产生积极的结果。
恶棍使用上述黑客手段在主机应用程序代码中搜索适合形成ROP链的小工具。 但是,他不需要探查每个地址。 从虚拟地址空间的每一页中探测一个地址就足够了。 探测所有16 GB的内存大约需要45分钟(在Intel i7-6700K上)。 结果,恶棍获得了适用于构建ROP链的可执行页面列表。
黑客探索地址的可写性
为了实施ROP攻击的飞地版本,反派需要具有搜索主机应用程序内存的可写未使用部分的能力。 恶棍使用内存的这些部分来注入伪造的堆栈帧并注入有效载荷(shellcode)。 最重要的是,恶意区域无法要求主机应用程序为其分配内存,而是可以将主机应用程序分配的内存用于其他目的。 除非他当然设法在不使飞地崩溃的情况下找到这些地点。
反派通过利用TSX的另一个副作用来执行此搜索。 首先,与前面的情况一样,他探查该地址是否存在,然后检查与该地址对应的页面是否可访问以进行写入。 为此,反派使用以下技巧:将写功能放入TSX事务中,在完成后但在完成之前,它将强制中断事务(显式中止)。
通过查看TSX事务的返回码,反派将意识到它是否可写。 如果是“明确中止”,则反派将意识到,如果将录制结束,录制将会成功。 如果页面是只读的,则事务将失败,并显示“显式中止”以外的错误。

TSX的这种操作还有一个反派角色(除了无法通过硬件性能计数器进行跟踪之外)令人反感:由于仅在事务成功时才记录所有对内存的写入命令,因此强制完成事务可确保所探测的存储器单元保持不变。
控制流重定向黑客
与传统的ROP攻击不同,从飞地进行ROP攻击时,反派可以控制RIP寄存器,而不会利用被攻击程序中的任何错误(缓冲区溢出或类似的错误)。 反派可以直接覆盖存储在堆栈中的RIP寄存器的值。 特别是,它可以用其ROP链替换该寄存器的值。
但是,如果ROP链很长,那么重写大型主机应用程序堆栈可能会导致数据损坏和意外的程序行为。 试图秘密进行攻击的反派,这种情况不适合。 因此,他为自己创建了一个伪造的临时堆栈框架,并将其ROP链存储在其中。 伪堆栈帧被放置在内存中可写的任意位置,因此真实堆栈保持不变。

是什么赋予了反派上述三个技巧?
(1)首先,一个恶意的飞地通过黑客来探测地址的可能性 ,从而在主机应用程序中搜索可被滥用的ROP小工具。

(2)然后,恶意黑客使用黑客手段探测地址的可写性 ,从而在主机应用程序存储区中确定适合注入有效负载的区域。

(3)接下来,安全区根据在步骤(1)中找到的小工具创建ROP链,并将该链注入到主机应用程序堆栈中。

(4)最后,当主机应用程序遇到上一步中创建的ROP链时,恶意加载程序开始执行,并具有主机应用程序的特权和进行系统调用的能力。
恶棍如何利用这些骇客来制造ranzomvari
主机应用程序通过任何ECALL将控制权转移到该安全区后(不会怀疑该安全区是恶意的),恶意安全区会在主机应用程序的内存中寻找可用空间以进行代码注入(对于那些需要占用这些单元格序列的位置,填充零)。 然后,利用黑客探测地址的可能性 ,从而使该安全区在主机应用程序中搜索可执行页面,并生成一个ROP链,该ROP链在当前目录中创建一个名称为“ RANSOM”的新文件(在实际攻击中,安全区会加密现有的用户文件),显示赎金请求消息。 同时,主机应用程序天真地认为该安全区域只是将两个数字相加。 它在代码中的外观如何?
为了便于理解,我们通过定义引入了一些助记符:

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

我们正在寻找合适的堆栈框架(请参阅“用于重定向控制流的技巧”部分中的代码)。
查找合适的ROP小工具:

找到一个注入有效载荷的地方:

建立ROP链:

恶棍利用这种旨在抵御恶意程序的英特尔SGX技术来实现相反的目标。