基于SFuzz切片的实时操作系统模糊

Abstract

背景:嵌入式系统大多是实时操作系统。

问题:RTOS的单体设计将各种任务和服务结合成一个单一的二进制文件,这阻碍了目前在RTOS系统上的程序测试和分析技术。

目的:提出了SFuzz,一种新型的基于切片的模糊器,用于检测RTOS系统的安全漏洞。作者认为RTOS通常将一个复杂的二进制文件划分为许多分离但一心一意的任务。每个任务以确定的方式完成一个特定的事件,其控制流通常是直接和独立的。因此,作者从单一的RTOS二进制文件中识别出这样的代码,并合成一个切片进行有效的测试。

方法:SFuzz首先识别处理用户输入的函数,构建从这些函数的调用者开始的调用图,并利用前向切片来构建基于调用图的执行树,并修剪独立于外部输入的路径。然后,它检测粗粒度范围内阻碍有效模糊处理的路障,如与用户输入无关的指令。然后,它在这些代码片段上进行覆盖率引导的模糊处理。最后,SFuzz利用前向和后向切片来跟踪和验证每个路径约束,并确定在模糊器中发现的错误是否是真正的漏洞。

理解:貌似作者首先从用户输入的函数开始构建调用图,然后基于调用图利用前向切片构建执行树,

INTRODUCTION

传统静态分析的挑战:单体RTOS二进制的大尺寸(路径爆炸)、难识别函数语义、无正确和稳定的仿真环境

现状:要么只在特定的设备上工作,要么依赖真实的设备,要么检测有限的错误类型,要么需要人工分析和领域知识,总的来说,在RTOS中缺乏一种灵活和通用的方法来有效地发现漏洞。

方法:因为RTOS通常将一个应用划分为许多分离的子任务,每个子任务的控制流都是独立的,它们的数据流或许会有类似的模式。所以首先寻找相同的数据流,然后定位对应函数,然后切片代码,对得到的切片代码进行模糊测试。“这些切片足够小,可以使用现有的模糊逻辑进行测试。此外,它们提出了更小但更关键的控制流范围。它可以大大缓解仿真难度和分析复杂性,这将使我们能够进行更有效和高效的测试,如灰盒模糊和符号执行。”

SFuzz:四个主要部分

  • 正向切片机:定义启发式方法来定位函数,然后构造调用图,在调用图中进行前向切片。
  • 控制流节点处理程序:使用控制流节点处理程序来给模糊器补充运行状态和运行上下文,指导模糊器确定如何处理与用户输入无关的函数调用和条件分支,这可以帮助模糊引擎提高路径探索的效率和稳定性。
  • 微观模糊处理:我们的模糊引擎专注于修剪后的执行树中的指令。从输入源开始,它通过指令级仿真更新执行环境。该引擎将执行与输入相关的代码片段,并忽略大量不必要的路径,包括其他输入处理程序。为了检查危险的行为,它监测汇合点函数调用的上下文,并在上下文违反预定的安全策略时报告潜在的错误。
  • 符号执行分析:对函数进行后向切片,然后从切片末尾进行符号执行,目的是补充上面修建而遗失的信息,最后实现一个完整而准确的路径条件来评估一个漏洞,从而过滤由于探索修剪和上下文缺失造成的假阳性结果。

PROBLEM AND APPROACH OVERVIEW

RTOS and Embedded Devices

  • 具有所有功能的单二进制
  • 剥离了符号系统以减小文件大小

Motivation Example

举了个例子说明RTOS难分析

Necessity and Reasonability of SFuzz

  • 切片操作的优势:可以忽略模拟各种硬件和服务功能的困难,缓解符号执行的缓解路径爆炸问题
  • 使用实例验证切片操作的正确性

Challenges of Slice-based Fuzzing

  • 如何确定片段的范围?
  • 如何处理片段中与控制流有关的点?
  • 如何有效地进行基于切片的模糊处理和验证PoC?

DESIGN

image-20221110163825829

前向切片机将调用图分析与前向污点分析相结合,以确定基于切片的模糊处理的每个任务的探索空间;控制流节点处理程序用于帮助后续的模糊处理部分跳过不必要的路径探索,这些节点会使模糊处理阶段卡住;微模糊引擎是一个混合灰盒模糊器,它结合了一些低级技术,如错误检测策略,使模糊器能够顺利运行并发现错误,Concolic分析器主要是为了帮助我们过滤由于探索修剪和上下文缺失造成的假阳性结果。

Forward Slicer

步骤概述:首先恢复固件中关键功能的语义,以定位外部数据入口点,然后利用前向切片模块输出与处理外部输入和全局数据有关的执行树。

三部分:

  • 敏感调用图构造器
    • 目的:检测输入获取函数和全局数据读取点,作为根节点
    • 方法:没说
  • 调用图修剪
    • 目的:进一步修剪独立于外部输入的子图或路径
    • 方法:利用轻量级(粗粒度)污染分析技术来跟踪调用图中的每个路径,确定外部输入和全局数据的影响范围,范围外的路径被修剪
  • 调用图形拼接:
    • 目的:在不同调用图的节点之间拼接一些边
    • 方法:静态动态分析来识别相关节点,还有基于常量字符串进行搜索和匹配相关节点来拼接。

Control Flow Nodes Handler

控制流节点处理程序可以基于调用图构建目标代码段的执行树。但是为了使执行树上的模糊测试工作顺利进行,避免不必要的路径探索,需要处理与控制流相关的几种指令,换句话说需要策略来指导模糊器确定如何处理代码片段中的函数调用,并选择要跳转的条件语句的哪个分支。

Micro Fuzzing

作为模糊引擎的核心,我们将基于切片的模糊技术称为微模糊。它接受代码片段作为输入,探索执行树中的路径,并忽略不相关的调用站点和其他输入数据处理程序。引擎同时检查接收器函数调用站点的上下文,并在根据预定义的策略进行内存访问时导出崩溃输入。

  • 镜像加载器:对切片代码进行预处理,插入跳转和结束指令,用于忽略不相关的调用站点和其他输入数据处理程序。
  • fuzz引擎:基于UnicornAFL,当调用核心引擎时,它加载RTOS系统,并从它的开始(执行树的根节点)重复执行目标代码片段。该引擎将在输入入口点生成随机数据。当核心模糊引擎卡住时,利用符号执行组件来引导模糊器沿着未探索的路径测试。
  • 内存安全策略。这块没懂

Concolic Analyzer

目的是检测上面模糊测试得到漏洞是不是真的漏洞,因为修剪操作可能会产生假阳性漏洞。

疑问

  • 修建执行路径会不会导致覆盖率的降低