论文学习_Binary-level Directed Fuzzing for Use-After-Free Vulnerabilities

摘要 :定向模糊测试通过利用(部分)漏洞堆栈轨迹、补丁或风险操作等额外信息,专注于自动化测试代码的特定部分。其关键应用场景包括漏洞复现、补丁测试和静态分析报告验证。尽管定向模糊测试近年来备受关注,但释放后使用等难以检测的漏洞类型仍未得到有效处理,尤其在二进制层面。我们提出UAFUZZ------首个专注于释放后使用漏洞的(二进制级)定向灰盒模糊测试工具。该技术具备三大特征:针对释放后使用漏洞特性定制的测试引擎、轻量级代码插桩机制以及高效的漏洞分类步骤。在实际案例的漏洞复现实验评估中,UAFUZZ在故障检出率、漏洞暴露时间和漏洞分类方面显著优于当前最先进的定向模糊测试工具。UAFUZZ在补丁测试中也表现出色,在Perl、GPAC和GNU Patch等程序中新发现30个漏洞(其中7个获得CVE编号)。最后,我们向社区提供了基于真实代码和真实漏洞构建的大型释放后使用漏洞模糊测试基准数据集。

引言

在漏洞管理过程中,早期发现漏洞至关重要。近年来模糊测试在学术界和工业界的兴起(如微软的Springfield和谷歌的OSS-FUZZ)证明了其在实际应用中检测各类漏洞的能力。覆盖引导灰盒模糊测试(如AFL和LIBFUZZER)利用代码覆盖率信息引导输入生成,探索被测程序的新代码区域,尽可能遍历更多程序状态以触发崩溃。另一方面,定向灰盒模糊测试专注于对预先选定的潜在漏洞目标位置进行压力测试,其应用涵盖不同安全场景:(1)漏洞复现,(2)补丁测试或(3)静态分析报告验证。根据具体应用场景,目标位置可能源自漏洞堆栈轨迹、补丁文件或静态分析报告。

我们主要关注漏洞复现这一定向灰盒模糊测试最常见的实际应用场景。该场景旨在根据漏洞报告信息生成已披露漏洞的概念验证输入。由于54.9%的常规漏洞报告因信息缺失和用户隐私泄露问题无法复现,这项工作显得尤为重要。即使漏洞报告中提供了概念验证输入,开发人员仍需考虑漏洞的所有边界情况以避免回归漏洞或不完整修复。此时,提供更多触发漏洞的输入对于促进和加速修复过程至关重要。漏洞堆栈轨迹(即触发漏洞时的函数调用序列)被广泛用于引导定向模糊测试工具。在地址消毒剂或VALGRIND等分析工具下运行概念验证输入,即可输出此类漏洞堆栈轨迹。

尽管过去几年取得了巨大进展,当前(定向或非定向)灰盒模糊测试工具在检测释放后使用、非干扰性或偶发性漏洞等复杂漏洞类型时仍面临困难,这些漏洞需要满足特定属性的触发路径。例如,OSS-FUZZ或近期灰盒模糊测试工具仅发现少量释放后使用漏洞。事实上,持续漏洞挖掘竞赛RODE0DAY明确指出,模糊测试工具未来应致力于覆盖释放后使用等新型漏洞类别,这标志着测试目标正从仅包含缓冲区溢出的LAVA漏洞数据集向更广阔的领域拓展。我们聚焦于释放后使用漏洞。这类漏洞发生在堆内存元素被释放后仍被使用时。美国国家漏洞数据库中记录的释放后使用漏洞数量持续增长。由于缺乏有效的缓解技术手段,此类漏洞当前被列为最具危害性的可利用漏洞类型之一,可能导致数据损坏、信息泄露及拒绝服务攻击等严重后果。

我们专注于设计针对释放后使用漏洞的高效定向模糊测试方法。该技术必须能够在二进制层面运行(无需源代码插桩),因为安全关键程序的源代码并非始终可用,或可能部分依赖第三方库。然而,针对释放后使用漏洞检测的模糊测试工具面临以下挑战。

  • 复杂性------触发释放后使用漏洞需要生成能在同一内存位置引发"分配-释放-使用"事件序列的输入,这些事件跨越被测程序的多个函数;而缓冲区溢出仅需单次越界内存访问。这种时空约束的组合在实践中极难满足;
  • 隐匿性------释放后使用漏洞通常不会产生段错误等可观测现象。在此情况下,仅观察崩溃行为的模糊测试工具无法识别出触发此类内存漏洞的测试用例。遗憾的是,由于运行时开销过高,地址消毒剂等常用分析工具无法在模糊测试环境中直接使用。

事实上,当前最先进的定向模糊测试工具(AFLGO与HAWKEYE)未能解决这些挑战。首先,它们过于通用化,无法处理释放后使用漏洞的特殊性(如时序性)------其引导指标完全不考虑事件序列概念。其次,这些工具对释放后使用漏洞完全无感知,需要将海量生成的种子全部提交给分析工具进行昂贵的额外检测。最后,当前基于源代码的定向灰盒模糊测试工具通常受制于高昂的插桩开销(例如AFLGO编译和插桩cxxfilt耗时近2小时)。

我们提出UAFUZZ------首个针对释放后使用漏洞定制的(二进制级)定向灰盒模糊测试工具。表1展示了UAFUZZ与现有灰盒模糊测试工具在释放后使用漏洞检测方面的简要对比。在遵循定向模糊测试通用框架的同时,我们针对释放后使用漏洞的特殊性精心调整了多个关键组件:

  • 距离度量机制优先选择更短的目标函数调用链,这些调用链更可能同时包含分配与释放函数------而现有最先进的定向模糊测试工具依赖于通用的基于控制流图的距离计算方法;
  • 种子选择机制采用基于序列感知的目标相似性度量标准------而现有最先进的定向模糊测试工具至多依赖目标覆盖率;
  • 我们的能量调度策略得益于这些新度量标准,另辅以被称为"切割边"的第三项指标,该指标更倾向于选择更可能抵达完整目标的前缀路径。

最后,漏洞分类步骤依托我们先前提出的度量标准,预先判定种子是否可能触发漏洞,从而大幅减少为确认漏洞所需向分析工具(本实现中采用VALGRIND)发起的查询次数。

相关推荐
丝斯20112 小时前
AI学习笔记整理(43)——NLP之大规模预训练模型BERT
人工智能·学习·自然语言处理
saoys3 小时前
Opencv 学习笔记:形态学开 / 闭运算(解决噪点与孔洞问题)
笔记·opencv·学习
小猪佩奇TONY3 小时前
Linux 内核学习(16) --- linux x86-64 虚拟地址空间和区域
linux·运维·学习
深蓝海拓3 小时前
PySide6,QEventLoop.exec()的使用
笔记·python·qt·学习·pyqt
开开心心_Every3 小时前
离线黑白照片上色工具:操作简单效果逼真
java·服务器·前端·学习·edge·c#·powerpoint
爱喝水的鱼丶3 小时前
SAP-ABAP:SAP性能侦探:STAD事务码的深度解析与应用实战
开发语言·数据库·学习·sap·abap
专注于大数据技术栈3 小时前
java学习--Collection
java·开发语言·学习
浮游本尊3 小时前
React 18.x 学习计划 - 第十二天:企业级实践与进阶主题
学习·react.js·状态模式
代码游侠3 小时前
学习笔记——嵌入式与51单片机学习
单片机·嵌入式硬件·学习·51单片机