avatar

Chunlin

因为见过伟大,所以不甘平庸

AFLIoT_Fuzzing on linux-based IoT device with binary-level instrumentation

1. Basic Information

Conference: Computer & Security’22
Author: Xuechao Du, Andong Chen, Boyuan He, Hao Chen
Affiliation: College of Computer Science and Technology, Zhejiang University

2. Introduction

本文设计了AFLIoT,它使用无偏移的二进制插装技术重写基于Linux的物联网固件二进制,并直接在设备上对固件进行分析。

3. Challenges

  • Ch1: IoT固件高度多样化和而在分析中有限的硬件和软件
  • Ch2: 许多IoT设备由开发商自己开发,现有仿真器无法支持对该类设备的仿真
  • Ch3: IoT设备中的联网程序以守护进行的形式运行,只能通过远程接受一次指令,一旦模糊测试提供了不合适输入,之后都将无法进行分析

4. Design

4.1 Overview

FIG1
如上图所示,AFLIoT的工作主要分为静态二进制插桩阶段和模糊测试阶段。

4.2 Binary Static Instrumentation

FIG2

  • 大致流程
    • File Reconstruction: 插桩会引入新的指令,所以需要调整目标程序的文件结构,预分配新的额外的空间来存储这些指令
    • Basic Block Identification: 目标二进制的中基本块入口地址被识别为插桩点
      • PC无关的指令通常是一个基本块的出口,它的下一条指令和目的指令将是其他基本块的入口
      • PC相关的指令的传输目的地只能在运行时确定,所以AFLIoT只认为它的下一个地址是其他基本块的入口点
    • Instructions Wrapping: 封装指令防止影响原目标程序的指令偏移
    • Dependencies Appending: 追加用于初始化、用于记录分支信息、用于网络和输入重定向的函数、库以及其他依赖项
  • 详细流程: 二进制插桩的详细流程如下:将基本块中跳转指令(instrbranch)的下一条指令修改为存根块(stubinstr),存根块中记录了分支信息,它引导程序跳转到用于进行覆盖率信息收集的基本块(blocktracing),之后再经过封装指令块(blockwrapped_instr)返回原始程序的控制流中,所谓的封装块是指封装了边界指令(分支指令、分支指令之后的指令的目的地址以及函数的入口)的基本块。blocktracing和blockwrapped_instr存储在.pcode和.pdata中,这两个节追加在待测试ELF文件节头部表的之后。通过这种方式避免影待测程序的控制流。
  • 指令封装的实现细节:
    FIG3
    注: typeir: PC irrelevant instruction
    typernp: PC read-only instruction without push operation
    typerp: PC read-only instruction with push operation
    typew: PC write instruction
    pivot: 非边界指令

4.3 Fuzzing Phase

  • 非守护程序的输入通过标准输入提供
  • 守护程序的输入则通过重定向提供到预定义的端口,对于守护进程的详细处理如下:
    FIG4

4.4 Toolchains

  • 使用Ida Pro的FlowChart函数识别目标程序的函数和基本块信息
  • 使用Capstone反汇编每一个基本块的入口指令
  • 使用Keystone将补丁信息添加到待分析的二进制程序中

5. Evaluation

5.1 Instrumentation validation

由AFLIoT记录的控制流信息更完整
FIG5

5.2 Fuzzing on real-world IoT devices

FIG6

6. Conclusion or Limitations

  • Variant Fuzzing Efficiency on IoT devices
  • Lack of Strategy Improvement in Fuzzing Phase
  • Incompleteness for Static Binary Instrumentation
  • Memory Limitation for On-Device Address Sanitizer

7.1 Improvement on AFL

方法或工具或研究人员 描述
AFLFast 它使用了马尔可夫链识别低频路径,并集中探索该部分路径
AFLGo 使用模拟退火算法将能量分配给目标分支,完成导向模糊测试
Hawkeye 基于静态分析和路径分析提升导向型模糊测试的性能
VUzzer 使用控制流图筛选输入
FairFuzz 指导种子变异生成用于高效探索低频路径的种子(之前的方法虽然能识别低频路径但是生成的种子依然很少能命中分支)

7.2 Firmware analysis

方法或工具或研究人员 描述
Avatar 使用硬件在环仿真完成固件分析
IoTFuzzer 借助移动端辅助完成对基于Linux的嵌入式固件的黑盒模糊测试
Firm-AFL 提出将应用级仿真和系统级仿真相结合,提升嵌入式固件模糊测的效率
Pretender 使用机器学习方法完成对外设及其交互的建模
PeriScope 一种基于Linux内核的探测和模糊测试框架,用于分析设备和驱动程序之间的交互。它使用MMIO和DMA机制来监视设备驱动程序和相应硬件设备之间的流量
RetroWrite 利用静态工具来模糊分析COTS二进制文件。使用符号化来解决x86_64二进制文件的插装问题
ZAFL 它利用二进制重写提升使用编译器级插装的模糊器的能力

8. Comments

本文设计的AFLIoT,使用无偏移的二进制插装技术重写固件二进制,完成对基于Linux的物联网二进制程序设备的模糊测试。

注:解读如有错误或不当之处,麻烦在评论区批评指正。