没有合适的资源?快使用搜索试试~ 我知道了~
改进Intel CET以实现通用和高效的进程内内存隔离机制
2989本作品采用知识共享署名国际4.0许可协议进行许可。CETIS:改进Intel CET以实现通用和高效的进程内内存隔离公司简介中科院计算所中国科学院大学中国北京xiemengyao@ict.ac.cn徐佳丽中科院计算所中国科学院大学中国北京xujiali@ict.ac.cn吴成刚中国科学院计算技术研究所中国科学院大学中关村实验室中国wucg@ict.ac.cn赖远明中科院计算所中国科学院大学中国北京laiyuanming@ict.ac.cn张银倩南方科技大学计算机科学与工程南方科技大学可信自治系统研究院,深圳,中国yinqianz@acm.org眼康中科院计算所中国科学院大学中国北京kangyan@ict.ac.cn摘要铎王中科院计算所中国北京wangwei2021@ict.ac.cnZheWang中国科学院计算技术研究所中关村实验室中国北京wangzhe12@ict.ac.cn关键词英特尔控制流实施技术(CET)是最近的英特尔处理器中提供的一项新的硬件功能它支持粗粒度的控制流完整性,使软件能够抵御恶意破坏攻击。在本文中,我们改造CET,特别是写保护的影子页CET用于实现影子栈,开发一个通用的和有效的进程内内存隔离机制,被称为CETIS。为了提供用户友好的界面,开发了CETIS框架,该框架为隔离的内存区域提供内存文件抽象和一组访问所述区域的APICETIS还提供了一个编译器辅助工具链,供用户轻松构建安全的应用程序。证明了使用CETIS保护CPI、CFIXX和JIT编译器的实用性,并且评估表明CETIS的性能优于最先进的内存内隔离机制,如MPK。CCS概念• 安全和隐私→软件和应用程序安全。王哲是本书的核心作者。CCS©2022版权归所有者/作者所有。ACM ISBN978-1-4503-9450-5/22/11。https://doi.org/10.1145/3548606.3559344进程内内存隔离、英特尔CET、内存文件提取ACM参考格式:Xiang Xie , Chenggang Wu , Yinqian Zhang , Jiali Xu , YuanmingLai,Yan Kang,Wei Wang,and Zhe Wang.2022. CETIS:改进英特尔CET以实现通用和高效的进程内内存隔离。在2022年ACM SIGSAC计算机和通信安全会议(CCS '22)的会议记录中,2022年11月7日至11日,美国加利福尼亚州洛杉矶。 ACM,纽约州纽 约 市,美国,14页。https://doi.org/10.1145/3548606.35593441引言进程内内存隔离是包含错误或恶意代码的经典方法为了击败控制流劫持攻击,包括代码注入攻击[6,12,34],代码重用攻击[4,29,32]和仅数据攻击[14,16,31],安全研究人员已经提出了诸如代码指针完整性(CPI)[18]、影子堆栈[2]和CFIXX [1]的技术。 这样的技术保护进程的隔离区域中的敏感指针、返回地址或虚拟表指针,并且仅允许从可信代码访问所述区域。进程内隔离的另一个用例是使用即时(JIT)编译器来隔离JIT代码的代码缓存,使其不被具有任意内存写入能力的攻击者篡改。现有的进程内内存隔离机制可以大致分为基于地址的隔离和基于域的隔离[39]。基于地址的隔离限制(例如,bound-check)从不受信任的代码的每个内存访问,以确保CCSXie et al.2990隔离的内存区域无法访问[17,38],例如软件故障隔离(SFI)[38]。除了导致严重的代码膨胀[2],大量的指令插装将带来高性能开销[8]。因此,最近研究的焦点一直是基于域的隔离,它控制隔离内存区域的内存访问权限。当可信代码访问所述区域时,启用访问权限,访问结束后禁用访问权限为了提高权限切换的效率,研究人员利用了各种硬件功能,如VMFREQ [13,17,19,30]、内存保护密钥(MPK)[2,11,13,17,27,28,37]和管理程序存储器访问预防(SMAP)[39]。 在这些方案中,基于MPK的隔离方案是最突出和最广泛研究的,因为它不依赖于硬件虚拟化。然而,基于MPK的解决方案仍然遭受高性能开销时,权限切换频繁[39,42],例如,CPI和影子堆栈。在本文中,我们提出了一种新的内存隔离机制,名为CETIS,通过改进新引入的Intel控制流执行技术(CET)[15]中的影子堆栈(SHSTK)机制。为了确保返回地址的完整性,SHSTK引入了一种称为影子堆栈页面(以下称为shstk页面)的新内存页面类型来存储返回地址。 这是通过在页表条目(PTE)中使用R/W位和Dirty位的未使用组合来实现的。 由于shstk页的访问权限是只读的,因此常规存储指令不能写入此类页。CALL和RET指令隐式地更新shstk页面,如果在函数返回期间主堆栈和影子堆栈顶部的返回地址不匹配,则将引发硬件异常为了支持错误处理,SHSTK还提供了一个WRSS指令来修改存储在shstk页面中的目前,人们普遍认为SHSTK只在保护返回地址的完整性方面有用,不能扩展以实现更通用的隔离[8]。然而,在这项工作中,这种隔离实际上是通过CETIS实现的。CETIS将隔离的内存区域放置在shstk页面上,并确保WRSS防御(访问该区域的唯一方法)只能由受信任的代码使用。此外,由于NX位可以与PTE中的R/W位和Dirty位正交,所以隔离的存储器区域也可以具有执行许可以保护JIT化代码。因此,CETIS提供了一种全新的内存隔离抽象,可以保护数据和代码的完整性不受其他隔间的影响。此外,由于CETIS将隔离的内存区域与CET使用的影子堆栈分开,因此CETIS可以与CET一起工作然而,由于SHSTK和WRSS不是为通用存储器隔离而设计的,因此改造这样的硬件特征以构建通用且有效的存储器隔离机制在技术上是不平凡的。主要的挑战来自于使用WRSS指令的限制。首先,WRSS指令只能写入固定大小的数据(即,4/8字节)插入shstk页,目的地址必须4/8字节对齐。因此,要使用WRSS,必须为软件开发缓存机制:当在给定地址写入数据时,软件需要首先读取对齐地址处的数据,组合数据,然后在对齐地址处写回组合数据。使用WRSS的对齐选择最佳写入策略这一要求是具有挑战性的,因为程序需要推断WRSS的目的地地址,并根据需要可选地执行第二,尽管WRSS指令也是一个内存访问指令,但它的效率不如mov。在我们的经验评估中,WRSS的延迟约为9.3个CPU周期,而mov的延迟小于1个CPU周期(当没有缓存未命中发生时)。因此,WRSS指令的数量越少,它引入的性能开销就越少。因此,为了支持连续写入小尺寸数据的用例(例如,一个字节),必须采用缓冲方法,其中软件需要将数据组合到缓冲区中,并根据需要用WRSS将缓冲区刷新到存储器中然而,在维持缓冲器和隔离存储器区域的一致性以及避免不相关软件破坏缓冲器的内容方面存在挑战为了解决上述挑战,CETIS提出了一种新的内存文件抽象(称为cmfile),用于隔离的内存区域和一组访问所述区域的API。CETIS支持两种不同的访问模式:读/写模式和附加模式。读/写模式可以在cmfile中的任意位置读/写任意长度的为满足对中要求,CETIS提供API供用户提供对中提示。CETIS还可以自动推断目的地位置的对齐追加模式用于频繁更新小型数据。还介绍了一个写组合缓冲区,这是实现在一个保留的通用寄存器。提供编译器辅助的工具链,用于维护缓冲区和隔离存储器区域的一致性。我们在Linux/X86_64平台上实现了CETIS为了评估与替代解决方案相比的性能开销,我们还部署了基于SFI的隔离方案、基于MPK的隔离方案和CETIS来保护两种防御:CPI [18]和CFIXX[1]。在SPEC CPU 2006/2017基准测试和Nginx Web服务器上的实验表明,CETIS平均实现了最低的性能开销。我们还应用CETIS来保护JavaScript引擎Chakra-Core的JIT代码。结果表明,与其他隔离方案相比,CETIS是最有效的。总的来说,本文的贡献如下:一种新的基于CET的隔离机制。 提出了一种基于SHSTK的CET内存隔离方案,可用于软件防御中的敏感数据保护和JIT编译器中的JIT代码保护。大学英语四、六级考试SHSTK和WRSS的综合研究 本文对大学英语四、六级考试中的SHSTK和新引入的WRSS教学进行了全面的研究,从教学效果、建筑/微建筑行为等方面进行了分析。新的软件框架。我们开发了一个软件框架,包括一组用户友好和性能优化的API和一个编译器辅助工具链,以便与CETIS轻松集成。从执行和评价中获得新的见解。我们实现了一个原型的CETIS,并进行了评估,结果表明,它优于现有的方法。我们的研究表明,CETIS不仅实用,而且有效。····CETIS:改进Intel CET以实现通用和高效的进程内内存隔离CCS29912背景和相关工作2.1进程内内存隔离进程内内存隔离通常用于保护ISO正常页面Shstk页面WRSS 正规商店SSP SP存储器区域。信息隐藏(IH)是一种常用的(伪)隔离方法[41],它将隔离区域隐藏在宽地址空间内,并依赖于高随机熵来保持安全。但是,最近的研究[9,20,26]表明IH不再安全。因此,需要严格的内存隔离来保护隔离区域[40]。现有的(严格)隔离方法可以分为基于地址的隔离和基于域的隔离。基于地址的隔离方法。基于地址的隔离限制(例如,bound-check)不受信任代码的每次内存访问,以确保隔离区域无法访问,例如软件故障隔离(SFI)[38]。为了加速边界检查,英特尔引入了内存保护扩展(MPX)[15],它引入了BNDCU/BNDCL指令来快速检查给定值是否在边界内。 由于巨大的代码开销,基于MPX的隔离仍然会带来很高的性能开销。 当保护影子堆栈时,SPEC CPU 2006 [39]上的平均开销为14.57%。此外,它会导致严重的代码膨胀(例如,SPEC上的平均值为41.67%[2]基于域的隔离方法。基于域的隔离通过在访问隔离存储器区域之前/之后启用/禁用访问许可来改变隔离存储器区域的访问许可。mprotect()系统调用通常用于切换访问权限。为了加速权限切换,在最近的作品中使用了硬件功能一些作品[2,11,13,17,27,28,37]使用内存保护密钥(MPK)[15],一些作品[13,17,19,30]使用VMFKEY [3] , 而 SEIMI [39] 使 用 Supervisor Memory AccessPrevention(SMAP)。在不依赖虚拟化的情况下,基于MPK的隔离被认为是最有效的 MPK通过在页表项(PTE)中附加4位的权限保护密钥,将用户存储空间划分为16个域,并提供一条WRPKRU指令(约需27个CPU周期)来改变每个域的访问权限。然而,基 于 MPK 的 隔 离 仍 然 不 够 快 。 保护影子堆栈的 开 销 为61.18%[2]。一些作品提出了特权移动方法[2],通过引入一条新的指令来只访问隔离的存储器区域[8,21,33]。IMIX [8]使能PTE中的保留位以识别页面是否敏感,并提供新的存储器访问指令SMOV来访问敏感页面,而其他存储器访问指令不能这样做。MicroStache [21]通过引入新的XLD/XST指令遵循类似的想法。HDFI [33]为每个机器字引入了一个标签,它指示机器字是否敏感。 它添加了SDSET 1指令来将数据标记为敏感,并添加了LDCHK0/LDCHK 1指令,用于在加载目标数据时检查数据标签是否符合预期。值得注意的是,这些方法需要修改模拟器,因此不能部署在商业处理器上。CETIS是第一个在商业处理器上实现这一目标的工作。2.2英特尔控制流执行技术英特尔控制流执行技术(CET)是英特尔第11代处理器的一项新图1:CETIS的高层次理念堆栈(SHSTK)。 IBT用于保护程序的前向控制流。当程序被间接 调 用 / 跳 转 时 , 新 添 加 的 状 态 机 进 入WAIT_FOR_ENDBRANCH 状 态。 只有 当下 一 条执 行指 令 是ENDBR时,状态机才会进入IDLE状态,允许程序继续执行;否则,将触发控制保护异常(#CP)因此,粗粒度CFI可以通过在所有间接调用/跳转目标之前插入ENDBR指令基于IBT可以实现粗粒度的控制流集成。此外,FineIBT [22]通过将IBT与默认LLVM-CFI相结合,提出了一种更SHSTK 是 一 个 硬 件 影 子 堆 栈 , 新 添 加 的 影 子 堆 栈 指 针(%SSP)寄存器指向影子堆栈的顶部CALL和RET指令还将返回地址压入和弹出影子堆栈。当执行时,RET指令检查主堆栈和影子堆栈顶部的返回地址是否相同。如果没有,则会引发#CP异常为了存储受保护的影子堆栈,SHSTK引入了新的存储器页面类型,影子堆栈页面(即,shstk页面)。 SHSTK使用PTE中未使用的位组合来标识shstk页-R/W位(设置为0)和脏位(设置为1)[15]。也就是说,shstk页是只读脏页,并且常规存储器访问指令不具有写入许可,但是CPU能够在执行CALL指令时将返回地址存储在该页由于返回地址的不匹配可能发生在某些合法的场景中,例如C++异常处理,因此引入WRSS指令来修改shstk页面上的返回地址。WRSS指令有两种变体来支持不同的数据大小,即,WRSSQ(用于8字节)和WRSSD(用于4字节)。WRSSQ/WRSSD指令将8字节/4字节数据从64位/32位通用寄存器写入shstk页上的目的地址。此外,对于WRSSQ,目的地址必须8字节对齐,对于WRSSD,目的地址必须4字节对齐。如果不满足对齐要求,则会引发#GP异常减少幽灵的攻击。IBT确保间接JMP/CALL目标上的指令仅在目标上存在ENDBR指令时才推测性地执行,SHSTK确保当返回地址不匹配时,不会滥用返回堆栈缓冲区推测性地返回到某个位置Swivel [23]利用CET来加强WebAssembly对分支目标缓冲区(BTB)和返回堆栈缓冲区(RSB)的Spectre攻击。3概述在本节中,我们将概述使用SHSTK构建内存隔离技术的高级思想,以及针对此类用例的SHSTK架构和微架构特性的实证分析3.1CETIS:基于CET的隔离技术由于shstk页面只能由WRSS指令写入,而不能由其他内存访问指令写入,因此我们适时地改进了此属性以开发通用的内存隔离技术。为了进一步扩展,CETIS将隔离的内存区域设置为代码堆分离存储器区域阴影堆叠堆叠CCSXie et al.2992百分之一百五十百分之二百shstk页面,它只能由受信任的代码使用WRSS指令编写。 通过限制不可信代码使用WRSS指令的能力,可以有效地确保完整性。CETIS的高级思想如图1所示。它分配连续的shstk页面作为敏感内存区域来存储敏感内存对象。有一个保护页(即,只读页)。CETIS不排除SHSTK的正常使用,SHSTK可以分配其他shstk页作为影子堆栈来存储返回地址,并设置%SSP寄存器指向所述页。其他常规内存区域,如堆栈和堆,仍然被设置为正常内存页。隔离的内存区域只能由WRSS指令写入,并可以像往常一样任意读取由于CETIS将常规存储区域和隔离存储区域上的存储访问操作分开,因此它与现有的基于地址和基于域的隔离方法有着根本的不同。现有方法的核心思想是限制常规的存储器访问指令,例如,通过在基于地址的方法中限制地址范围和在基于域的隔离方法中控制访问权限。相比之下,CETIS引入了新的WRSS指令来访问隔离的内存区域,这限制了任何没有访问新指令的代码访问隔离的域。3.2威胁模型我们假设对手可以利用受害者程序中的漏洞来获得任意的内存读/写原语,但她还不能改变其控制流(尽管这可能是她的目标)。我们进一步假设系统软件,例如,操作系统和管理程序以及硬件是安全和值得信赖的。CETIS的威胁模型与之前的工作相同[17,27,39]。虽然CETIS被设计为通用的,但我们特别考虑了两个常见的用例。用例1. 受保护的程序可以是服务器程序,如Nginx Web服务器,或用户应用程序,如浏览器。部署内存损坏防御以防止攻击者劫持控制流。CETIS可用于保护由防御隔离的敏感内存对象和/或防御的元数据,例如CPI中的安全区域。我们假设防御机制已经正常运行。因此,防御机制确保攻击者不能发起代码注入攻击或代码重用攻击来执行非预期的WRSS指令;并且CETIS防止攻击者篡改敏感存储器对象,这是突破防御机制的先决条件。因此,防御机制和CETIS相互保护。用例2.受保护的软件集成了即时(JIT)编译器。攻击者的攻击目标是破坏代码缓存的完整性并向其中注入外壳代码,即,攻击者使用任意写原语直接修改代码高速缓存。CETIS可用于保护代码缓存免受此类攻击。在这种情况下,CETIS与JIT编译器上的其他隔离工作共享相同的威胁模型,例如libmpk [27]和ERIM [37]。3.3了解SHSTK和WRSS改进CET图2:软件影子堆栈机制和CET的SHSTK在SPEC CPU 2017 C/C++基准测试中的性能使用CETIS需要首先进行估计具体而言,我们的目标是实证分析以下属性:SHSTK导致的性能影响。由于CETIS需要启用SHSTK机制,因此使用CETIS的应用程序必须使用SHSTK机制。因此,我们需要评估SHSTK对应用程序造成的减速程度WRSS的延迟。由于CETIS使用WRSS指令将数据存储到隔离的内存区域中,因此我们需要测量WRSS的延迟以估计频繁存储的影响与MPK比较虽然提供了不同的抽象,但CETIS在用例方面与MPK非常相似。我们需要将CETIS与基于MPK的方案进行比较,后者通常被认为是最先进的隔离方法。SHSTK的其他属性。我们需要了解SHSTK是否仅限于保存数据,以及如果shstk页面也可以保存和执行代码,是否存在因此,我们在考虑上述目标的情况下进行了实证测试所有以下实验都是在具有Linux内核v5.10.0的 Intel(R)Core(TM)i7- 1165 G7 CPU上进行3.3.1SHSTK的绩效评估 我们使用SPEC CPU 2017 C/C++基准测试来评估软件实现的影子堆栈和英特尔CET基于SHSTK的影子堆栈的性能。 我们为软件影子堆栈使用了紧凑寄存器方案[2],它保留了%R15寄存器来存储影子堆栈的基址。我们评估了软件影子堆栈的性能,并没有基于MPK的隔离方法的保护。由于LLVM已经支持英特尔CET,因此我们在编译SPEC基准测试时直接使用Clang-7.0.1编译器来启用英特尔CET如图2、遗漏了6个测试用例,即,omnetpp_r/s、leela_r/s、parest_r和povray_r。这是由于当返回地址在主堆栈和影子堆栈上不 匹配 时触 发 #CP 异常 。 实验表 明, SHSTK ( geo_mean2.02%)在保护控制流的后向边缘方面是高效的。此外,SHSTK比没有隔离保 护的软件影子堆栈稍慢( geo_mean1.13%),但比具有基于MPK的保护的软件影子堆栈快得多(geo_mean 18.05%)。观察结果1:SHSTK效率高,可广泛部署。与基于软件的解决方案相比,CET百分之三百百分之二百二软件SS w/o软件SSw/ MPK CET的SHSTK2.02%百分之十八点零五百分之一点一三0%的百分比性能开销····CETIS:改进Intel CET以实现通用和高效的进程内内存隔离CCS2993→→观察2:WRSS的延迟大约需要9.3个CPU周期,比MOV指令慢。两种变体的乳杆菌,即WRSSQ和WRSSD是相同的。20016012080400WRSSQ(M)WRSSQ(H)MOVQ(M)MOVQ(H)1 2 3 45数目的指令20016012080400WRSSD(M)WRSSD(H)MOVD(M)MOVD123456789 10数目的指令120100806040200WRSSQPKMOV4 WRSSD8 WRSSD6 WRSSD4 WRSSQ5 WRSSQ3个WRSSQ02468 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40的字节图3:使用MOVQ/MOVD和WRSSQ/WRSSD以不同数量的指令写入数据的延迟(平均100万次重复)。M表示缓存未命中,H表示缓存命中。写操作的目标地址与缓存行对齐。1//在8字节对齐地址(dst)2asm易挥发的(3“移动 $0 x 61,%% r c x\n\t“//% rcx包含数据'a'4“mov(% 0),%% rax\n\t“//在dst读取8字节数据5“mov $0 x 0,%% a l\ n\ t“//清除最低1字节数据6“或%% r rax,%% r c x\n\t“//合并写入的数据7“wrssq %% r cx,(% 0)\n\t“ //写入合并后的数据8::“r“(dst):“r c x“,“rax“);清单1:使用WRSSQ将1字节数据写入8字节对齐地址的示例代码。3.3.2WRSS的延迟。 作为一种内存访问指令,WRSS与常规的内存访问指令MOV进行了比较。WRSS支持具有两种不同数据大小的存储器写入,即,WRSSQ与8B和WRSSD与4B。我们比较了WRSSQ和MOVQ,比较了WRSSD和MOVD。我们评估了WRSS和MOV在受控缓存未命中或缓存命中下的延迟 图图3(a)示出了使用具有不同数量的指令的MOVQ和WRSSQ写入数据的延迟,而图3(b)示出了MOVD和WRSSD的延迟。在本实验中,每个写操作的目标地址与高速缓存行(64字节)对齐。 我们可以看到,无论写操作是否遇到缓存命中或缓存未命中,写操作的延迟都是相同的,这可能归因于存储缓冲区(请参见附录中的进一步分析§A.0.1)。WRSSQ和WRSSD的潜伏期相同(均为9.3个周期),均比MOV(0.8个周期)慢。3.3.3与MPK比较 为了评估CETIS相对于基于MPK的隔离方案的性能,我们将WRSS与使用MPK的隔离内存更新进行了比较。 我们将PKMOV定义为以下顺序:启用写权限(WRPKRU)写入数据(MOV)禁用写权限(WRPKRU)。 我们构建了一个实验,比较了WRSS和PKMOV在不同数据长度下的写入延迟。为了满足WRSS的对齐要求,对目的地址进行了缓存线对齐.实验结果如图所示。四、 我们可以看到,由于支持更长的数据写入,WRSSQ的性能优于WRSSD。 当数据量小于或等于24字节时,WRSSQ的性能优于PKMOVQ。当数据大小增加到超过24字节时,PKMOVQ的性能优于WRSSQ。我们还可以看到,使用WRSSQ写入1字节到7字节数据的延迟略高于写入8字节数据的延迟。图4:写入(缓存命中)不同长度数据的延迟字节,写入9字节到15字节的延迟略高于16字节。这可能是由于需要额外的数据组合操作:WRSSQ只能写入具有固定长度的数据(即,8字节),目的地址必须8字节对齐。 数据组合如清单1所示,它提供了一个在8字节对齐地址dst写入单字节数据的示例。 它需要首先读取对齐地址处的数据(第4行),然后组合数据(第5行和第6行),并使用WRSSQ将组合数据写入对齐地址处(第7行)。如果地址不是8字节对齐的,则数据组合操作将更加复杂。观察3:当使用WRSS在任意地址写入任意长度的数据时,需要进行数据组合操作。当数据写入在24字节内时,WRSSQ的性能优于WRSSD,优于PKMOV。3.3.4shstk页面的其他属性。如第2.2节所述,shstk页面通过使用PTE中R/W位和脏位的未使用组合来识别因此,我们发现PTE中的其他位可以与shstk页的位集正交这一发现可用于实现其他令人感兴趣的机制。例如,由于可以在PTE中清除NX位,因此shstk页可以是可执行的;并且由于可以启用保护密钥位,因此shstk页也可以由MPK保护§3.3.2已经评估了写操作(即,WRSS),我们还评估了读取和执行操作。我们使用mov指令分别在20个连续的4KiB普通页和shstk页中顺序读取80KiB数据,以评估shstk页对读取操作的影响为了评估shstk页对执行操作的影响,我们设置了20个连续的4KiB代码页,其中包含连续的简单inc指令(具有寄存器操作数),并测量了这些页分别配置为正常页和shstk页后的指令延迟。我们发现(1)读取和执行操作没有额外的限制(例如,无对齐要求);以及(2)SHSTK页上的读取和执行操作的延迟与正常存储器页上的操作相同观察4:shstk页面可以执行以保护代码,并且在shstk页面上的读取/执行操作与普通页面之间没有区别3.4在CETIS中使用SHSTK的挑战基于上述观察,我们发现SHSTK是有效的,并且在一次写入少量数据的情况下,CETIS可以比基于MPK的方案执行得更好此外,CETIS可用于保护更通用的数据,例如潜伏期(周期)潜伏期(周期)CCSXie et al.2994CMCM~APTA%FSCETIS rt-compiler CETIS通过LLVM操作Cmfile00x2②结合在0x20x18暂存寄存器在0x18⑤结合Ⓐ结合两次追加2Bappend_pos=0x340x34缓冲区:保留%R14GS%文件文件③wrssq存储器①负荷斯图尔斯克附加ptr斯图尔斯克TRBLE0x20008字节8字节……高存储器(a) 对cmfile的写入和追加操作(b)CETIS图5:CETIS内存文件抽象及其数据结构。对用户完全隐藏 用户可以直接对cmfiles进行操作,以保证内存对象的完整性. CETIS负责将cmfile上的操作转换为相应的隔离内存区域上的操作。每个cmfile位置都是con-CETIS内存文件抽象CETIS支持OS英特尔CET硬件图6:CETIS框架。代码.然而,一些挑战使得WRSS对程序员来说很难:挑战-1。当使用WRSS指令写入任意长度的数据时,需要进行数据合并操作。基于地址对齐和数据长度的情况选择WRSS指令的最佳写入策略是具有挑战性的。挑战-2。WRSS指令不如MOV指令有效。为了完成给定的数据写入操作,需要使用尽可能少的WRSS指令。因此,缓冲小数据写入非常重要因此,确定如何维护和保护该缓冲区是具有挑战性的。在下一节中,我们将介绍CETIS框架,并展示CETIS如何应对上述挑战。4CETIS框架为了解决§3.4中列出的挑战,CETIS提供了一个软件框架(如图6所示),供开发人员轻松采用CETIS。具体来说,CETIS为隔离的内存区域提供了一个内存文件抽象一个隔离的内存区域被抽象为CETIS内存文件结构。对这些区域的访问是使用CETIS提供的一组API作为对文件的读/写来 作为一个软件框架,CETIS提供了一个静态库(即,图中的CETIS rt编译器。6)和修改的编译器工具链。4.1CETIS内存文件抽象如图5、将一个孤立的内存区域抽象为一个新的内存文件结构,简称cmfile(CETIS内存文件)。由于CETIS中的缓冲区设计类似于GNU C库中的文件缓冲区,因此选择了类似的文件抽象隔离内存区域和复杂WRSS用法的详细信息连续地映射到对应的隔离存储器位置。它们之间的差异是一个固定的偏移量,该偏移量为4KiB。cmfile支持两种不同的访问模式-读/写模式和追加模式。读/写模式。读/写模式允许用户在cmfile的任意位置读取和写入任意长度的数据。 由于读/写操作被直接转换为对隔离存储器区域的访问,因此不需要缓冲。在这种模式下,读取操作直接转换为具有mov的存储器加载,并且写入操作转换为具有WRSSQ的存储,其可选地通过具有mov的加载和数据组合操作来进行。例如,如图所示。在图5(a)中,在位置0x2处写入4个字节的数据将被转换为一个具有mov的存储器加载(①)、一个数据组合操作(②)和一个具有WRSSQ的写入操作(③)。由于数据组合操作高度依赖于地址对齐,因此如果可以静态地确定对齐,则可以优化操作。 对于图中的操作。在图5(a)中,8个字节的数据被写入位置0x18,它只需要一个WRSSQ指令(WRSSQ)。 为了支持自动对齐推断,CETIS利用LLVM中的已知位分析,该分析执行向后分析以证明值的每个单独位是0或1,并确定写入位置的最低3位是否已知。 如果它们是已知的,那么CETIS将使用这个对齐信息来优化这个写操作。CETIS还支持用户提供的对齐提示。 如果用户提供写位置的对齐提示,CETIS将使用此信息来优化所有相关的写操作。请注意,错误的对齐推断不会导致程序崩溃,因为它可以在CETIS中通过捕获#GP异常来延迟处理。追加模式。该追加模式的目的是支持小规模的数据在连续位置的cmfile的写入 在这种模式下,CETIS引入了写合并缓冲区,它集成了缓存和缓冲的思想,只在需要时才将缓冲区刷新到隔离的内存区域。CETIS保留一个64位通用寄存器%R14,用作缓冲区,在cmfile中的8字节对齐位置缓存最多8字节的数据。用户可以在~运行时防御CPICFIXX安全区域元数据附录敏感代码敏感数据初始化状态stateA初始化状态时间时间基地大小aptr_tab_idx基地大小aptr_tab_idxappend_ptr1append_ptr0电流Isol指定的内存区域CETIS:改进Intel CET以实现通用和高效的进程内内存隔离CCS2995∼的cmfile。引入一个名为append_ptr的内存指针,用于存储从该指定位置转换的内存位置每个附加操作将在append_ptr处附加数据,然后将append_ptr增加该附加数据的大小。缓冲区始终缓存从对齐地址append_ptr 0x7开始的8个字节的数据。一旦append_ptr到达缓冲区的bound-ary,缓冲区将被同步,即,将其内容刷新到相应的存储器块中,然后从存储器加载接下来的8个字节的数据图在图5(a)中,两个连续的附加操作(每个附加来自位置0x34的2字节数据)将被转换成两个数据组合操作(数据合并和数据合并)到缓冲器中。由于append_ptr到达缓冲区的边界,缓冲区的内容将使用WRSSQ(NULL)刷新到隔离的内存区域。如果由于用户更改起始附加位置而导致append_ptr超出缓冲区的边界,则缓冲区将被同步,即,在新的对齐地址处刷新和加载用户还可以使用CETAS提供的同步操作随时刷新/加载缓冲区支持多个cmfiles。每个隔离的内存区域对应于一个cmfile。CETIS支持每个进程有多个cmfile。然而,当操作多个cmfile时,追加模式引入了新的挑战:写入组合缓冲区%R14必须由所有cmfile共享; CETIS在对不同cmfile执行追加操作时需要切换缓冲区,为此引入了当前cmfile的概念。用户只能对当前的cmfile执行追加操作,因此需要显式切换当前的cmfile来对其他的cmfile执行追加CETIS在切换之前刷新缓冲区的内容,并在切换之后从另一个cmfile加载它CETIS中的数据结构 如图 5(b),为了描述一个cmfile,CETIS引入了一个叫做CMFILE的结构(类似于GNU C Library中的FILE),它包含三个字段:base是对应的隔离内存区域的基址; size是隔离内存区域的大小; aptr_tab_idx是这个cmfile的append_ptr在APTR_TABLE中的索引,其中包含了所有cmfile的append_ptr。为了指示当前的cmfile,CETIS引入了一个名为CURRENT的内存指针,它指向当前的CMFILE。为了支持多线程,APTR_TABLE和CURRENT存储在线程本地存储区域的专用页中(位置%FS-PAGE_SIZE)。由于隔离区域可以在线程之间共享,因此所有CMFILE都存储在由%GS寄存器指向的专用页CETIS数据结构的完整性CETIS中的所有数据结构都存储在shstk页面上,包括append_ptr。 这些数据结构的更新需要使用WRSSQ。由于append_ptr需要在每个追加操作中更新,因此对每个追加操作使用WRSSQ将抵消缓冲的性能增益为了解决这个问题,CETIS保留了%R15寄存器来存储append_ptr的值在追加操作期间,CETIS只需要更新%R15寄存器。 切换cmfiles时,需要同步此寄存器,即, 将其值存储到APTR_TABLE中被切出的cmfile的append_ptr中,并从被切入的cmfile的append_ptr中加载该值。4.2维护非同步模式缓冲区如第4.1节所述,CETIS需要为缓冲区和中的append_ptr保留两个通用寄存器%R14和%R15附加模式。接下来我们讨论如何防止这些寄存器被不相关的代码使用(§4.2.1),以及如何确保这些寄存器中缓冲值的一致性(§4.2.2)。4.2.1避免缓冲区损坏。直觉上,如果这两个寄存器在整个程序中被保留,则可以使用编译器辅助方法来避免寄存器的损坏。然而,这需要CETIS重新编译所有共享库,这可能是不切实际的。因此,CETIS选择有选择地保留这两个寄存器,而不是在整个程序中-只要代码文件中有一个函数使用附加模式缓冲区,则此代码文件所在的同一文件夹中的所有函数都被假定为保留寄存器。这可能是粗粒度的,但它已经在频繁同步操作的开销和在太多函数上保留寄存器的开销之间实现了良好的平衡。为了方便讨论,我们将使用附加模式缓冲区的函数表示为rsvdFunc,并将其他函数表示为nmlFunc。 CETIS在编译期间识别所有rsvdFunc和nmlFunc,并在(1)rsvdFunc调用nmlFunc时和(2)nmlFunc调用rsvdFunc时强制同步缓冲区(包括%R14和%R15)。然而,精确识别rsvdFuncs和nmlFuncs之间的所有转换是一项挑战。 为了确保完整性,我们采用了保守的策略,这可能 会 导 致 不 必 要 的 寄 存 器 同 步 , 但 不 会 遗漏:( 1 )在rsvdFunc中,同步将被插入到对nmlFunc的直接/间接调用的调用站点, 因 为 控 制流 可能 在这些调用站点从 rsvdFunc 转移到nmlFunc;(2)同步将被插入到从nmlFunc到rsvdFunc的控制流转换处,即,直接或间接被nmlFunc调用的所有rsvdFunc的入口处。只有一个rsvdFunc是一个全局函数或者它的地址已经被占用,它将被nmlFunc识别为一个可能的间接调用目标如果它也是rsvdFuncs的直接调用目标,则此rsvdFunc将被克隆为两个变体:一个仍然具有同步;另一个没有,仅用于rsvdFuncs的直接调用4.2.2保持缓冲区一致性。缓冲区由CETIS隐式同步或由用户显式同步。为了便于讨论,我们使用append_ptr(reg)表示%R15,使用ap-pend_ptr(reg)表示存储在APTR_TABLE中的append_ptr。同步操作包含缓冲区的刷新/加载操作和append_ptr(reg)的存储/加载操作隐式同步。三种情况可能触发缓冲区和append_ptr的隐式同步:缓冲同步。由append_ptr更改引起 当ap-pend_ptr(reg)超过(由于用户的设置)或达到(由于追加操作的增加)缓 冲 区 的 边 界 时 , CETIS 将 刷 新 缓 冲 区 并 在 当 前append_ptr的对齐地址处加载8字节的数据。Buffer/append_ptr同步。由cmfile开关引起。当切换cmfiles时,CETIS需要同步buffer和append_ptr。在切换之前,CETIS刷新缓冲区并将append_ptr(reg)存储到append_ptr(reg)中;在切换之后,CETIS将切换进来的cmfile的相应内存块加载到缓冲区中,并从切换进来的cmfile的append_ptr(reg)加载 append_ptr(reg)··CCSXie et al.2996表1:CETIS API目录API描述intcetis_init(void)CETIS初始化。1CMFILE *cmf_open(size_t len,
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 探索数据转换实验平台在设备装置中的应用
- 使用git-log-to-tikz.py将Git日志转换为TIKZ图形
- 小栗子源码2.9.3版本发布
- 使用Tinder-Hack-Client实现Tinder API交互
- Android Studio新模板:个性化Material Design导航抽屉
- React API分页模块:数据获取与页面管理
- C语言实现顺序表的动态分配方法
- 光催化分解水产氢固溶体催化剂制备技术揭秘
- VS2013环境下tinyxml库的32位与64位编译指南
- 网易云歌词情感分析系统实现与架构
- React应用展示GitHub用户详细信息及项目分析
- LayUI2.1.6帮助文档API功能详解
- 全栈开发实现的chatgpt应用可打包小程序/H5/App
- C++实现顺序表的动态内存分配技术
- Java制作水果格斗游戏:策略与随机性的结合
- 基于若依框架的后台管理系统开发实例解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功