Tldr

作者们实现了 ChatAFL,让 LLM 生成机器可读的协议格式,按照协议格式进行变异和 fuzzing,在覆盖率到达某个程度不变时,让 LLM 生成可以触发新状态/覆盖率的输入。

来看看别人是怎么借助 LLM 优化协议 fuzz 的,这一篇应该是 NDSS 2024 的论文,作者们来自新加坡国立大学和莫纳什大学的 MPI-SP。(我也想蹭热点呜呜呜)

看看概要。

  • RFC 文档用人类语言定义了协议(很难讲人类语言转换为机器语言)
  • LLM 学习了数百万计的文档,可以转换成机器可读的协议信息
  • 作者们实现了 ChatAFL
    • 为协议中的每种消息类型构建语法
    • 与 LLM 交互变异消息或预测下一条消息
    • 对 ProfuzzBench 进行实验
      • 相比 AFLNetNSFuzz
        • 能覆盖的状态转换分别增加了 47.6% 和 42.69%
        • 状态覆盖增加了 29.55% 和 25.75%
        • 代码覆盖增加了 5.81% 和 6.74% 以及新的漏洞。
      • 太酷了,究竟是哪方面带来了提升呢?

看看第一章

  • LLM 引导的协议模糊测试,包含三个部分:
    • 使用 LLM 为协议提取机器可读的语法,用于结构感知的突变;
      • (猜想)有点类似于协议状态机的提取
    • 使用 LLM 增加初始种子中消息的多样性;
    • 使用 LLM 突破稳定期,让 LLM 生成可以到达新状态的信息。
  • 看上去,似乎也很适合黑盒协议 fuzz?
  • 开源代码:https://github.com/ChatAFLndss/ChatAFL

接下来看看第二章,作者提出的挑战:

  1. 依赖初始种子
  • 这个确实
  1. 未知的消息结构
  • 按照介绍的意思是说,如果没有机器可读的结构信息,fuzzer 就不能根据结构进行有趣的更改。
  1. 未知的状态空间
  • 同上,没有可读的状态空间信息就无法探索状态空间。

看看作者们的动机,怎样通过 LLM 解决上述的三个问题:

  1. 要求 LLM 在给定的种子信息中添加随机信息
  • 那是怎么问的呢,猜想一下,“这是一个 RTSP 协议的指令序列,请根据 RTSP 协议的结构帮我随机修改其中的结构”,这样子吗?
  1. 要求 LLM 为协议提供机器可读的结构信息
  2. 让 LLM 根据 fuzzer 和被测实体之间的信息交换,返回一条能够进入新状态空间的信息

(第三章就是在证明上面三个问题都能被 LLM 解决)

然后看看作者们的 Prompt:

提取语法:

增强种子:

提升覆盖率/状态空间:

  • 这么一看似乎只要学习协议就可以了,覆盖率的提升/状态的提升有没有反哺给模型呢?
    • 看上去没有,那么这可能是未来的点吗?
  • 除此之外,有没有可能 antifuzz 呢?
    • 似乎不大行,这是一个 prompt 就能解决的事
      • 除非能穿透 openai,直接攻击到他们的核心服务

状态和覆盖率对 fuzz 的反哺

根据第第 4 章,状态/覆盖率用于检测是否到达某个极限的值(被作者们称为覆盖高原 coverage plateau),到达这个状态之后会让 LLM 返回一条能进入新状态的信息(也就是上文中的第三条)

  • 理论上覆盖率、状态变量、状态值都可以用于触发,这样可以在黑盒上做类似的工作?(只需要状态)

与其他 LLM Fuzz 的区别

  • Codamosa:第一个将 LLM 引入 fuzz,自动生成 Python 模块的测试用例;
  • TitanFuzz/FuzzGPT:为深度学习库生成测试用例;
  • ChatFuzz:让 LLM 修改人类编写的测试用例。