Varys

Posted by Maxul's Technical Notes on July 11, 2018

题目: Varys: Protecting SGX Enclaves from Practical Side-Channel Attacks

作者: Oleksii Oleksenko, Bohdan Trach, Robert Krahn, and André Martin, Mark Silberstein,Christof Fetzer

单位: Technion and TU Dresden

出版: USENIX ATC 2018

解决问题:

  • 目前还没有直接攻击SGX的工作出现,但出现了诸多旁路思路。这些方法严重的可以直接抽取隐私信息。
  • 本文认为,一个可行的方案应该保证引入的开销低,同时不需要修改源代码本身。已知的方案中,要么需要重写程序,要么结合TSX(需要修改程序)。DR.SGX引入开销太高(3X-20X),DEJA VU的误报率高。
  • 本文着重关注L1和L2级缓存的timing问题和基于页表的攻击。
  • 本文工作基于的观察是:要完成L1/L2级Timing攻击的话,需要高频率的AEX退出,同时需要开启超标量,引入不可信的共享物理核心的硬件线程。否则根本不存在信息泄露的可能。
  • 本文强调,尽管想法简单,但实现起来难度却很有挑战。本文需要创建线程对,对源代码进行编译期间的插桩,然后在运行时周期性判断OS的调度是否可靠。为了尽量减少噪声,使用异步机制减小AEX。同时要求OS把中断路由给其他核心。

贡献点:

  • 对攻击成功的必要条件进行分析;
  • 一系列有效的防御措施;
  • Varys,对OS是否正确服务的验证工具;
  • 在两个benchmark上做测试,引入15%的开销;
  • 对未来硬件扩展的改进建议。

威胁模型:

  • OS和HV可以任意生成和暂停任意进程;修改CPU的亲和性;
  • 任意调整中断接收频率和触发缺页中断;
  • 任意读写非EPC区域,将地址空间任意进行映射;
  • 为旁路攻击准备最小化噪声环境。

攻击原因分类:

  • 高频AEX:Time-sliced cache attacks,Page-fault page table attacks,Interrupt-driven page-bit attacks。
  • 共享物理核:Concurrent cache attacks,Exit-less page-bit attacks。

设计:

  • 由于OS不可信,同时无法在Enclave内部执行cpuid,因此无法确定超线程能力是否被关闭。
  • 一个简单的思路就是生成偶数个enclave线程,保证物理核不被不可信线程分享。将co-location测试设计为一次handshake,即让一个线程往共享内存的位置写一个数据,另一个线程观察数据修改的时间。如果为10个周期,则说明共享数据在L1上;超过40个周期则在LLC上,即线程可能运行在不同物理核心上,此时假定正在被攻击,从而终止enclave线程的运行。
  • 很有可能在启动时确实在同一个核心上,但在运行时被调度到不同核上,此时会触发一次AEX。每次AEX触发时,会将上下文保存到 State Save Area (SSA) 中,根据实现手册,SSA中的EXIT_TYPE只能是011b到110b中的值,在AEX触发时会被修改。本文将其修改为非法值,当AEX发生时,则会会自动修改为合法值,从而检测出AEX事件。(个人认为,OS可以不修改这个值,让退出原因无法检测到)
  • 为了统计AEX的出现频率,需要一个可信的时钟源,但当前无法满足,因此使用LLVM IR中的指令统计每次AEX间隔执行的指令条数,进而推知AEX频率。尽管IR和x86指令不是一一对应,但IR通常会比x86机器指令数目少,因此IR统计也有其意义。本文认为,TSX方法的局限在于,handshake会导致abort,同时最大事物个数也被严格限制。
  • 本文方法主要要保证Enclave退出事件尽小可能发生。发生理由如下:请求系统调用;时钟中断(1000 AEX/s);其他中断;EPC缺页中断。减小方法如下:Eleos+SCONE,异步系统调用;将时钟频率降到100 Hz;将无关中断路由到非运行Enclave的核心上;利用MAP_POPULATE告知mmap最小化minor faults。
  • 由于已有工作证明,就算在内核态运行CLFUSH指令也无法完全将cache清空,因此在每次退出时将某个dummy值写到L1大小的数据区域,保证eviction。

实现:

  • 利用LLVM Pass对程序进行插桩。插入一个线程负责SSA polling。
  • 软定时器:使用Schwarz的方法,引入时钟线程,缺点是对手可以利用现代CPU的节能特性以及变频来改变定时器的运行周期。为降低免误报率,测量范围变为寄存器加法的测量(常数时间)。
  • 使用跳转指令快速清空32KB大小的L1级指令缓存。
  • 使用SCONE作为运行时容器,主要原因是其实现了用户态调度,能轻松实现线程配对;同时提供异步系统调用。

硬件扩展:

  • Intel CAT:由于是OS完全控制该属性,因此很难甄别cache是否被正确配置。建议将CAT的状态嵌入到SGX的version number中,在每次AEX handler中进行检查。
  • Trusted HW timer:就算SGX v2引入tsc,OS也可以重置和修改,因此也不能使用。要么引入只读定时器,要么保证每次对timer的修改version number都会变成随机值,进而可以被Enclave程序感知。

不足:

  • 无法抵御LLC旁路攻击。

体会:

  • 本文和SP 18年的思路相近。SP文章利用TSX来判断线程调度是否违规,并不需要引入timer。
  • 本文写作并不算上乘,或许是因为解决了有价值的问题,进而被收编。