论文阅读 SelectiveTaint: Efficient Data Flow Tracking With Static Binary Rewriting

概述

Motivation

dynamic taint analysis也被称为dynamic data flow tracking (DDFT)。State-of-the-art 的动态污点分析工具通常建立在动态二进制插桩之上,对每条可能的指令进行插桩并依靠运行时信息来决定指令是否需要进行污点传播,具有很高的性能开销。

目前的DDFT框架以及优化都基于dynamic binary instrumentation (DBI),而static binary instrumentation (SBI)会将分析所用代码静态插入到native binary中,可以减少DBI中不必要的开销。而最近,静态二进制重写技术有了新的发展(Uroboros, Ramblr, MultiVerse, and recently Datalog Disassembly)。

于是作者有了idea,基于静态二进制重写对污点分析做优化。

Contribution

提出了SelectiveTaint,第一个基于静态二进制重写的选择性污点分析框架,大幅降低了基于DBI的方法所产生的性能开销。

提出了一种保守的污点指令识别方法,使用 VSA (value set analysis,一种静态程序分析技术,用于确定一个寄存器或一个符号内存地址的可能值)识别不会涉及污点内存或寄存器的指令,从而只对其他指令做污点分析(taints)。

经过测试,优于现有的污点分析工具,如libdf

 

框架介绍

 

CFG Reconstruction

给定一个应用程序的二进制文件,从主函数开始反汇编和构建其CFG。如果有库的调用,解析调用目标,并使用函数摘要来决定是否需要进一步对库进行检测。如果遇到间接的jmp/call,进行后向切片,并使用VSA和类型信息来解析目标。

处理间接调用:使用TypeArmor和tCFI,两种forward-edge CFI识别方式,来恢复类型信息(参数数量及类型)。构建出一个过估计(over-approximation)的CFG。

处理间接跳转:(1)使用VSA分析目标地址(2)如果没有找到则考虑这个indirect是否使用到了外部数据引用(如全局变量地址)(3)否则将函数内所有可能的基本块起始地址作为潜在的跳转目标(4)否则将所有函数入口视为潜在的跳转目标。又得到一个过估计的CFG。

Value Set Analysis

用于确定特定内存地址或寄存器是否涉及污点传播,从而实现选择性的污点分析。例如,它是否是我们感兴趣的地址的别名、它是否存在污点数据的传播。相关算法如下:

 

所有指令的关系可以理解如图:理想的污点指令集I;必须taint的指令集It;不受污点影响,即不需要taint的指令集Iu。VSA可以确定Iu,作者为了避免false negatives (no missing of attacks),决定对Iu以外的所有指令做污点分析。当Iu为空时,是最坏情况,像其他基于DBI的污点分析一样分析所有指令。

 

 

 

Taint Instruction Identification

           基于VSA得到的lu,扩大must-not-tainted value set,算法如下:

 

Binary Rewriting

在确定了需要污点的指令后,使用静态二进制重写来插入污点分析逻辑,including tracking of the taint sources and taint propagations as well as the taint checks at the taint sinks.

 

实现上,CFG Reconstruction 基于angr;Binary Rewriting基于Dyninst 。

SelectiveTaint的开源代码公布在github

 

参考:

SelectiveTaint: Efficient Data Flow Tracking With Static Binary Rewriting,USENIX 2021.

SJTU  blog

开源代码公布在github

posted @ 2022-03-03 16:32  Erio  阅读(660)  评论(0编辑  收藏  举报