DIFFER:革新程序变换验证的差分测试工具

DIFFER是一款创新的差分测试工具,专为检测程序变换后的错误和健全性违规而设计。它结合了差分测试、回归测试和模糊测试技术,能够有效发现软件重写、精简和加固工具引入的新漏洞,在测试中成功识别出71%的变换程序存在问题。

介绍DIFFER:用于测试和验证变换程序的新工具

我们最近发布了一款名为DIFFER的新型差分测试工具,用于发现变换程序中的错误和健全性违规。DIFFER结合了差分测试、回归测试和模糊测试的元素,帮助用户发现经过软件重写、精简和加固工具修改后的程序中的错误。我们使用DIFFER评估了10个软件精简工具,发现这些工具产生的变换程序中,71%存在精简失败或健全性违规问题。

背景

软件变换在过去十年中一直是热门研究领域,主要动机是保护遗留软件的安全。在许多情况下,这必须在没有软件源代码(仅二进制)的情况下完成,因为源代码已丢失、受供应商锁定或由于陈旧的构建链而无法重新构建。该领域涌现的热门研究主题包括二进制提升、重新编译、重写、修补、加固和精简。

虽然为实现这些目标而构建的工具已经取得了一些成功,但它们也带来了重大风险。当编译器将源代码转换为二进制文件时,一旦不再需要上下文信息,它们就会丢弃这些信息。一旦程序被转换为二进制,安全修改原始程序所需的上下文信息通常无法完全恢复。因此,直接修改程序二进制的工具可能会无意中破坏程序,并引入新的错误和漏洞。

虽然DIFFER是应用无关的,但我们最初构建这个工具是为了帮助我们发现使用精简工具(如Carve、Trimmer、Razor)移除不必要功能后程序中的错误。通常,软件精简器试图通过移除可能包含潜在漏洞或被攻击者通过代码重用利用模式重用的不必要代码,来最小化程序的攻击面。精简工具通常对程序执行分析过程,将功能映射到执行它们所需的代码。然后使用这些映射来切割与用户不需要的功能相对应的代码。然而,这些切割可能不精确,因为生成映射依赖于不精确的分析步骤,如二进制恢复。因此,新的错误和漏洞可能在切割过程中被引入精简后的程序,这正是我们设计DIFFER来检测的问题。

DIFFER如何工作?

在高层次上,DIFFER(如图1所示)用于测试程序的未修改版本与一个或多个修改变体。DIFFER允许用户指定对应于未修改和修改程序行为和功能的种子输入。然后,它使用这些输入运行原始程序和变换变体,并比较输出。此外,DIFFER支持基于模板的变异模糊测试这些种子输入。通过提供变异模板,DIFFER可以最大化其输入空间的覆盖范围,避免遗漏错误(即假阴性)。

DIFFER期望在给定对应于未修改功能的输入时,看到原始程序和变体程序相同的输出。相反,当使用对应于修改功能的输入执行程序时,它期望看到不同的输出。如果DIFFER检测到意外的匹配、差异或崩溃输出,它会向用户报告。这些报告帮助用户识别由变换过程或其配置导致的修改程序中的错误。

图1:DIFFER概述

在配置DIFFER时,用户选择一个或多个比较器来比较输出。虽然DIFFER提供了许多内置比较器来检查基本输出,如返回代码、控制台文本和输出文件,但通常需要更高级的比较器。为此,DIFFER允许用户为复杂输出(如数据包捕获)添加自定义比较器。自定义比较器还可用于通过定义允许的输出差异(如控制台输出中的时间戳)来减少误报报告。我们的开源DIFFER版本包含许多有用的比较器实现,以帮助用户轻松编写自己的比较器。

然而,DIFFER不能也不提供变换工具或其产生的修改程序的健全性形式保证。与其他动态分析测试方法一样,DIFFER无法在一般情况下对复杂程序的输入空间进行详尽测试。

用例:评估软件精简器

在我们最近与GrammaTech的朋友合作进行的一项研究中,我们使用DIFFER评估了由10个不同软件精简工具创建的精简程序。我们使用这些工具从20个不同大小、复杂度和用途的程序中移除不必要功能。这些工具共同创建了90个精简变体程序,然后我们用DIFFER进行了验证。DIFFER发现这些变体中39个(约43%)仍然具有精简工具未能移除的功能。更糟糕的是,DIFFER发现25个(约28%)变体在精简后要么崩溃,要么在保留功能中产生不正确输出。

通过发现这些失败,DIFFER证明了自己作为一种有用的变换后验证工具。尽管这项研究专注于精简变换,但我们想强调DIFFER足够通用,可以测试其他变换工具,如用于软件加固(如CFI、堆栈保护)、翻译(如C到Rust转换器)和代理(如ML代理生成器)的工具。

下一步计划?

随着DIFFER作为开源软件的推出,我们邀请安全研究社区通过拉取请求使用、扩展和帮助维护DIFFER。我们计划进行几项具体改进,以继续研究和开发DIFFER,包括以下内容:

  • 支持在Docker容器中运行二进制文件,以减少环境负担。
  • 添加新的内置比较器。
  • 添加对需要超级用户权限的目标的支持。
  • 支持监控构成分布式系统的多个进程。
  • 添加运行时比较器(通过插装等)进行“深度”等价检查。

致谢

本材料基于海军研究办公室(ONR)根据合同号N00014-21-C-1032支持的工作。本材料中表达的任何观点、发现和结论或建议均为作者的观点,不一定反映ONR的观点。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计