今天为大家分享VUL337团队的陈星曼同学在USENIX Security 2023发表的MTSan: A Feasible and Practical Memory Sanitizer for Fuzzing COTS Binaries。
Sanitizer 与 Binary Sanitizer
模糊测试中,为了及时发现触发的漏洞,研究人员往往部署消毒剂技术,即 Sanitizer。例如,最常用的消毒剂 Address Sanitizer[1] 被广泛用于检测基于空间的内存安全违例(如缓冲区溢出),以及基于时序的内存安全违例(如堆释放后重用)。
然而,适用于 Binary 的 Sanitizer 数量较少,仅有 Valgrind[2]、ASan-Retrowrite[3]、QASan[4] 可用(补充:截止本文撰写时,BoKASan[5] 尚未发布)。它们和 Address Sanitizer 类似,基于 Redzone 实现(见上图),且不可避免的存在一些局限性。
-
仅支持堆对象;该问题由编译过程中边界信息的缺失导致;
-
即使内存对象的边界信息可用,仍然无法支持栈和全局变量对象;该问题由二进制程序内存布局调整的困难导致。
-
运行时开销较大;该问题由各 Sanitizer 采用的技术路线导致,例如 DBI 框架可能导致大量时间开销,而 Redzone 可能导致大量内存开销。
Memory Tagging Extension
作者就如何改进 Binary Sanitizer 进行了思考,而近年来 ARM 引入的硬件特性 MTE[6] 引起了作者的注意。简单而言,ARM 在 ARMv8.5-A 指令集中引入了内存标记扩展指令,由地址(指针)标记和内存标记组成;运行时基于硬件检查指针标签和访问目标地址是否匹配,从而检测内存安全违例。
由此作者想到,假设边界信息可用,可以基于此硬件特性有效检测内存安全违例!此方案不需要改变内存布局,且避免引入大量运行时开销,有效解决了局限性二和三,计划通!
等一下,边界信息呢?
内存对象的属性
另一种思路是动态恢复变量属性信息,例如 Reward[8] 和 Howard[9]。然而,这些方法同样无法直接用于二进制程序的模糊测试,因为良性和恶意输入混合在一起,而 Reward 和 Howard 必须事先使用良好测试集进行训练。
听上去不妙🤔
AoE II 的启示
Binary Sanitizer 改良计划无法正常实施了吗?思考的同时,作者不小心打开了帝国时代二决定版,为此问题的解决带来了一些启发。
帝国时代2(Age of Empires II [10])是一款古老的即时战略游戏。游戏中,玩家需要经营城市并建立军事力量,并与其他文明进行战争。某文明的单位,只应在该文明的土地进行耕种或巡逻;而该单位访问的土地,应被视为该文明的势力范围。
然而,当两个文明的单位访问同一块土地时,而该土地只应属于一个文明。尽管该土地所属并不明确,但可以确定的是战争一触即发。
如果将“单位”理解为指针,将“土地”理解为内存空间,该思路能不能用于检测发生在内存中的安全违例呢?
MTSan 的工作流程
为了便于解释该过程,作者使用 libxml2 中的漏洞 CVE-2017-9047 作为示例。CVE-2017-9047 是 libxml2 库中的一个栈溢出漏洞,漏洞位于函数 xmlSnprintfElementContent 中,第 14 行的长度检查存在问题,其在对 buf 的长度检查中使用了初始值 len,当 buf 的长度超出了该缓冲区的最大长度时,则会触发栈溢出。
当目标漏洞触发时,expr 的相邻内存对象被覆盖,包括 list、stack canary 和 return address。然而,由于 list 的长度为 5,000,所以此缓冲区溢出很难直接导致程序崩溃,且现有的 Binary Sanitizer 暂时无法支持此类栈缓冲区溢出的检测。
Progressive Object Recovery
而模糊测试中,MTSan 无法假设良性和恶性测试用例的出现顺序。若恶性测试用例在良性测试用例之前出现,MTSan 仍然按照同样的方式推断变量 expr 和 list 的边界,而该输入导致 MTSan 作出了错误的推断,得出 expr 变量长度大于 5,000 字节的推断结果。然而,此错误的存在是暂时的,后续执行中,MTSan 会继续推断变量 list 的边界,此时变量 expr 和 list 的边界将出现冲突,这预示着缓冲区溢出漏洞被触发。
听上去不错!那如何避免推断错误导致的误报呢🤔
Adaptive Sanitization
MTSan 将所检测到的内存错误分为两个级别,并分别应用不同的处理策略。如果某内存错误仅依赖于确定性属性的检查(如堆块大小),MTSan 将其分类为严重错误,MTSan 将终止此次执行,并直接报告此错误。对应地,当被检测到的内存错误依赖于非确定性属性的检查(如推断得到的边界),将被分类为非严重错误,MTSan 将记录测试用例并恢复模糊测试过程,同时进行回归模糊测试。
听上去不错!和已有方案相比效果如何🤔
实验评估
真实漏洞数据集实验评估结果
除此之外,作者还评估了各个 Binary Sanitizer 在模糊测试中的实际表现,由于目前支持 MTE 的商用硬件仍不可用,作者采用了模拟指令和 libMTE 两种方案对 MTSan 的实际性能进行测试。结果表示,MTSan 在引入较小运行时开销的同时,可以检测到更多的漏洞。
模糊测试评估中目标程序每秒平均执行次数
在模糊测试评估中,作者还进行了一些统计,包括渐进式对象恢复的效果、收敛性分析,以及回归模糊测试的有效性分析等,具体数据可以参考论文原文。
看上去不错!但貌似此方案也无法检测到所有漏洞🤔
局限性
-
MTE 粒度限制:MTE 将每个对齐于 16 字节的内存块与一个内存标记相关联。由于此硬件限制,MTSan 无法检测到发生在这些 16 字节内存块内的溢出,这可能导致漏报;
-
复合对象:当对象的长度小于 16 个字节,或者内存对象的边界未对齐到 16 字节时,MTE 无法为单个内存对象分配标记。为此,MTSan 引入了复合对象的概念,将相邻且未对齐到 16 字节的多个对象视为同一对象。然而,MTSan 无法检测到发生在复合对象内的溢出,这可能导致漏报。
除此之外,还可以在原文中找到更多局限性的讨论。然而,通常而言,Binary Sanitizer 无法检测到所有内存错误;希望在此基础上,研究者们可以开发更强力的 Binary Sanitizer,本文抛砖引玉的目的也就达到了!
论文下载:
https://www.usenix.org/system/files/sec23fall-prepub-279-chen-xingman.pdf
VUL337 团队简介
张超博士,清华大学长聘副教授,蓝莲花战队教练、华为冠名教授、CCF杰出会员。曾获国家级青年人才、清华大学“学术新人奖”、MIT TR35 China等奖励和荣誉。在国际四大安全会议上发表论文数十篇。提出的自动漏洞挖掘、利用、防御方案分别获得了腾讯 CSS 安全探索论坛专业奖/突破奖、微软 BlueHat 竞赛特别提名奖、华为优先合作奖、FATE社区年度技术特别贡献奖等;带队研发的系统获得了 DARPA CGC 机器自动攻防竞赛初赛防御第一、决赛攻击第二。
作者简介
陈星曼(星博),清华大学计算机系博士生,蓝莲花、Tea-Deliverers 战队队员,导师为张超副教授与段海新教授,来自清华大学软件与系统安全课题组(VUL337)。他的主要研究方向是软件与系统安全,他在 Usenix Security、CCS、TDSC、DAC 等国际学术会议与刊物上发表多篇论文。他还参加过多项国内外知名竞赛,曾多次在 Defcon CTF、强网杯、Geekpwn 等中获奖。
引用
[1] Serebryany K, Bruening D, Potapenko A, et al. AddressSanitizer: A fast address sanity checker [C/OL]//Heiser G, Hsieh W C. 2012 USENIX Annual Technical Conference, Boston, MA, USA, June 13-15, 2012. USENIX Association, 2012: 309-318. https://www.usenix.org/confe rence/atc12/technical-sessions/presentation/serebryany. [2] Nethercote N, Seward J. Valgrind: A framework for heavyweight dynamic binary instrumentation[C/OL]//Ferrante J, McKinley K S. Proceedings of the ACM SIGPLAN 2007 Conference on Programming Language Design and Implementation, San Diego, California, USA, June 10-13, 2007. ACM, 2007: 89-100. https://doi.org/10.1145/1250734.1250746. [3] Fioraldi A, D’Elia D C, Querzoni L. Fuzzing binaries for memory safety errors with qasan [C/OL]//IEEE Secure Development, SecDev 2020, Atlanta, GA, USA, September 28-30, 2020. IEEE, 2020: 23-30. https://doi.org/10.1109/SecDev45635.2020.00019. [4] Dinesh S, Burow N, Xu D, et al. Retrowrite: Statically instrumenting COTS binaries for fuzzing and sanitization[C/OL]//2020 IEEE Symposium on Security and Privacy, SP 2020, San Francisco, CA, USA, May 18-21, 2020. IEEE, 2020: 1497-1511. https://doi.org/10.1109/SP40000. 2020.00009. [5] BoKASan, https://www.usenix.org/system/files/sec23fall-prepub-325-cho-mingi.pdf [6] ARM. Armv8.5-A memory tagging extension. whitepaper[EB/OL]. 2019[2022-12-29]. https://developer.arm.com/-/media/Arm%20Developer%20Community/PDF/Arm_Memory_Taggi ng_Extension_Whitepaper.pdf. [7] Zhang Z, Ye Y, You W, et al. OSPREY: recovery of variable and data structure via probabilistic analysis for stripped binary[C/OL]//42nd IEEE Symposium on Security and Privacy, SP 2021, San Francisco, CA, USA, 24-27 May 2021. IEEE, 2021: 813-832. https://doi.org/10.1109/SP 40001.2021.00051. [8] Lin Z, Zhang X, Xu D. Automatic reverse engineering of data structures from binary execution [C/OL]//Proceedings of the Network and Distributed System Security Symposium, NDSS 2010, San Diego, California, USA, 28th February - 3rd March 2010. The Internet Society, 2010. https://www.ndss-symposium.org/ndss2010/automatic-reverse-engineering-data-structures-b inary-execution. [9] Slowinska A, Stancescu T, Bos H. Howard: A dynamic excavator for reverse engineering data structures[C/OL]//Proceedings of the Network and Distributed System Security Symposium, NDSS 2011, San Diego, California, USA, 6th February - 9th February 2011. The Internet Society, 2011. https://www.ndss-symposium.org/ndss2011/howard-a-dynamic-excavator-for-reverse-engineering-data-structures. [10] Age of Empires II: Definitive Edition, https://www.ageofempires.com/games/aoeiide/
原文始发于微信公众号(NISL实验室):【成果分享】MTSan: Yet Another Sanitizer for Binary Fuzzing
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论