软件防护扩展指令( Software Guard Extensions:SGX )本应隐藏数据,但“质数+探查”的攻击方法搞定了它。
1月,英特尔SGX输入输出防护被曝存在可能缺陷,现在,应受保护的SGX飞地上又出现了恶意软件。
奥地利格拉兹科技大学的研究人员写了概念验证程序(PoC),不用SGX保护系统,却用来隐藏恶意软件,并在5分钟之内,就从SGX管辖范围内获取到了RSA密钥。
设计SGX就是为了避免出现这种情况。SGX是隔离机制,本应防止代码和数据不被窥探——恶意特权用户也不行。研究人员所用边信道攻击被他们称为“质数+探查(Prime+Probe)”,对原生英特尔环境或Docker容器都有效。
该PoC包含复杂的3步过程,专门用于在别人领地恢复出RSA密钥:首先,发现受害者的高速缓存组地址;然后,在受害者触发RSA签名计算时窥探缓存;最后,抽取密钥。
论文中,研究人员写道:
我们开发了目前为止英特尔CPU上最精确的时序测量技术,专为英特尔CPU硬件量身定制。我们结合了DRAM和缓存边信道,打造出无需猜测页面大小便可恢复物理地址位元的尖端方法。OpenVPN等工具采用mbedTLS协议,其中的RSA实现,就是我们的攻击目标。尽管有使用定时乘法原语的边信道攻击防护,我们的攻击还是成功了。单次 Prime+Probe 追踪,就能抽取4096比特RSA私钥的96%,仅11次追踪,就可在5分钟之内完全恢复出密钥。
该攻击甚至能跨不同Docker容器进行,因为Docker引擎调用的是同样的SGX驱动。
Docker容器共享相同的SGX驱动模块
定时:加密边信道攻击需要高分辨率定时器,也就是SGX中被禁止的东西。但研究人员梳理了英特尔的规范,将目光锁定在inc和add指令上——因为这俩指令有1个周期的延迟,且在寄存器作为操作数的时候有0.25周期/指令的吞吐量。
为模拟遭禁定时器,研究人员使用了如下x86指令:
mov &counter , %rcx
1: inc %rax
mov %rax , (%rex)
jmp lb
“回收集”生成:该步骤用于发现映射到同个高速缓存组的虚拟地址:我们顺序扫描内存,搜索可致行冲突的邻近地址对。由于SGX内存是连续分配的,我们可在虚拟地址中进行该项扫描。
以上两步完成后,便可开始监视脆弱的高速缓存组,寻找RSA密钥计算的特征签名。
这部分攻击必须离线完成。也就是说,与收集数据的缓存监视过程是分开的。因为数据中包含了太多噪音(来自定时错误、上下文切换、非RSA密钥活动、电源管理引发的CPU时序改变等)。
密钥恢复分3步完成。首先,预处理跟踪。其次,每次跟踪抽取出部分密钥。最后,融合各部分密钥恢复出私钥。
在带SGX功能,安装 Ubuntu 16.10 的联想 ThinkPad T460s 上,他们发现:
340次尝试后,他们的恶意软件从2048个可用高速缓存组中找出了可利用的那个;从脆弱高速缓存组捕获一个密钥追踪平均耗时72秒;一次高速缓存追踪,可获得4096比特RSA密钥的96%,11次追踪,即可恢复出完整RSA密钥。
研究人员称,该攻击可被阻止,但漏洞修复应来自英特尔,因为对操作系统的修改会有弱化SGX模式的风险。
本文转自d1net(转载)