EnvFuzz

EnvFuzz

Linux环境全面模糊测试工具

EnvFuzz是一款针对Linux用户模式软件的全面模糊测试工具。它通过记录和重放环境交互,能够测试包括网络服务、GUI应用、编辑器、编译器和数据库在内的多种程序。EnvFuzz自动模糊测试所有输入源,包括常被忽视的用户交互,无需配置即可对二进制文件进行测试。这种方法有助于发现传统模糊测试难以检测的bug,为软件安全测试提供了新的解决方案。

EnvFuzz模糊测试环境交互GUI应用系统调用Github开源项目

程序环境模糊测试(EnvFuzz)

EnvFuzz (εFuzz) 是一种新型的模糊测试器,可以对几乎任何东西进行模糊测试,包括:

  • 网络服务器/客户端
  • 图形用户界面 (GUI) 应用程序
  • 编辑器
  • 编译器
  • 数据库
  • 任何其他Linux用户模式软件

例如,以下演示展示了如何使用EnvFuzz对GUI应用程序进行模糊测试:


<p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/b82ce349-8cb2-4917-ba02-f1681e18dc18.gif" alt="EnvFuzz演示" style="width: 85%;"> </p>

[EnvFuzz对GUI应用程序二进制文件(gnome-calculator)进行模糊测试的演示。 首先,正常运行应用程序,并将所有环境交互(包括用户输入)记录到文件中。 接下来,对应用程序进行模糊测试,这次是通过重复播放原始记录但应用一个或多个变异。 EnvFuzz快速发现了几个崩溃,以红色突出显示。]


与仅对特定输入源进行模糊测试的现有模糊测试器(如AFL)不同,EnvFuzz对主体与其环境(ε)之间的整个交互进行模糊测试——包括所有文件(配置、缓存、资源、字体等)、套接字(会话管理器、辅助功能服务、名称服务等)、通过窗口系统的用户交互、特殊文件、设备和标准流,如下图所示:

<p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/0c65cc0c-0211-4206-8d37-46f29b78cb02.png" alt="完整计算器应用程序环境" style="width: 60%;"> </p>

换句话说,EnvFuzz将整个环境(ε)本身视为模糊测试目标——即所谓的程序环境模糊测试。 这甚至包括通过窗口系统的用户交互(例如,鼠标移动、按钮点击等),这些被视为与任何其他套接字或文件没有区别的输入源。 这使得EnvFuzz成为一个非常全面的模糊测试器,因为它会自动对所有输入(和输入组合)进行模糊测试,甚至包括在典型模糊测试活动中通常被忽视的不常见输入。

EnvFuzz也非常通用,旨在对现成的用户模式Linux二进制文件进行模糊测试,无需任何配置或设置。 请参见上面的演示。

EnvFuzz如何工作?

EnvFuzz基于底层的完整环境记录和重放(rr)和模糊测试基础设施。 该基础设施基于这样一个洞察:对于典型的用户模式程序,所有环境交互都通过内核-用户模式接口进行。 因此,通过记录此接口,我们也隐式地记录了程序与环境的交互,然后可以对其进行模糊测试。 基本上,EnvFuzz分两个阶段工作:

  1. 记录阶段正常执行程序,并将主体与其环境之间的所有交互(例如,系统调用、信号、线程切换等)记录到文件中。
  2. 接下来是重放与模糊测试阶段,在模糊测试循环中重复执行程序。 然而,这次原始的环境交互从记录中重放,但应用了一个或多个可能的变异。 这些变异可能会引发新的程序行为和可能的崩溃。

由于EnvFuzz在环境交互的抽象层面上工作,它可以对非常多样化的主体进行模糊测试,而无需任何特殊处理。 这使得EnvFuzz强大且易于使用。

上面的简单演示展示了EnvFuzz的使用示例:

  1. 第一阶段使用以下命令记录 gnome-calculator 应用程序:

     $ ./env-fuzz record gnome-calculator
    

    这会创建一个 out/ 子目录,记录存储在 out/RECORD.pcap.gz 文件中。

  2. 第二阶段使用以下命令模糊测试 gnome-calculator 应用程序:

     $ ./env-fuzz fuzz
    

    模糊测试器使用步骤(1.)中的原始记录作为初始种子,并重复执行程序。 模糊测试器不会精确重放原始记录,而是应用一个(或多个)变异,引发新的程序行为和可能的崩溃。

发现的崩溃存储在 out/crash/ 子目录中,可以使用以下命令重放:

    $ ./env-fuzz replay out/crash/SIGSEGV_XXXX_m0YYYY.patch

我们将EnvFuzz应用于各种程序,发现了几个新的错误,包括那些难以或无法用传统模糊测试器发现的错误。 有关更多信息,请参阅下面列出的预印本。

构建

要构建EnvFuzz,只需运行 build.sh 脚本。

    $ ./build.sh

这仅在基于Ubuntu的系统上进行过测试。

EnvFuzz使用方法

记录:

    $ ./env-fuzz record -- vim hello.txt

重放:

    $ ./env-fuzz replay

模糊测试:

    $ ./env-fuzz fuzz

重放崩溃:

    $ ./env-fuzz replay out/crash/SIGSEGV_XXXX_mYYYYY.patch

调试崩溃:

    $ ./env-fuzz replay out/crash/SIGSEGV_XXXX_mYYYYY.patch -d

EnvFuzz还支持(可选的)AFL风格的覆盖率插桩:

插桩程序二进制文件:

    $ ./env-fuzz instrument program

这将生成一个插桩后的 program.rr 二进制文件,可以替代原始文件。

也可以对库代码进行插桩:

    $ ./env-fuzz instrument /path/to/library.so

这将在 lib/ 子目录中放置一个插桩版本的库,该目录包含在库搜索路径中。

EnvFuzz 文件

在模糊测试过程中,将生成几个文件:

  • out/COMMAND.cmd:命令行
  • out/RECORD.pcap.gz:记录
  • out/crash/*.patch:崩溃补丁
  • out/hang/*.patch:挂起补丁
  • out/abort/*.patch:中止补丁
  • out/queue/m*/*.patch:有趣的补丁
  • lib/:存储修补后的 libc 和插桩库的位置

注意,存储在 out/RECORD.pcap.gz 文件中的交互可以使用 Wireshark 查看。

EnvFuzz 技术信息

EnvFuzz 使用 E9Patch 静态重写 libc 中的所有 syscall 指令。

因此,每当程序调用系统调用(例如 openreadwrite 等)时,调用将被转移到我们的记录和回放基础设施。 对于记录,该基础设施充当用户模式和内核模式之间的"中间人",所有交互都保存到文件中。 对于回放(带有模糊测试),程序会(重复)执行,但这次每个系统调用都从原始记录中"回放",可能会应用一个或多个变异。 在回放期间,系统调用几乎完全从记录中提供服务,不与内核和真实环境交互。 除了 libc 系统调用外,EnvFuzz 还有特殊方法处理 vDSO、信号、线程切换和 libc 外的系统调用指令。 EnvFuzz 不使用 ptrace。

一个问题是,在应用变异后,程序行为可能(而且会)发生偏离。 事实上,模糊测试的主要目的是诱导新的行为,以期发现新的错误。 为了处理这种情况,EnvFuzz 在变异后采用"系统调用模拟",以"宽松"的回放模式进行。 这允许仅使用原始记录来探索多样化的程序行为。 更多信息请参见下面的预印本。

EnvFuzz 状态

实现完整的环境记录和回放基础设施是出了名的具有挑战性。 例如,相关的 rr-debug 项目估计总共花费了五人年来源)用于开发(截至 2017 年),即便如此,它也无法完美记录和回放所有程序。 我们的底层记录和回放框架开发时间远未达到这个水平,当前实现应被视为不一定适用于所有程序的"研究原型"。 尽管如此,我们"按原样"提供该系统,因为 EnvFuzz 已被证明在发现其他模糊测试器无法检测到的错误方面很有效,即使实现尚未完全完善。

我们将根据社区的兴趣程度继续开发和改进 EnvFuzz。

EnvFuzz 问题

请记住,EnvFuzz 是 alpha 质量的软件和研究原型。

请在此报告明显的错误:

通常不应报告与回放过程中意外偏离相关的问题。 话虽如此,我们非常欢迎修复偏离问题的拉取请求。

同样,不应报告与缺少 ioctl、fcntl 和 prctl 相关的问题。 相反,您应该尽可能更新相应的 .tab 文件,并考虑提交拉取请求。

致谢

本研究得到新加坡国家研究基金会和新加坡网络安全局在其国家网络安全研发计划(模糊测试 NRF-NCR25-Fuzz-0001)下的支持。本材料中表达的任何意见、发现和结论或建议均为作者的观点,不反映新加坡国家研究基金会和新加坡网络安全局的观点。

许可证

该软件已根据 GNU 公共许可证 (GPL) 第 3 版发布。 有关更多信息,请参阅 LICENSE 文件。

引用 EnvFuzz

有关更多信息,请参阅我们的研究论文:

  • Ruijie Meng, Gregory J. Duck, Abhik Roychoudhury, 程序环境模糊测试, ACM SIGSAC 计算机与通信安全会议 (CCS), 2024。

如果您在科学工作中使用此代码,请按以下方式引用论文:

@inproceedings{envfuzz,
    title={程序环境模糊测试},
    author={Meng, Ruijie and Duck, Gregory J. and Roychoudhury, Abhik},
    booktitle={第 31 届 ACM SIGSAC 计算机与通信安全会议 (CCS) 论文集},
    year={2024}
}

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多