Introduce

《TeeRex: Discovery and Exploitation of Memory Corruption Vulnerabilities in SGX Enclaves》是Tobias Cloosters、Michael Rodler、Lucas Davi发表在USENIX Security 2020的论文。主要讨论了使用符号执行技术挖掘SGX软件层内存破坏(Memory Corruption)漏洞,这一类漏洞的特征包括跨越Host-to-Enclave Boundary(这是内存破坏漏洞的Root Cause)。

该文还试图分析现实世界中与SGX相关的内存错误的存在情况。开发者移植传统软件进入Enclave时往往会忽视SGX的特殊性并引入安全漏洞,此外漏洞也包括传统软件自带的漏洞。

架构


⋆\star⋆符号执行技术模拟支持OS系统调用和文件系统是一件很难的事,但好在Enclave是自包含的,只能通过OCALL和OS打交道。

TEEREX主要利用了ANGR来作为Symbolic Explorer,但ANGR并不能直接执行Enclave:1)ANGR不能从Host APP跳转到Enclave,2)缺少相关环境条件来直接执行ECALL,3)Enclave使用了ANGR不支持的CPU指令ENCLU,4)ANGR原先受限于单线程,TEEREX利用Enclave特点将执行过程扩展到多进程和多机器上,5)ANGR不支持用于内存分配的常见的可信函数(注:由SGX SDK可信库实现的)。

Preprocessor: 图 3 中第一步是对Enclave二进制文件进行预处理,1) 识别不能符号执行的指令和函数,2)定位 ECALL表并提取ECALL地址。初步的静态分析有助于插桩特定二进制指令以提高分析性能和覆盖范围。

Enclave Loader: Enclave Loader设置初始环境以执行ECALL。采用Python代码模拟并替换识别出的通用函数和特殊指令。使用无约束的符号值(Unconstrained Symbolic Values)作为ECALL的参数。

Symbolic Explorer: ANGR符号执行可以部署到多台机器上,一个原因是ECALL可被单独测试分析,结果最后合并到漏洞报告交给分析人员。

Vulnerability Detection: TEEREX分析ANGR符号执行时的符号状态以挖掘Enclave漏洞。 针对性分析访内和跳转指令。(ANGR本身不支持漏洞检测)

Pointer Tracking: SGX Enclave中大多数漏洞源于不安全的指针使用及缺乏指针验证。 TEEREX分析指针解引用及符号值之间的传播标签两种情况以实现指针跟踪。具体来说,TEEREX使用污点分析标注从内存加载的每个值及对应的地址。 帮助TEEREX确定值的来源,例如判断用于间接调用的函数指针来源于Enclave、Host内存还是ECALL传参。

SGX SDK中有时无法判断一个指针(符号)是在Enclave内还是外,TEEREX会插桩Hook点,符号执行到Hook点时会分叉(Fork),一个假设地址在Enclave内继续符号执行,一个假设地址在Enclave继续外符号执行。

Vulnerability Report: TEEREX 生成漏洞报告,包括1)漏洞类型、2)在二进制文件中的位置、3)被控制的指针及其在攻击者输入中所处的位置、4)触发漏洞指令的执行轨迹。漏洞报告为分析人员提供详细信息,以构建POC利用,对于闭源Enclave也适用。

架构设计中的挑战

C1: Accuracy and Scalability 由于1)Enclave初始化过程会造成许多访存操作,很难被符号执行引擎处理[5,12]_{[5, 12]}[5,12]​;2)Low-Level的tRTS在符号执行中缺少语义信息;3)tRTS和ECALL比较分离,分析tRTS对分析ECALL而言意义较弱,因此可以绕过对tRTS的符号执行,提取ECALL表并执行对ECALL进行符号执行。这还有助于ECALL符号执行的并行化(原始的ANGR只能单线程执行)。

C2: Standard Memory Functions(注:SGX SDK向Encalve了提供的可信版本的内存操作函数库,它经过安全审计,能被静态链接到Enclave,并避免依赖于不可信环境提供的内存操作函数。)对其符号执行会生存复杂路径,这不适合进行进一步分析,因此对其Hook并替换成SimProcedure。

C3: Unsupported CPU Instructions 由于SGX的引入,有些CPU指令对于ANGR来说太新了(如ENCLU),或者很难实施符号执行(如rdrand和xsave/xrstor),因此绕过或者简化这些指令过程。

C4: Global State of Enclaves and Chains of ECALLs Enclave外可以多次调用ECALL,历史ECALL可能对Enclave全局状态产生影响。因此单独分析ECALL时将全局状态用无约束符号值进行初始化。这可能产生误报,但误报的内容可能启发新的利用原语。

漏洞利用原语及对应的检测组件

Control-Flow Hijacking 攻击者控制的数据被标记为无约束符号值,如果跳转目标是无约束符号值,TEEREX就发出警报。不然符号执行引擎会不断收集约束情况。

Controlled Write 检测用于写内存的地址是不是受攻击者控制。约束求解判断内存写地址是否是可以指向任意地址,判断是否是一个任意写Gadget。任意写可导致指针被篡改并指向Encalve外。

NULL-Pointer Dereference 检测是否发生NULL指针解引用。它的重要性在于0地址(即NULL)是属于不可信地址空间的(注:Encalve虚拟地址ELRANGE一般在虚拟进程空间的高地址处,一个原因是Enclave是动态库形式链接到Host APP的)。

Enclave分析结果

分析的过程包括三步:

  1. 用TEEREX分析Enclave
  2. 基于分析报告验证漏洞,并分析Root-Cause
  3. 构建利用POC

表1是TEEREX挖掘漏洞的对象。

作者还总结了五种漏洞类型Pattern(注:但实际符号执行过程中的检测标准感觉更加Low-Level):

  1. P1: Passing Data-Structures with Pointers
  2. P2: Returning pointers to enclave memory
  3. P3: Pointers to Overlapping Memory
  4. P4: NULL-Pointer Dereferences
  5. P5: Time-of-Check Time-of-Use

表2是目标Project存在的漏洞类型和利用原语。

Intel GMP Example(下面几节是漏洞例子介绍)


图4代码中,e_mpz_add位于Enclave内,完成加法操作。攻击者可以让a_unsafe存储恶意输入(如恶意代码),b_unsafe存储0值,用于记录输出结果的c_unsafe地址指向Enclave内,当e_mpz_add执行后,可以任意修改(覆写)Enclave内存(如Enclave内可信栈)。

更加根源性的问题是Enclave允许指针及包含指针的复杂结构传入(指针跨越Host-to-Enclave Boundary),但Enclave内未对指针进行递归检查。即P1: Passing Data-Structures with Pointers。可能的防御措施包括将传参的值序列化,避免使用指针。

WolfSSL Example Enclave


正常逻辑中,用户使用enc_wolfSSL_new(ECALL)创建的Context再调用enc_wolfSSL_connect(ECALL)完成SSL连接。然后攻击者可以事先将假的Context用enc_wolfSSL_CTX_use_PrivateKey_buffer(ECALL)传入Enclave内,由于enc_wolfSSL_connect只判断Context是不是在Enclave,并没有判断它是不是真实有效的Context,使得enc_wolfSSL_connect使用假的Context(传参地址指向假的Context)完成后续操作。即P2: Returning pointers to enclave memory。此类问题同样存在于其它TLS Enclave实现中。

可能的防御措施包括改用ID来指代Context(比如用哈希表存放Context指针:一个哈希表地址保存一个Context指针,由ID值来指向哈希表地址),Enclave内保存Context白名单。

Rust SGX SDK’s tlsclient/server


基于Rust SGX实现的TLS Code也有类似于WolfSSL Example Enclave中提到的问题。图6中,tls_client_write会用到tls_client_new生成的session指针,这个指针本身就在Enclave内,因此得使用[user_check] 注释,[in]、[out]等注释并不适用。tls_client_write中使用假的session,会进而使用假session中的虚表进行函数跳转,从而被控制流劫持。(RUST号称内存安全语言,同样也遭遇了内存破坏。)

另一个较为独立的问题是,图6的➁错误地使用rsgx_raw_is_outside_enclave函数(应该使用not rsgx_raw_is_within_enclave),➁的本意是要求session必须严格存在于Enclave内,但是它只对严格处于Enclave外的内存块进行了错误处理,当session一部分处于Enclave内一部分处于Enclave外的时候,能够绕过这个错误检测。即P3: Pointers to Overlapping Memory

论文中提供图7来表述sgx_is_outside_enclave、sgx_is_within_enclave函数的区别。(这两个函数是Intel SGX SDK中的命名,rsgx_raw_is_outside_enclave、rsgx_raw_is_within_enclave是RUST SGX中的命名。)

TaLoS


TaLoS基于libressl TLS implementation构建了TLS Enclave,它通过ECALL尽可能将TLS API向Enclave外暴露,API中的指针大量用[user_check]注释。暴露的问题包括:

  1. TaLoS中对某些API相关的SSL数据构造了影子机制(Shadowing Mechanism),Enclave外可以操控SSL数据,Enclave内保存了真实的SSL数据用于合法指针验证等功能。但是由于API过于复杂,有些SSL数据缺少Shadowing。
  2. 处理Shadowing Mechanism的相关代码被识别出存在漏洞。
  3. 未考虑NULL指针解引用问题。0虚拟地址实际处于不可信环境,由于0地址没有对应的内存映射,会触发段错误 →\rightarrow→ 页错误,但这可被操作系统控制,如将对0虚拟地址添加映射。即P4: NULL-Pointer Dereferences。(注:这一点感觉非常新颖,体现SGX的特殊性之一)

例子如图8:

  1. ➀处未判断out_s是否指向Enclave外。
  2. ➁处未判断in_s是否NULL。
  3. ➂处,如果out_s指向Enclave内敏感信息,in_s为NULL,那么敏感信息会被泄漏到0地址,构成任意读
  4. ➄处,如果out_s指向Enclave内敏感信息,in_s为NULL,那么NULL处的内容会被写到out_s指向的Enclave内,构成任意写(需要线程调度控制,在任意写之前,在0地址写入指定内容)
  5. 假设攻击者能够控制OS及Enclave线程调度,针对不可信环境的数据,在Enclave内检查操作和使用操作中间,攻击者能够暂停Enclave代码执行并修改不可信环境数据,触发TOCTOU Bug。即P5: Time-of-Check Time-of-Use

Synaptics SynaTEE Driver(闭源)

该驱动使用了用户态的Enclave处理指纹数据。

第一个漏洞利用原语。正常使用时,Enclave内的全局状态指针(默认为NULL)先被初始化(ECALL1)后被使用(ECALL2)。但攻击者可以选择不初始化该Enclave内全局状态(注:可能是不调用对应的ECALL1),使得指针仍然为NULL,之后使用全局状态指针(ECALL2),相关的Enclave内容被写到NULL地址。但Windows禁止0地址映射(需要修改Windows内核来关掉这个禁止机制)。

第二个漏洞利用原语。TEEREX在Enclave中找到一个受限写操作利用原语。可实现的具体攻击过程中,第一步,将Enclave全局状态指针改写成指向Enclave外(非0地址);第二步,如上一段所说调用ECALL2将Enclave内容写到被篡改的全局状态指针(被指向Enclave外)上,进而引起控制流劫持。

Goodix Fingerprint Driver(闭源)

该驱动使用Enclave来处理生物数据。

第一个漏洞利用原语C16_{16}16​,从0地址(NULL)拷贝16bit到攻击者控制的ECALL传参所指定的地址(需要关掉Windows禁止0地址映射机制)。

第二个漏洞利用原语F64_{64}64​【Full (64-Bit) Arbitrary Write】,从Enclave内的固定地址A拷贝64bit到攻击者控制的ECALL传参所指定的地址。

C16_{16}16​+F64_{64}64​ ⇒\Rightarrow⇒ C16_{16}16​能够将0地址64Bit分四次(每次16Bit)拷贝到Enclave内固定地址A,F64_{64}64​能够将固定地址A内容拷贝到攻击者控制的ECALL传参指定的地址(如Enclave可信栈的Return Address)。(注:为什么不直接C16_{16}16​四次完成这个功能?因为存在某些影响因素?)

实验(性能和内存使用情况)

实验环境为AMD EPYC Processor with 3.7 GHz100 GB RAM、ANGRv8.20.1.7 running on CPython 3.6.9、Ubuntu 18.04.4。TEEREX针对每个ECALL符号执行,使用一个CPU核、24GB上限的内存、20分钟。每个ECALL平均消耗8.8GB内存(方差为9.8GB,方差大的原因是有的ECALL很大很复杂)。文中还指出符号执行的方法需要消耗巨大的计算资源(CPU和内存)。(注:是否有消耗小的方法?)

本文认为TEEREX误报率应该很小,但是由于这些漏洞是0-day的缺乏真实参照值,因此无法做误报率评估。本文称没有其他针对SGX的自动漏洞发现工具可用于比较【注:Coin Attack(ASPLOS’2020.5)早于TeeRex(Sec‘2020.8)】。TEEREX使用被修补过的三个项目(Intel GMP Example、Rust SGX SDK’s tlsclient和WolfSSL Example Enclave)来检测TEEREX的误报率。

TEEREX在未修补的三个项目中找到149个Findings,用浅层路径(约束少,易求解)构建POC。三个项目被修复后,可被利用的漏洞不再能被TEEREX检测出,剩下56个Findings指示了TEEREX的误报原因:全局状态被TEEREX用无约束符号值表示会导致误报(初始化ECALL中对全局状态指针的设置被误报,只能取固定值的函数指针被当作无约束符号值)(注:可以改进的点?)。

讨论

TEEREX后续打算对OCALL也进行符号执行,但OCALL和ECALL Return都会用到EEXIT,很难区分。TEEREX目前使用了符号信息(二进制文件下很难获得符号信息)避免混淆OCALL或ECALL返回,并将OCALL返回值用无符号约束值表示(即绕过了对OCALL的符号执行)。

目前需要手工分析TEEREX生存的报告,后续想构建利用生成方案(Exploit Generation Schemes)自动生成漏洞利用POC。

Fuzzing能够分析大型复杂Enclave,避免路径爆炸。但困难包括:

  1. 针对ECALL接口的变异策略很难确定。(注:⋆\star⋆)
  2. Fuzzing需要插桩二进制,目前针对Enclave中还没有可用方法。
  3. 针对未开源的Enclave Binary,整合一套动态分析工具非常难。
  4. SGX保护机制阻止了二进制插桩(注:考虑到有些Enclave Binary未开源)
  5. 静态二进制插桩很难准确重写Enclave Binary。

但是符号执行相较于Fuzzing的优势是能完全掌控模拟环境、更加灵活(简化符号漏洞检测器的实施和集成)。

其他

(⋆\star⋆尽管有了Enclave,但假设内核完全不可信并保护程序是一件很难的事情)

《BOOMERANG: Exploiting the Semantic Gap in Trusted Execution Environments》中Normal APP利用TrustZone贡献Normal OS(⋆\star⋆有点意思)

《PARTEMU: Enabling Dynamic Analysis of Real-World TrustZone Software Using Emulation》是TrustZone下的Fuzzer。

CVE

current_description cve_id cvss2_score cwe paper project result reference
Incorrect parameter validation in the synaTee component of Synaptics WBF drivers using an SGX enclave (all versions prior to 2019-11-15) allows a local user to execute arbitrary code in the enclave (that can compromise confidentiality of enclave data) via APIs that accept invalid pointers. CVE-2019-18619 4.6 MEDIUM CWE-763 Release of Invalid Pointer or Reference TeeRex: Discovery and Exploitation of Memory Corruption Vulnerabilities in {SGX} Enclaves synaTee组件 任意代码执行 https://support.hp.com/hk-en/document/c06696568 (Patch, Third Party Advisory); https://support.lenovo.com/us/en/product_security/LEN-31372 (Patch, Third Party Advisory); https://www.synaptics.com/company/blog/ (Vendor Advisory); https://www.synaptics.com/sites/default/files/fingerprint-driver-SGX-security-brief-2020-07-14.pdf (Vendor Advisory); https://www.syssec.wiwi.uni-due.de/en/research/research-projects/analysis-of-tee-software/ (Vendor Advisory);

《TeeRex (Sec‘20)》笔记相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 什么是JavaBean
  2. 丢掉uVision2吧,uVision早就有了
  3. java中static代码块与非静态代码块
  4. 阈值Java_OpenCV简单阈值
  5. 单调谐回路谐振放大器等效电路分析_手把手教你如何分析三极管电路
  6. 【C++深度剖析教程32】new/malloc区别 delete/free区别
  7. LeetCode 1101. 彼此熟识的最早时间(排序+并查集)
  8. 让程序员设计界面的后果
  9. lemur run PLSA
  10. dao-service-servlet-jsp构建简易web通讯录(三层开发)预备知识
  11. perl亲身试验ini---使用perl读写配置文件
  12. linux-ubuntu 安装mysql5.7.19的一些坑
  13. JAVA循环结构、break、continue、循环嵌套
  14. 我的世界服务器哪个有自动铺路,超简单命令方块铺路机 我的世界自动铺路机制作教程(附存档)...
  15. java integer最大值_java int型最大值/最小值,最大值+1,最小值-1
  16. 04-Redis 数据持久化实践
  17. php背景自动切换图片,威联通NAS自动更换背景图片
  18. 低密度奇偶校验码(LDPC)
  19. vue移动端横屏手写签名
  20. pod install error(NoMethodError - undefined method `size’ for nil:NilClass)

热门文章

  1. 【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络
  2. 球球大佬们帮忙分析win10蓝屏dmp!!
  3. 散列表,(拉链法,平方探测法,线性探测法)
  4. Matplotlib颜色、线宽、线型、透明度、点型
  5. 今年晋升本没抱希望,已有绩效更好的同事将参加晋升,leader却临时让我也去答辩,怀疑自己被拉去陪跑,该怎么办?...
  6. 即将迎来M2的 MacBook Pro升级款 M2 Pro版本MacBook Pro或将于2023年3月发布
  7. OpenCV实战之人脸美颜美型(四)——肤色检测
  8. jmeter无法启动,jmeter启动后找不到java环境问题
  9. 英语笔记(单词来自Shiro文档)02
  10. 自己撸一个Wordcount