Skip to content

Commit

Permalink
Site updated: 2024-10-28 13:55:17
Browse files Browse the repository at this point in the history
  • Loading branch information
ss committed Oct 28, 2024
1 parent 89241c9 commit cd5b05a
Show file tree
Hide file tree
Showing 8 changed files with 109 additions and 58 deletions.
4 changes: 2 additions & 2 deletions 2023/AFL原理与实践/index.html

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions 2023/LibAFL简介/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@



<script type="application/ld+json">{"@context":"http://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"一瓢清浅","sameAs":["#about","https://github.com/jiliguluss"],"image":"photo.jpg"},"articleBody":"\n\n1. 什么是 LibAFLLibAFL 是一款用 Rust 语言开发的开源模糊测试框架,它将模糊测试的组件划分成一组模块文件,用户可以基于这组模块,快速实现自定义的 fuzz 引擎。\n2. 为什么要设计 LibAFL 现有的 Fuzz 引擎很多是基于 AFL 进行改造的,不同的改造之间存在不兼容的情况,比如 Fairfuzz 是基于 AFL 改造的,但是 AFL++ 不支持 Fairfuzz。如果希望把多种 Fuzz 优化技术集合在一起,工程难度很大。\nAFL++ 是 AFL 的进化版,它在 AFL 的基础上集成了很多 Fuzz 优化技术,并支持以插件的方式进行功能扩展,例如可以自定义 mutator。但 AFL++ 还是受限于 AFL 本身的程序设计,与 mutator 无关的优化技术,与 AFL++ 的集成也比较困难。\n3. LibAFL 整体架构 (1)Fuzz 引擎的相关组件 \nInput 指 fuzz 过程中,传递给 target 的输入数据。Libfuzzer 和 AFL 默认的输入格式,都是字节数组。fuzz 的入口函数在以这个字节数组作为入参,然后对字节数组进行切片和类型变换,转换为 target 中待测函数所要求的参数形式,再对待测函数进行调用。\n\nCorpus 指 fuzz 过程中,用来存放有效 input 的语料库。AFL 必须要有初始语料库,Libfuzzer 可以不提供初始语料库。语料库可以存放在磁盘中通过 io 读写,也可以全部加载进内存中。前者效率低,后者内存消耗大。\n\nScheduler 指 fuzz 引擎从语料库中选择 input 的调度机制。语料库中包含大量的 input,fuzz 每轮执行需要挑选一个 input。调度机制决定了 input 的挑选方法,简单的实现包括先入先出、随机挑选等。对调度机制进行优化,也是改进 fuzz 的一个方向。\n\nStagefuzz 的每一轮执行实际上都包含多个步骤,每个步骤都可以理解为一个阶段。比如变异阶段是对 input 进行随机变异操作,分析阶段可以使用污点分析等技术搜集更多信息,语料库精简阶段是对语料库进行筛选操作。一连串的阶段性操作构成了一次完整的 fuzz 执行过程。\n\nObserver 观察器用来收集 fuzz 单词运行过程中的信息。在覆盖率引导的 fuzz 引擎中,观察器会看这次执行过程中,input 所经过的代码路径。AFL 中的 bitmap 就是一个观察器,AFL 将代码路径转化为 branch 或 edge 的集合,并记录在 bitmap 中。\n\nExecutor 执行器负责将 input 喂给 target 开启一次 fuzz 执行。不同的 fuzz 工具,可能有不同的执行方式。Libfuzzer 是一个单进程的执行模式,在一个进程中生成 input 运行 target,并不断循环这个过程;AFL 则通过 fork 模式,每次 input 都会 fork 出一个子进程,在子进程中运行 target。\n\nFeedback 反馈通常是基于观察器收集到的执行结果,来判断这次 fuzz 执行过程中,使用的 input 是不是一个有效的输入,如果是有效输入才会保存到语料库中。在覆盖率引导的 fuzz 引擎中,当一个 input 能命中此前都没有到达的代码区块时,才会被认为是有效的。\n\nMutator 变异器接受一个 input 作为输入,通过修改、插入、删除等变异操作,衍生出一个新的 input。在 AFL 和 Libfuzzer 中,input 为字节数组,变异器通过对字节位和字节块进行改变,进而得到新的 input。在 target 输入需要满足指定格式时,自定义变异器是一条可行的途径。\n\nGenerator 生成器是指从头生成一个 input 作为输入,它不是基于已有的 input 进行修改。常用于基于生成的 fuzz 引擎中,例如 peach 中通过定义 input 的数据模型来指导 input 的生成。\n\n\n(2)LibAFL 的架构设计 LibAFL 的核心架构设计如下图:\n\n\n 其中的一些实体名词含义参见前一部分介绍。在这个架构图中,有三个比较大的组件:\n\nState:负责记录和维护 fuzzer 运行过程中的需要持久化的信息。它包括了各类统计数据、测试用例数据、已发现的漏洞、程序执行的路径等。这些信息用于帮助 fuzzer 做出智能决策,优化测试过程。\n\nFuzzer:负责实际执行模糊测试。它使用各种算法和策略来生成或者变异输入数据,然后将这些数据用于测试目标程序,以期发现潜在的安全漏洞。Fuzzer 需要与状态组件紧密协作,以使用状态信息引导自己的测试过程。\n\nEvent Manager:事件管理器作为 LibAFL 架构中的通信枢纽,它负责协调不同组件间的交互工作。事件管理器处理各种事件,如新发现的错误、状态更新信号等,并确保这些信息及时、正确地在组件间传递。\n\n\n4. LibAFL 使用方法 \n 简单的模糊器实例 - LibAFL 模糊测试库 \nfuzzing-101-with-libafl\n\n5. 参考资料 \nLibAFL: A Framework to Build Modular and Reusable Fuzzers\nLibAFL 学习笔记 \nLibAFL 中文文档 \n","dateCreated":"2023-11-18T10:38:08+08:00","dateModified":"2024-06-27T16:30:08+08:00","datePublished":"2023-11-18T10:38:08+08:00","description":"LibAFL 是用 Rust 开发的一款模糊测试库,支持 Fuzz 各模块的灵活定制 ","headline":"LibAFL 简介","image":[],"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.stepbystep.asia/2023/LibAFL%E7%AE%80%E4%BB%8B/"},"publisher":{"@type":"Organization","name":"一瓢清浅","sameAs":["#about","https://github.com/jiliguluss"],"image":"photo.jpg","logo":{"@type":"ImageObject","url":"photo.jpg"}},"url":"https://www.stepbystep.asia/2023/LibAFL%E7%AE%80%E4%BB%8B/","keywords":"Fuzz, 安全, 工具, AFL"}</script>
<script type="application/ld+json">{"@context":"http://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"一瓢清浅","sameAs":["#about","https://github.com/jiliguluss"],"image":"photo.jpg"},"articleBody":"\n\n1. 什么是 LibAFLLibAFL 是一款用 Rust 语言开发的开源模糊测试框架,它将模糊测试的组件划分成一组模块文件,用户可以基于这组模块,快速实现自定义的 fuzz 引擎。\n2. 为什么要设计 LibAFL 现有的 Fuzz 引擎很多是基于 AFL 进行改造的,不同的改造之间存在不兼容的情况,比如 Fairfuzz 是基于 AFL 改造的,但是 AFL++ 不支持 Fairfuzz。如果希望把多种 Fuzz 优化技术集合在一起,工程难度很大。\nAFL++ 是 AFL 的进化版,它在 AFL 的基础上集成了很多 Fuzz 优化技术,并支持以插件的方式进行功能扩展,例如可以自定义 mutator。但 AFL++ 还是受限于 AFL 本身的程序设计,与 mutator 无关的优化技术,与 AFL++ 的集成也比较困难。\n3. LibAFL 整体架构 (1)Fuzz 引擎的相关组件 \nInput 指 fuzz 过程中,传递给 target 的输入数据。Libfuzzer 和 AFL 默认的输入格式,都是字节数组。fuzz 的入口函数在以这个字节数组作为入参,然后对字节数组进行切片和类型变换,转换为 target 中待测函数所要求的参数形式,再对待测函数进行调用。\n\nCorpus 指 fuzz 过程中,用来存放有效 input 的语料库。AFL 必须要有初始语料库,Libfuzzer 可以不提供初始语料库。语料库可以存放在磁盘中通过 io 读写,也可以全部加载进内存中。前者效率低,后者内存消耗大。\n\nScheduler 指 fuzz 引擎从语料库中选择 input 的调度机制。语料库中包含大量的 input,fuzz 每轮执行需要挑选一个 input。调度机制决定了 input 的挑选方法,简单的实现包括先入先出、随机挑选等。对调度机制进行优化,也是改进 fuzz 的一个方向。\n\nStagefuzz 的每一轮执行实际上都包含多个步骤,每个步骤都可以理解为一个阶段。比如变异阶段是对 input 进行随机变异操作,分析阶段可以使用污点分析等技术搜集更多信息,语料库精简阶段是对语料库进行筛选操作。一连串的阶段性操作构成了一次完整的 fuzz 执行过程。\n\nObserver 观察器用来收集 fuzz 单词运行过程中的信息。在覆盖率引导的 fuzz 引擎中,观察器会看这次执行过程中,input 所经过的代码路径。AFL 中的 bitmap 就是一个观察器,AFL 将代码路径转化为 branch 或 edge 的集合,并记录在 bitmap 中。\n\nExecutor 执行器负责将 input 喂给 target 开启一次 fuzz 执行。不同的 fuzz 工具,可能有不同的执行方式。Libfuzzer 是一个单进程的执行模式,在一个进程中生成 input 运行 target,并不断循环这个过程;AFL 则通过 fork 模式,每次 input 都会 fork 出一个子进程,在子进程中运行 target。\n\nFeedback 反馈通常是基于观察器收集到的执行结果,来判断这次 fuzz 执行过程中,使用的 input 是不是一个有效的输入,如果是有效输入才会保存到语料库中。在覆盖率引导的 fuzz 引擎中,当一个 input 能命中此前都没有到达的代码区块时,才会被认为是有效的。\n\nMutator 变异器接受一个 input 作为输入,通过修改、插入、删除等变异操作,衍生出一个新的 input。在 AFL 和 Libfuzzer 中,input 为字节数组,变异器通过对字节位和字节块进行改变,进而得到新的 input。在 target 输入需要满足指定格式时,自定义变异器是一条可行的途径。\n\nGenerator 生成器是指从头生成一个 input 作为输入,它不是基于已有的 input 进行修改。常用于基于生成的 fuzz 引擎中,例如 peach 中通过定义 input 的数据模型来指导 input 的生成。\n\n\n(2)LibAFL 的架构设计 LibAFL 的核心架构设计如下图:\n\n\n 其中的一些实体名词含义参见前一部分介绍。在这个架构图中,有三个比较大的组件:\n\nState:负责记录和维护 fuzzer 运行过程中的需要持久化的信息。它包括了各类统计数据、测试用例数据、已发现的漏洞、程序执行的路径等。这些信息用于帮助 fuzzer 做出智能决策,优化测试过程。\n\nFuzzer:负责实际执行模糊测试。它使用各种算法和策略来生成或者变异输入数据,然后将这些数据用于测试目标程序,以期发现潜在的安全漏洞。Fuzzer 需要与状态组件紧密协作,以使用状态信息引导自己的测试过程。\n\nEvent Manager:事件管理器作为 LibAFL 架构中的通信枢纽,它负责协调不同组件间的交互工作。事件管理器处理各种事件,如新发现的错误、状态更新信号等,并确保这些信息及时、正确地在组件间传递。\n\n\n4. LibAFL 使用方法 \n 简单的模糊器实例 - LibAFL 模糊测试库 \nfuzzing-101-with-libafl\n\n5. 参考资料 \nLibAFL: A Framework to Build Modular and Reusable Fuzzers\nLibAFL 学习笔记 \nLibAFL 中文文档 \n","dateCreated":"2023-11-18T10:38:08+08:00","dateModified":"2024-06-27T16:30:08+08:00","datePublished":"2023-11-18T10:38:08+08:00","description":"LibAFL 是用 Rust 开发的一款模糊测试库,支持 Fuzz 各模块的灵活定制 ","headline":"LibAFL 简介","image":[],"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.stepbystep.asia/2023/LibAFL%E7%AE%80%E4%BB%8B/"},"publisher":{"@type":"Organization","name":"一瓢清浅","sameAs":["#about","https://github.com/jiliguluss"],"image":"photo.jpg","logo":{"@type":"ImageObject","url":"photo.jpg"}},"url":"https://www.stepbystep.asia/2023/LibAFL%E7%AE%80%E4%BB%8B/","keywords":"AFL, Fuzz, 安全, 工具"}</script>
<meta name="description" content="LibAFL 是用 Rust 开发的一款模糊测试库,支持 Fuzz 各模块的灵活定制">
<meta property="og:type" content="blog">
<meta property="og:title" content="LibAFL 简介">
Expand All @@ -26,10 +26,10 @@
<meta property="article:published_time" content="2023-11-18T02:38:08.000Z">
<meta property="article:modified_time" content="2024-06-27T08:30:08.593Z">
<meta property="article:author" content="一瓢清浅">
<meta property="article:tag" content="AFL">
<meta property="article:tag" content="Fuzz">
<meta property="article:tag" content="安全">
<meta property="article:tag" content="工具">
<meta property="article:tag" content="AFL">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://www.stepbystep.asia/2023/LibAFL%E7%AE%80%E4%BB%8B/LibAFL%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.png">

Expand Down
Loading

0 comments on commit cd5b05a

Please sign in to comment.