针对USENIX Security Symposium 2023论文《SAFER: Efficient and Error-Tolerant Binary Instrumentation》的学术研究报告
本研究由美国石溪大学(Stony Brook University)的Soumyakant Priyadarshan, Huan Nguyen, Rohit Chouhan和R. Sekar共同完成,其论文《SAFER: Efficient and Error-Tolerant Binary Instrumentation》于2023年8月9日至11日在美国加州阿纳海姆举行的第32届USENIX安全研讨会上发表并收录于会议论文集。
一、 学术背景 本研究的科学领域属于计算机安全与系统软件,具体聚焦于二进制插桩(Binary Instrumentation)技术。程序插桩是软件安全的核心基础技术,广泛用于漏洞利用缓解、安全策略强制实施、模糊测试(Fuzzing)和性能监控等。二进制插桩因其直接对部署在终端系统上的二进制可执行文件进行操作而具有最广泛的适用性,不仅适用于只有二进制形式的专有软件,也适用于大多数以二进制形式分发的Linux开源软件。
然而,对x86/x64架构的二进制文件进行准确插桩面临巨大挑战,主要源于三个方面:1) 反汇编错误:由于指令长度可变、代码与数据难以区分,即使最好的反汇编工具也存在不可忽略的错误率。2) 代码指针识别错误:插桩需要移动原始指令以插入新代码,因此必须识别并更新所有指向原始代码位置的指针常量(如函数指针、返回地址),但静态区分数据中的整数和指针常量极其困难。3) 对复杂代码的兼容性:例如位置相关代码(非PIE)、代码中嵌入的数据、C++异常处理等特性,增加了分析的复杂度。
现有的二进制插桩技术可分为两类:第一类(Group I)如DynamoRIO、Pin、BinCFI等,采用运行时地址翻译等方法,健壮性好、兼容性高,但性能开销大(尤其是对于大量使用间接调用的C++程序,开销可达30%以上)。第二类(Group II)如Egalito、RetroWrite等,通过静态转换代码指针来避免运行时开销,实现了近乎零开销,但其安全性建立在多个乐观假设之上,包括无错误的完整反汇编、仅使用位置无关代码(PIC/PIE)、以及对代码指针的识别无误报无漏报。一旦假设被违反,可能导致程序崩溃或更严重的数据损坏和安全漏洞。
因此,一个悬而未决的研究问题是:能否将第一类技术的安全兼容性优势与第二类技术的性能优势结合起来?本论文对此给出了肯定的答案,旨在设计一种既高效又能容忍常见分析错误的二进制插桩技术。
二、 详细工作流程 SAFER(Safe and Efficient Binary Rewriter)系统的工作流程是一个多阶段的分析与转换过程,主要包含以下核心步骤:
容忍错误的反汇编:
代码指针分类:
安全转换代码指针常量:
x,在静态重写时对其进行编码:enc(x) = (a*x mod 2^n-1) | 2^(n-1)。其中a是一个随机奇数,n是可用的地址位宽(如48)。编码后的指针最高有效位被设为1(在用户态地址中通常为0),使其指向未映射的内存区域。dec(y) = b*(y & (2^(n-1)-1)) mod 2^(n-1)(其中b是a的模乘法逆元)进行解码,恢复正确的目标地址。如果最高有效位为0,则认为是未转换的或“可能代码指针”,则通过查询地址翻译表来获取正确的目标地址。安全跳转表插桩:
地址翻译机制:
三、 主要结果 1. 功能性与兼容性: * SAER成功对超过1.1GB的二进制代码(包括SPEC 2006/2017基准测试套件、coreutils以及多个现实世界应用程序如GIMP、FFmpeg、Clang等)进行了插桩,所有测试均通过。 * 成功处理了包含代码内嵌数据的二进制文件(通过自定义链接脚本编译的coreutils)。实验表明,当使用指令边界或ABI属性单独判断时,部分程序会因指针误分类而按设计触发“故障-崩溃”;当结合函数序言匹配后,所有程序均正常运行。 * 成功处理了位置相关可执行文件(非PIE),如SPEC 2006的非PIE版本以及GCC、Clang等现实程序,这是许多Group II工具无法做到的。 * 在存在复杂特性(如C++异常、栈回溯、longjmp)的程序中(如SPEC中的omnetpp、povray、perlbench),插桩后的程序均能正确运行。
性能开销:
安全跳转表转换的有效性:
内存开销:
四、 结论与价值 本研究的结论是,确实可以设计出一种二进制插桩系统,在保持低性能开销(~2%)的同时,显著提高对反汇编错误、代码指针识别错误以及复杂二进制文件特性(如非PIE、代码内嵌数据)的容忍度。SAFER通过创新的指针编码技术、安全的跳转表转换方法以及结合静态分类与运行时翻译的混合架构,实现了这一目标。
其科学价值在于: 1. 提出了新的安全抽象:“故障-崩溃”原语和指针编码方案为构建健壮的二进制分析工具提供了新的思路,确保错误可预测地失败,而非导致不可控的后果。 2. 解决了关键挑战:首次系统化地阐述并解决了跳转表安全转换的问题,并给出了一个实用的解决方案。 3. 实现了性能与安全的平衡:证明了高效的静态指针转换和稳健的运行时回退机制可以协同工作,打破了此前两类技术在此方面的取舍困境。
其应用价值在于: 1. 提高了二进制插桩的实用性:使得安全关键的安全插桩(如控制流完整性、影子栈)能够以更低的开销应用于更广泛的现实世界软件,包括那些包含遗留代码、复杂特性的应用程序。 2. 增强了工具的可靠性:降低了因二进制分析不完美而导致生产环境程序崩溃或出现隐蔽错误的风险。
五、 研究亮点 1. 创新的指针编码方案:利用模乘运算和地址空间冗余,仅需一个未使用的地址位即可实现指针身份验证和篡改检测,方法简洁高效,且概率性检测的失败率极低。 2. 安全的跳转表转换:首次明确提出了跳转表转换的安全性问题,并通过“复制-修改-验证”的流程和污点分析,确保了转换不会引入副作用。 3. 混合架构设计:巧妙地将静态确定的指针转换(高效)与对不确定指针的运行时地址翻译(稳健)结合起来,并通过编码机制在运行时无缝切换,是工程上的核心创新。 4. 全面的兼容性:在追求性能的同时,没有牺牲对非PIE、代码内嵌数据、C++异常等现实场景的支持,大大提升了工具的适用范围。 5. 详实的评估:在大型、多样的数据集(包括SPEC基准和众多现实应用)上进行了功能、性能、内存等多维度评估,结果令人信服。
六、 其他有价值内容 论文还讨论了SAFER的局限性:当前原型在处理超大型二进制文件(如>160MB的libxul)时,反汇编阶段可能因资源耗尽而失败;指针编码需要至少一个未使用的地址位,对于重用所有指针位的程序需要额外处理。作者指出,对于可能导致故障的少数二进制文件,可以采用回退到全地址翻译或加强函数序言检查的更安全模式,并计划未来利用反汇编信息主动识别高风险二进制以应用这些模式。这些讨论为后续研究和改进指明了方向。