AnC和Xlate攻击防御研究①
2020-06-09李小馨
李小馨 侯 锐 孟 丹
(*中国科学院信息工程研究所信息安全国家重点实验室 北京 100093)(**中国科学院大学网络空间安全学院 北京100049)
0 引 言
近年来高速缓存(cache)作为系统中所有进程共享的功能单元,受到了攻击者的普遍关注。利用cache侧信道攻击,攻击者打破了操作系统通过控制虚拟地址实现的不同进程间的访问隔离。自cache侧信道攻击出现至今十余年,攻击手段不断丰富,攻击平台由单核到多核至云平台[1,2],攻击架构由x86[3,4]至ARM[5],攻击目标由加密密钥[3,4]至地址随机化(address space layout randomization,ASLR)[6,7]。但一直以来的cache侧信道攻击利用的都是CPU核中不同进程对cache的共享。
最近有研究者利用内存管理单元(memory management unit,MMU)和CPU核对cache的共享实现了新型的cache侧信道攻击。AnC[8]攻击中攻击者使用JavaScript控制CPU核的访存操作,探测出MMU对cache的访问踪迹,在150 s内破解了浏览器中的地址随机化。Xlate[9]攻击中攻击者利用MMU的访存操作,绕过所有已有的软件侧信道防御措施,探测出CPU核对cache的访问踪迹,破解了基于T-table实现的AES的加密密钥。攻击者已在Intel、AMD、ARM等的22种机器上发现了这一侧信道的存在。
防御此类攻击的关键在于隔离MMU和CPU核对cache的访问。针对这类新的cache侧信道攻击,已有的基于隔离的防御手段[10-16]已不适用。这些防御手段只隔离了来自CPU核的不同进程(数据或代码)对cache的访问,并没有考虑MMU对cache的访问。Stealthmem[13]等通过置一页表项中的保留位来触发缺页中断(page fault)以实现页粒度的cache访问控制,但会产生L1终端故障(L1 terminal fault,L1TF)[17,18]等新的侧信道泄露。
本文分析了AnC和Xlate类基于MMU和CPU核共享cache的侧信道攻击,指出防御的关键在于隔离cache中的页表项和普通数据,并分析了已有的基于隔离的防御措施的不足,研究探索了软件、硬件2种隔离方案。
(1)在软件层面,首先基于页面属性表设置所有页表项属性为不可缓存(uncacheable),隔离了页表项和cache中的普通数据;进一步结合透明大页,减少了旁路转换缓冲(translation lookaside buffer,TLB)的失效率,将平均性能损失由82.35%降至26.95%。
(2)在硬件层面,首先实现了不缓存所有页表项的基本方案,并研究了随机地不缓存部分页表项的性能及安全性。进一步地,探索了在cache中隔离页表项和普通数据的防御方案,最后提出了与各级页表项局部性相适应的混合隔离方案,页表缓存(page table cache,PTC)大小为64项时,平均性能提升0.81%。
1 研究背景
如图1所示,CPU核访问内存数据时,首先向cache发送请求,cache失效时再向内存发送请求,从内存中取回的数据会被缓存在各级cache中,以减少后续的内存访问次数,加速数据的再次访问。MMU进行地址翻译时,首先查询TLB,TLB失效后向PTW(page table walker)发送请求。若访问的页表项不在PTC中,PTW进一步向cache发送请求。cache 失效后从内存中取回的页表项也会和普通数据一样缓存在各级cache中。对cache的共享,使得MMU和CPU核可以互相探测对方的访存操作在cache中留下的踪迹。当这一访存踪迹依赖于隐私数据时,攻击者便可获取隐私数据。
图1 MMU和CPU核共享cache
1.1 AnC攻击利用普通数据探测隐私页表项信息
现代系统中普遍采用多级页表的页表组织结构,虚拟地址可以分解为各级页表页及数据页的索引(如图2所示)。AnC攻击利用cache侧信道获得各级页表项在cache中的位置,进而获得各级页表项在页表页中的索引,最终获得关键数据或代码的虚拟地址(即破解ASLR)。
图2 虚拟地址分解为各级页表项的cache索引
组相联cache的索引来自于被缓存数据的地址,cache索引相同的数据会落入同一cache组(set)。每个cache组容量有限,当某个cache组已被占满时,缓存新的数据需要驱逐该cache组中缓存的旧数据。在cache侧信道攻击中,可以占满某个cache组,即驱逐该cache 组中所有旧数据的数据集被称为该cache组的驱逐集(eviction set)。
MMU和CPU核共享cache时,MMU访问的页表项和CPU核访问的普通数据在cache中存在互替关系。AnC攻击中攻击者通过控制其普通数据的页内偏移部分(即cache索引)为每个cache组构造驱逐集。攻击者使用驱逐集探测MMU访存操作在cache中踪迹(见图3),其具体步骤如下。
(1)攻击者触发受害者访问隐私地址,TLB失效后,MMU进行PTW将隐私虚拟地址对应的各级页表项加载到cache中。
(2)攻击者访问某个驱逐集。
(3)攻击者再次触发受害者访问隐私地址,并测量受害者访问时间。
若访问时间较长,则表明受害者访问的页表项已被攻击者的驱逐集驱逐出cache,从而获得页表项对应的cache索引。
图3 AnC利用普通数据构建驱逐集探测MMU访存在cache中的踪迹
1.2 Xlate攻击利用页表项探测隐私数据信息
基于T-table实现的AES加密算法,第一轮访问查找表的索引由密钥k和明文p异或得到。已知明文攻击通过探测加密算法访问的T-table的cache索引破解密钥。在传统破解AES密钥的侧信道攻击中,攻击者用普通数据构造驱逐集探测AES加密过程在cache 中留下的访问T-table踪迹。现有防御策略已隔离攻击者的普通数据和受害者的普通数据对cache的访问,以阻止由于不同进程的普通数据对cache共享导致的侧信道泄露。但MMU对cache的访问一直未被考虑在内。Xlate攻击利用页表项来构造驱逐集(如图4所示),绕过了已有的隔离防御机制。
图4 Xlate攻击使用最低级页表项构建的驱逐集探测AES T-table的cache访问踪迹
Xlate攻击使用驱逐集探测AES T-table访问在cache中踪迹的具体步骤如下。
(1)攻击者访问驱逐集。
(2)攻击者触发受害者执行AES加密算法,受害者访问的T-table会被加载到cache中。
(3)攻击者再次访问驱逐集,并测量访问驱逐集的时间。
若访问时间较长,则表明受害者访问的T-table项驱逐了驱逐集中的页表项,从而获得T-table对应的cache索引。
2 防御策略
从前文分析可见,AnC和Xlate类攻击的根本在于MMU和CPU核对cache的无差别共享,防御的关键在于将MMU和CPU核对cache的访问隔离。
隔离包括多个层面。本文首先探索在软件层面的隔离。隔离MMU和CPU核对cache的访问,需要区分页表项和普通数据。页表由操作系统创建维护,用户程序不可见,最低级页表项指向的为普通数据页,其他级页表项指向的为页表页。Intel提供了页面属性表(page attribute table,PAT)特性,可通过配置页表项,指定页表项所指向页面(包括页表页)的cache访问属性,且各级页表项可独立配置[19]。因而可以利用PAT为页表页和数据页配置不同的cache使用策略,达到隔离MMU和CPU核对cache访问的目的。基于PAT的不缓存策略会给MMU访存操作占比大且TLB失效率高的程序带来较大的性能损失。使用大页可以减少这类程序的页表项数量和页表级数,进而减少不缓存页表项策略的性能损失。
不缓存页表项策略的性能损失大。Page coloring[15]等其他软件cache访问隔离策略,虽然性能损失会较少,但无法完全防御AnC和Xlate类攻击。
(1)页着色(page coloring)利用物理页号和cache索引间存在的重叠位(即颜色位color bits),将不同安全域的地址映射到不同的cache组。AnC类的攻击可以实现基于L1 cache的攻击,page coloring无法控制不存在color bits的L1 cache。
(2)Intel 的缓存分配技术(cache allocation technology,CAT)[12]可以基于cache 路隔离不同进程的数据,但没有区别对待同一进程的普通数据和页表项,且目前的CAT并未在L1 cache实现。
(3)StealthMem等通过修改页表项中的保留位来触发page fault以实现页粒度的cache访问控制,会产生L1终端故障等新的侧信道漏洞。
本文进一步研究在芯片层面的隔离,探索性能损失更小的防御策略。芯片层面的隔离无需借助操作系统来区分页表项和普通数据,可以实现软件透明的防御。给MMU 发出的cache访问请求打标签,可使cache区分来自MMU和CPU核的请求。对于页表项的访问请求,cache 失效后从下级cache或内存取回来的页表项不缓存在cache中直接返回给MMU,为基本的不缓存策略。随机地不缓存部分页表项的策略可以减少性能损失,但缓存的页表项仍存在侧信道泄露。MMU中的PTC也缓存页表项,将页表项只缓存在PTC中也可以实现页表项和普通数据对cache访问的隔离。cache分区策略可以在共享cache中隔离页表项和普通数据。本文根据页表项访问请求占cache总访问请求的比例,评估页表项占一路的按路隔离策略。因各级页表项的cache局部性差异较大,本文最后探索和各级页表项局部性特征相适应的混合隔离策略。
3 软件防御机制
AnC和Xlate类攻击的关键在于MMU和CPU核无差别地共享cache,使得页表项和普通数据可以在cache中互相驱逐。本文研究了在现有系统下如何打破这种共享关系。
3.1 基本方案:基于PAT不缓存页表项
本文基于Intel提供的PAT,为页表页和数据页配置不同的cache访问属性,隔离MMU和CPU核对cache的访问。
Intel从Pentium III开始引入PAT特性,可以在虚拟地址空间以页为单位设置数据的访存类型(ARM和AMD也提供了类似的特性)。每级页表项中都增加了PWT、PCD位,最低级页表项中还增加了PAT位,指向最高级页表页的CR3寄存器中也增加了PWT、PCD位,以设置其指向页面的访存类型。
本文通过设置寄存器CR3和指向页表页的页表项(除最低级页表项)中的PCD位和PWT位,将页表页的访存属性设置为UC(uncacheable),普通数据页的访存属性设置为WB(write-back),从而隔离了MMU和CPU核对cache的访问。
3.2 优化方案:结合透明大页减少性能损失
TLB 失效时,使用4级页表的系统完成地址翻译需要访问4次内存。不缓存页表项的机制会给TLB 失效多的程序带来较大的性能损失。降低TLB 失效率或减少每次TLB 失效后的内存访问次数,可以减少TLB 失效引起的内存访问总量。
大页增大了TLB覆盖的地址范围,从而减少TLB 失效率。同时,大页对应的页表级数也减少,因而也减少了每次TLB 失效后访问内存的次数。本文进一步结合系统提供的2 M透明大页,评估基于PAT的防御机制对于性能的影响。
4 硬件防御机制
软件防御机制可以方便地应用于现有系统,但可以实施的性能优化措施有限。本文进一步研究在芯片层面的隔离,实现性能损失更小的防御机制。
4.1 基本方案:不缓存全部页表项
为使cache可以区分来自 MMU和CPU核的请求,本文在PTW发往cache的请求中增加标志位PTW_uncache,以通知cache不缓存该页表项。
操作系统创建页表项时会进行写页表项的访存操作,此类页表项访问请求由CPU核发起,会被正常缓存在cache中。对于写回型cache,写操作的数据只有在数据被替换出cache时,才会被写入内存。若此类页表项未被写回内存,直接去内存查找PTW请求的页表项,会出现缺失错误。为避免该缺失错误发生,在本文的硬件不缓存页表项机制中,PTW的访存操作仍会查找cache。页表项只有被创建时会被缓存在cache中,被驱逐集替换出cache后,后续被PTW请求时,将不再被缓存在cache中。成功实施AnC 或Xlate攻击都需要多次驱逐cache,因而页表项短暂地被缓存在cache中并不会影响安全性。
当PTW访存请求发生cache命中时,cache采取和处理普通数据cache命中相同的策略,即将命中的页表项返回给PTW。如图5所示,当PTW访存请求发生cache 失效时,cache将从内存取回的页表项直接返回给PTW,不缓存在任一级cache中。
图5 MMU请求的数据不缓存在cache中
4.2 优化1: 随机不缓存页表项减少性能损失
为减少不缓存全部页表项的性能损失,本文进一步在cache中随机地缓存部分页表项。本文在PTW中增加一个访存请求计数器:PTW每向cache发送一次请求,计数器都加1,饱和后清零。当计数值为0时,PTW将访存请求中的PTW_uncache标志位清零,否则置1(即不缓存在cache中)。
实验表明,随机地缓存1/4和1/64页表项在cache中均存在侧信道泄露,且缓存的页表项越多侧信道泄漏的风险越大。缓存1/4页表项时,3级页表项的索引皆被破解;缓存1/64的页表项时,第2级页表项的索引被破解。因为AnC具有抗噪音的特点,难以找到完全不存在侧信道泄漏的随机不缓存方案。
4.3 优化2:改进MMU中的PTC缓存各级页表项
系统中除了L1-L3cache外,MMU中也有专用于缓存页表项的PTC。普通数据无法驱逐PTC中的页表项,将页表项只缓存在PTC中也可以实现页表项和普通数据对cache访问的隔离。多级页表中最低级页表项数量最多,而现有的PTC未缓存最低级页表项(由TLB缓存)。为减少TLB 失效引起的内存访问总量,本文改进PTC来缓存所有级别的页表项(含最低级页表项)。
4.4 优化3:按路分区(way partitioning)cache隔离页表项和普通数据
组相联cache的每个cache组都有多路(way)缓存行,将页表项和普通数据缓存到不同的cache路可以实现隔离。考虑到动态分区仍存在部分信息泄露[20,21],而且会使某一类数据强占cache影响其他类型数据对cache的使用,本文采用静态的按路分区机制。
根据cache访问请求中页表项访问请求所占的比例,本文采用为页表项分配一路的按路分区方案:页表项使用第1路,普通数据使用其他路。本文在PTW发往cache的访存请求以及cache的每个缓存行中添加标志位isPTE,以区分是页表项还是普通数据。
按路分区只改变替换逻辑,不影响查找逻辑。考虑到本文并未对操作系统创建页表项时的写页表项进行标记,页表项和普通数据仍可以命中在任意cache路。发生cache失效时,PTW请求的页表项只能被缓存在第1路缓存行,CPU请求的普通数据只能被缓存在其他路缓存行;若上级(离CPU核更近)cache中的数据被驱逐,isPTE位为1的缓存行只能被缓存在下级cache中的第1路,isPTE位为0的缓存行只能被缓存在下级cache中的其他路。如图6所示,按路分区后,页表项只缓存在cache的第1路,普通数据只缓存在cache的其他路,页表项和普通数据在cache中不再有互替关系,无法互相探测对方的cache访问踪迹。
图6 按路分区方案
4.5 优化4:与各级页表项局部性相适应的混合隔离方案
各级页表项的局部性不同,高级页表项局部性好于低级页表项。本节探索与各级页表项局部性特征相适应的隔离方案。本文评估了不同配置下各级页表项的失效率(从内存取各级页表项的次数/TLB失效次数)。图7显示,高级页表项的局部性远好于低级页表项。
图7 各级页表项失效率差异比较
只在PTC中缓存各级页表的方案中,PTC为64项时,L3页表项失效率已较低,平均为0.65%,L2页表项的平均失效率为15.91%,L1页表项平均失效率为71.79%。PTC增大至256项时,L2、L1页表项失效率显著下降,L2页表项平均失效率为7.9%,但L1页表项的失效率仍较高,为44.71%。采用按路分区时,各级页表项的失效率普遍较低,L3页表项的平均失效率为0.05%,L2页表项的平均失效率为0.78%,L1页表项的平均失效率也仅为4.99%。
为减少不同级页表项间的干扰,本文将只在PTC中缓存各级页表项的机制与按路分区cache的机制相结合。首先,在按路分区cache中只缓存L1页表项,PTC中缓存各级页表项。PTC为64项时,L3页表项平均失效率为0.59%,L2页表项平均失效率为12.09%,L1页表项平均失效率为4.43%。相较于在按路分区cache中缓存所有级页表项的方案,L1页表项的失效率有一点下降,但L2页表项的失效率增加较大。为进一步减少PTC中L1页表项对其他级页表项的干扰,本文在PTC中只缓存L3、L2页表项,不缓存L1页表项,L2 平均失效降为6.11%,L1平均失效率为4.37%,L3平均失效率为0.6%。
5 性能分析
5.1 软件方案性能分析
软件方案实验环境配置如表1所示。使用大页的不缓存页表项方案相较于基本的不缓存页表项方案其性能损失(分别归一至使用2 M大页的正常缓存方案和未使用大页的正常缓存方案)由平均82.35%降至平均26.95%。不缓存页表项的性能损失来源于TLB失效后的PTW访存操作。性能损失大小具体取决于正常缓存时PTW访存时间占程序总执行时间的比例、不缓存页表项后增加的TLB失效数量和平均PTW执行时间。
以cactusADM为例,未使用大页时,正常缓存机制中PTW访存时间占程序总执行时间的比例为38.85%、每千条指令TLB失效数为13、平均每次PTW执行时间为23个周期,不缓存页表项机制中每千条指令TLB失效数为36、平均每次PTW执行时间为187个周期,计算得性能损失为815.25%。使用大页时,正常缓存机制中PTW访存时间占程序总执行时间的比例为11.38%、每千条指令TLB失效数为7、平均每次PTW执行时间为13个周期,不缓存页表项机制中每千条指令TLB失效数为16、平均每次PTW执行时间为113个周期,计算得性能损失为211.41%。
表1 实验环境配置
5.2 硬件方案性能分析
硬件方案的实验环境配置如表2所示。如图9所示,高级页表项缓存在PTC、最低级页表项缓存在按路分区cache的混合隔离方案中,PTC大小为64项时,平均性能提升0.67%,其中mcf的性能损失最大,为5.85%。
本文实验用到的PTC为全相联结构,达到的性能提升是理想化的最大值。采用组相联结构后,需进一步增大PTC才能达到同等的性能提升效果。如图10所示,PTC大小同样的情况下增加PTC的路数的效果要好于增加PTC的组数。
表2 实验环境配置
图8 软件方案执行时间(归一到未使用大页时的正常缓存方案)
图9 硬件方案性能损失
6 安全性分析
AnC和Xlate类攻击都依赖于页表项和普通数据在cache中的互替关系,隔离的防御机制打破了这种关系,使得页表项和普通数据无法探测对方的访存操作在cache中留下的踪迹。
图10 组相联PTC性能损失
图11和图12分别为软件平台上AnC和Xlate攻击防御前后的攻击结果(硬件防御机制中实验结果类似,不再赘述)。
颜色越深代表访问延迟越大,猜测结果与实际结果重叠代表攻击成功。
实施防御前,隐私地址对应的页表项访问延迟较其他地址对应的页表项访问延迟大。AnC攻击中攻击者可以观测到该时间差,获得隐私页表项的页内索引。实施防御后,所有地址访问延迟均增加,攻击者无法观察到MMU的访存踪迹。
注:以k[0]=0为例,对于p[0]从0到256,访问的T0从缓存行 0到缓存行 15, 出现如图所示的阶梯状深色部分代表攻击成功
图12 防御前Xlate攻击结果
实施防御前,Xlate攻击者可以用页表项构造驱逐集,探测AES加密过程访问的T-table在cache中的位置。实施防御后,页表项未被缓存在cache中,Xlate攻击者无法使用页表项创建驱逐集,后续无法使用驱逐集进行cache访问踪迹的探测,因而未生成驱逐集探测结果图。
7 相关工作
目前基于隔离的cache侧信道防御措施可以分为3类:按组分区、按路分区和将敏感数据锁存。
按组分区Page coloring通过控制cache索引实现cache按组分区。如图13所示,物理页号和cache索引存在重叠部分为color bits。Page coloring为不同安全域的数据分配不同的color bits,不同安全域的数据便缓存在不同的cache组,不存在互替关系。
图13 Page coloring工作机制
按路分区IntelCAT将cache按路分区,操作系统通过控制位掩码将cache路与CLOS(class of service)绑定,再进一步将CLOS与CPU核绑定以实现不同进程对cache的隔离访问。
NoMocache[21]针对具有2个硬件线程的处理器,为每个线程静态分配Y路cache,其他路为2个线程共享,每个线程都不能独占cache。
利用硬件机制将敏感数据锁存在cache中Intel TSX(事务内存)[10]使用时涉及到2个集合:写集合和读集合。当写集合超过L1 Dcache大小时或读集合超过LLC大小时,事务终止率会急剧增加。Cloak[10]使用TSX访问敏感数据,监测TSX的事务终止率,将敏感写数据锁在L1 Dcache中或敏感读数据锁在LLC中。
ARM Autolock[11]机制具有锁住私有cache数据的特性:当核间共享cache中的缓存行在核私有cache中留有备份时,该缓存行不可以被从共享cache驱逐。利用该特性可以阻止基于共享LLC的跨核攻击。
PLcache[22]为每个缓存添加L标志位,被标记为Lock的缓存行只能被同进程的Lock行替换出cache,未标记为Lock的缓存行可以被任意缓存行替换。
利用软件机制将敏感数据锁存在cache中。映射到同一cache组的物理地址在cache中具有互替关系,StealthMem[13]和CacheBar[16]通过限制各进程可占有的cache路数,阻止不同安全域数据的互相驱逐。StealthMem和CacheBar跟踪不同安全域数据的物理页访问踪迹(将这些页对应页表项中的保留位置1以引起page fault,监控对这些物理页的每一次访问),当非安全域占有的cache路数超过阈值时,重新加载安全域的数据至cache,达到将安全域数据锁在cache中的目的。
已有防御机制都未考虑MMU对cache的访问。即使考虑了页表项,上述这些防御机制也不能完全防御该类攻击。MMU和CPU共享cache引起的攻击包括核内攻击和跨核攻击。Page coloring机制只适用于存在color bits的情况,从而无法防御基于L1 cache的核内攻击,且Page coloring也无法在大页开启时使用。IntelCAT只在LLC或L2 cache中实现,也无法防御核内攻击。基于ARM Autolock的机制同样无法防御核内攻击。NoMocache中共享部分的存在,仍会造成部分信息泄露。在基于TSX的防御机制中,受保护的进程其敏感数据大小需和L1 Dcache或LLC大小吻合。PLcache需借助软件标记保护数据,不能实现软件透明的防御。StealthMem和CacheBar等通过置一页表项中的保留位来触发page fault的方式会引入新的侧信道漏洞, 例如L1终端故障。
8 结 论
AnC和Xlate类基于MMU和CPU核共享cache的攻击防御关键在于隔离页表项和普通数据,已有隔离防御机制并不能完全防御此类攻击。本文提出的隔离机制包含软件和硬件2个层面。软件隔离机制可以方便地应用于现有系统,但性能损失大。在硬件层面可以实现更细粒度的隔离方案,探索性能更优的防御机制。
在软件层面,本文基于PAT不缓存页表项,进一步结合透明大页,减少了TLB失效率,平均性能损失由82.35%降至26.95%。在硬件层面探索了缓存页表项的隔离机制,改进了PTC缓存各级页表项,只在PTC中缓存页表项;按路分区cache,将页表项和普通数据缓存在不同cache路。基于各级页表项局部性存在差异的观察,本文提出了与各级页表项局部性相适应的混合隔离方案。下一步的工作是将访存特性不同的程序区别对待,探索适合不同程序的更细粒度的隔离机制。