引入DIFFER:测试与验证转换程序的新工具
Michael Brown
2024年1月31日
动态分析, 开源
我们近期发布了一款名为DIFFER的新型差分测试工具,用于发现转换后程序中的错误与健全性违规。DIFFER融合了差分测试、回归测试和模糊测试的元素,帮助用户发现经过软件重写、精简和加固工具修改后的程序缺陷。使用DIFFER评估10款软件精简工具后,发现71%的转换程序存在精简失败或健全性违规问题。
DIFFER填补了转换后软件验证的关键空白。程序转换工具通常将验证任务完全交给用户,而用户除通过现有单元/集成测试和模糊器进行回归测试外,往往缺乏其他工具。这些方法天然不支持针对原始版本测试转换后程序,可能导致细微且新颖的错误潜入修改后的程序。
我们将提供促使创建DIFFER的背景研究,详细描述其工作原理,并讨论其未来发展。如果您想直接查看代码,请访问GitHub上的DIFFER。
背景
软件转换是过去十年的热门研究领域,主要动力源于保护遗留软件的需求。在许多情况下,这必须在没有软件源代码(仅二进制文件)的情况下完成,因为源代码已丢失、受供应商锁定或由于过时的构建链无法重建。该领域涌现的流行研究主题包括二进制提升、重新编译、重写、修补、加固和精简。
尽管为实现这些目标构建的工具已取得一些成功,但它们携带显著风险。当编译器将源代码降级为二进制文件时,一旦不再需要上下文信息,便会将其丢弃。一旦程序被降级为二进制,安全修改原始程序所需的上下文信息通常无法完全恢复。因此,直接修改程序二进制的工具可能无意中破坏程序,引入新的错误和漏洞。
虽然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。我们计划了几项具体改进,包括:
- 支持在Docker容器中运行二进制文件,以减少环境负担。
- 添加新的内置比较器。
- 支持需要超级用户权限的目标。
- 支持监控构成分布式系统的多个进程。
- 通过检测等方式添加运行时比较器,进行“深度”等价检查。
致谢
本材料基于海军研究办公室(ONR)合同号N00014-21-C-1032支持的工作。本材料中表达的任何意见、发现和结论或建议均为作者观点,不一定反映ONR的观点。
如果您喜欢这篇文章,请分享:
Twitter、LinkedIn、GitHub、Mastodon、Hacker News