One Engine To Serve ’em All: Inferring Taint Rules Without Architectural Semantics 在没有建筑语义的情况下推断污点规则

一劳永逸的引擎:在没有架构语义的情况下推断污染规则

 

摘要

 

动态二进制污点分析在现成商业(COTS)二进制文件的安全性分析中具有广泛的应用。 动态二进制分析中的关键挑战之一是指定污点规则,以捕获污点信息如何传播给架构上的每条指令。 现有的大多数解决方案都是在分析指令语义后通过手动总结规则来使用演绎方法来指定帧。 直观上,污点传播反映了指令输入如何影响其输出,因此可以从指令执行中观察到。 在这项工作中,我们提出了一种用于污染传播的归纳方法,并开发了一种与体系结构无关的通用污染跟踪引擎。 我们的异味引擎TAINTINDUCE可以通过观察指令的执行行为,以最少的架构知识来学习异味规则。 为了测量其正确性并指导污染规则的产生,我们在这种新颖的设置中为位级污染跟踪定义了精确的稳健性概念。

在我们的评估中,我们表明TAINTINDUCE自动学习4种广泛使用的体系结构的规则:x86,x64,AArch64和MIPS-I。 它可以通过数百万条指令检测Linux和Windows上15个应用程序中24个CVE的漏洞,并且可以与其他成熟的现有工具(TEMU [51],libdft [32],Triton [42])相提并论。 

TAINTINDUCE可以用作独立的异味引擎,也可以用于补充现有的异味引擎以处理未处理的指令。 此外,它还可以用作交叉引用工具,以发现异味引擎,仿真实现和ISA文档中的错误。

 

I.引言

动态污染分析是一种信息流分析,它跟踪某些初始“污染”输入如何在程序执行期间对状态产生影响,并检测这种污染状态是否用于程序的关键操作中。 它在安全性方面有广泛的应用。 例如,它用于漏洞检测或诊断[15],[22],[31],[38],[44],[48],[49],[52],[54],[55]  ,[60],隐私分析[14],[46],[61]和协议恢复[17]。

   动态污点分析对于分析二进制形式的现货供应(COTS)软件特别有用。

   自从十多年前推出以来,已经开发了许多污染分析引擎。 大多数这些污点分析引擎都是基于演绎方法[11],[15],[20],[28],[32],[42],[51]。 异味引擎具有一组称为“异味传播规则”的静态规则,用于捕获程序语句的输入如何影响(或异味)其输出。 这些规则通常针对目标处理器体系结构指定一次。 当用于分析具体输入下的程序时,异味引擎会根据给定的输入,指令进行评估来评估这些规则,直到该信息传播到感兴趣的点为止。 但是,这种方法需要对目标指令集语义进行手动建模。 对于x86之类的体系结构,指令集描述跨越了多卷文本,总计数千页[30],并且每个操作代码基于其操作数的值在污点规则中都有细微的变化。 开发人员通常选择实现常用指令的子集,并省略不常见的指令,例如浮点或矢量指令。 最近的文章显示,优化的软件会在运行时检测CPU功能,并尽可能选择不常见的指令[2]。 攻击者还可以利用这一弱点利用不常见的指令来逃避检测[40]。

 

即使对于受支持的说明,现有工具也具有人为设计的污染规则。 编写规则需要花费大量精力来处理复杂的指令集固有的复杂语义和极端情况。 为了说明这一挑战,请考虑两条x86指令:和eax,0x0和eax,0xffffffff。 两条指令具有相同的操作代码。 但是,它们的异味传播语义有很大不同-第一个始终将eax的异味设置为零,而后者保留其输出值。 在第一个指令中,输入对输出没有任何影响,而输出则具有完全的影响。 由于这种复杂性,大多数污染引擎的实现远非全面而准确的。  II-B节中提供的几个示例以及我们的实验证实了这一点。 对于受支持的说明,在实践中,会逐渐添加大量解密规则和特殊(原始)规则。 随着软件,编译器,指令集规范和处理器实现的发展,创建和维护强大的异味引擎变得很繁重。

 

由于上述原因,通常针对每种目标体系结构单独开发现有的二元污染分析工具。 很自然地会问:是否存在一种“通用”算法,可以在对底层体系结构了解甚少的情况下学会进行异味分析? 这样的解决方案自然可以对任何目标体系结构的可执行文件进行污点分析。 由于污点分析是基于信息流的,它表明了一种基于归纳推断的更简单,且迄今尚未探索的方法的可能性。 我们不是从针对目标体系结构的一组静态规则开始,而是对一条指令的输入的具体值进行突变,并观察到输出状态的变化:如果一条指令的污染输入的变化会改变其输出,那么通过定义,这种影响表明 污点传播。 这种方法具有显着的优势,因为它对扰动策略无需了解所分析操作的语义,因此对目标体系结构几乎是不可知的。 足以将程序指令视为黑匣子。 其次,它仅根据提供的值来计算感兴趣程序中存在的指令的污点规则。 这消除了可能的数十亿个程序状态下成千上万条指令的规则预先指定,但不一定在所分析的程序中出现。

 

挑战。

归纳推理方法直接建议一种方法:给出指令,详尽枚举污染输入的值,并观察输出是否发生变化。 考虑一下x86-64指令和rax,rbx,其中rax是唯一的污染输入,rbx为零; 污点引擎不应将rax的污点传播到其输出。 为了发现该规则,幼稚的方法可能会尝试对其污染的输入rax尝试所有64位值。 这种方法是合理的,即,当输出受到污染时,会有一对值会产生不同的输出,充当展示影响的见证。 该方法是完整的,即,它不遗漏任何证人,因为它详尽地搜索了所有值以获取污染的输入。 但是,枚举64位空间非常缓慢。

方法。

在本文中,我们提出了一种新颖的方法来使此类污点规则推断对于二进制代码而言易于处理且实用。 除了观察和改变指令执行的具体输入和输出的能力之外,我们的方法几乎没有对底层指令集的语义做出任何假设。 关键思想是从大量输入输出样本中采样和测试指令行为。 给定一个程序及其分析输入,我们的方法可以推断出一组简洁的规则来传播they。 现代建筑的某些经验特性使这种方法可行。 首先,大多数(但不是全部)指令要么对某些输入的变化高度敏感,要么根本不敏感。 这两种指令类别都需要少量样本,以确定它们的污染输入是否影响输出。 其次,从少量测试样本中学到的简洁的污点规则可以很好地概括出未见样本上指令的行为。 最后,程序中唯一指令的数量要比ISA或其实际执行轨迹中的完整指令少几个数量级。 因此,学习到的规则可以被记忆和应用而无需重新计算,从而提高了效率。

 

为了更好地理解这种方法(和一般的污点分析技术),我们提供了对完整性和完整性的正式定义,它捕获了在程序的具体运行过程中程序状态之间影响的精确概念。 该定义为许多先前作品中观察到的色差或色差概念提供了新颖的观点[47]; 此外,它允许人们通过具体执行来实地测试异味引擎实施的正确性。 其次,我们构建了一个名为TAINTINDUCE的原型工具,该工具可以在两种模式下运行:精确和泛化。 在精确模式下,TAINTINDUCE学习的规则永远不会高估程序状态在另一个状态上执行时的影响。 在泛化模式下,TAINTINDUCE会通过乐观地扩展针对未见程序状态的指令学习的规则的适用性,仔细权衡合理性与效率。

 

我们的TAINTINDUCE原型在基于Qemu构建的独角兽[18] CPU仿真器上实现,并支持4种广泛使用的体系结构。  TAINTINDUCE可以用作独立的异味分析引擎,需要对每个体系结构进行最少的配置,或者补充现有的异味引擎以处理未处理的指令。 此外,用作交叉引用工具以比较从污点计算的抽象评估的其他污点引擎,仿真器实施甚至CPU实施的正确性是有用的。

 

评估结果。

首先,TAINTINDUCE是一种可行的体系结构不可知的方法,具有相当的简单性。 它会自动跨4种广泛使用的体系结构正确学习成千上万条指令的污点规则,而无需专门知识:x86,x64,AArch64和MIPS-I。 我们自动检查了1530条指令的规则,发现即使在TAINTINDUCE的泛化模式(理论上不能保证其健壮性)下,也可以听到超过1,064个案例。 其次,TAINTINDUCE成功检测到24个CVE的漏洞,并在Windows和Linux上测试了15个应用程序,在这些基准测试中传播了超过800万条指令。 第三,我们发现TAINTINDUCE与3种流行的动态异味分析引擎相当:Triton [42],libdft [32]和TEMU [51]。 它在应用了其污点规则的数百万条指令中的93.27%中以与这些工具相同的方式传播污点。

 

另外,TAINTINDUCE可用作交叉引用工具。  TAINTINDUCE发现,现有工具在处理污点数据的数百万条指令中,大约有6.64%会不合理地传播污点(或过度污点)。 它在独角兽中发现了17条丢失的指令或错误模拟的指令,英特尔开发人员手册中的一条错误,一种ISA规范的文档含糊不清的案例,以及一条具有不同CPU实现的指令。 尽管对规则进行了概括,但TAINTINDUCE仍仅针对在具体运行中测试的数百万条指令的0.09%生成不完善的规则,比其他经过测试的工具低一个数量级。

 

贡献。

我们要求以下贡献:

•我们提出了一种新的方法TAINTINDUCE,以进行动态污染分析。 据我们所知,TAINTINDUCE是第一种对二进制代码进行动态污点分析的方法,它需要通过最小化的语义来对结构语义进行最小化。 

•我们精确地定义了影响力,健全性和完整性,以便对程序执行进行动态污染分析。 我们提供了一种合理的算法来推断新颖设置中的污染规则,并说明如何系统地进行归纳。 

•我们实施了TAINTINDUCE,并评估了数百万条指令。 我们从经验上表明,我们的方法可用作独立的异味引擎和交叉引用调试辅助工具。 它适用于具有最少专业知识的4种处理器体系结构,从而发现了现有的最新工具,仿真器和ISA软件开发人员手册中的许多错误。

 

2。 问题

在二进制代码的动态污点分析中,在程序的具体执行过程中,会针对程序状态(例如寄存器或程序存储器)的每个位(或某些指定的粒度)跟踪污点信息。 异味信息可以在不同的应用程序中使用。 例如,出于机密性原因,污点分析应用程序可能会将机密输入标记为已污点,并强制执行安全检查,不允许将污点值用于公共输出。 或者,出于程序完整性的考虑,一种taintanalysis应用程序可以配置taint分析,以处理由受远程污染的远程对手控制的输入,并且不允许在关键的控制流转移中使用受污染的值。 我们在这种标准的分析设置下进行工作,其中源和接收操作(分别是污染位的产生和检查位置)是一个外部规范[58]。

 

A.污秽推理问题

我们希望在对架构的指令语义了解最少的情况下为该架构设计一种通用的污点跟踪机制。 新的污点跟踪机制将可执行程序二进制文件和具体的输入集作为输入,在该输入下分析二进制文件。 对于程序状态中的每个位,污染机制都会在数据结构(称为污染图)中维护相应的污染元数据位。 它通过在提供的输入下在程序的具体执行中单步执行每条指令来计算污点位。 我们假定已经预先对程序(或执行平台)进行了检测,以在分析人员指定的源位置(例如,在读取网络输入的点)初始化污点位,并在接收器处对其进行检查(例如,在间接控制下) 流量传输)。 这种污点追踪机制与现有的污点分析机制[38]有所不同,它会自动推断出污点规则,而不是要求根据建筑知识指定污点规则。

 

污染规则决定指令的输入状态如何影响其输出状态。 直观地讲,我们希望将污点跟踪解释为捕获影响的概念:如果对位x的输入值进行独立更改导致输出位y发生变化,则由于执行一条指令,我们说x影响y 通过该指令。 这种解释基于对系统状态的观察而不是对指令行为的预先指定,提供了一种执行污点跟踪的新方法。

 

执行模型和假设。

我们假设我们的异味引擎可以在程序执行的某个时刻改变程序状态并观察给定指令的这种改变的效果。 基于这种输入输出观察,它推断哪些程序状态位应设置或清除其对应的异味位。 我们每条指令学习一条污染规则,仅作以下假设:

 

•我们假设标准的冯·诺依曼体系结构,异味引擎可以识别指令,并区分其寄存器和内存访问。

•我们假设寄存器的数量和最大内存插槽是已知的。

•我们假设异味引擎有一个具体的评估程序,可以像标准调试器那样读写寄存器和内存。 

 

 

图1.程序状态观察结构和体系结构假设概述。 阴影部分被假定为黑匣子。 每个内存观察结果都表示为一个内存插槽,它是一个由地址和值组成的元组。 下标Ri代表第i个读存储槽,而Wi代表第i个写存储槽。

 

图1捕获了我们关于适用的体系结构类别的假设,以及我们的方法需要的访问级别。 特别是,我们的问题定义不需要以下假设:

 

•我们不需要了解寄存器的专门语义,实际上,我们将整个寄存器集视为位向量。 为了通用起见,我们假设每个感兴趣的值都是已知的位宽k,例如k = 32(对于x86)或k = 64(对于x64)。 如果分析人员不希望指定它,则可以假定足够大的位宽,并且推断的污点规则将隐式地在正确的位宽上运行。

•我们不需要拆卸指令,将两个具有相同操作代码但操作数不同的指令(例如mov eax,0x0和mov eax,0x1)视为两条不同的指令。

•我们不对程序编译,优化,特定于操作系统的ABI和软件接口做任何假设。

 

 

 

健全性和完整性

在语法上讨论了污点跟踪的语义之后,我们旨在展示一种新的二进制污点分析方法,并与现有工作进行比较; 因此,准确定义健全性或正确性标准很重要。 我们想将健全性定义为污点跟踪系统的一个属性,以确保其永远不会过高地包含不存在的影响,即不会过分污秽。 永不设置异味的异味规则系统是微不足道的。 因此,定义完整性对衡量解决方案的正确性很重要。

在这项工作中,我们根据一般的指令定义来定义健全性(和完整性):指令是在程序执行的任何时候都在整个程序状态上运行的未知函数。 程序状态是有限大小的位向量。 程序执行只是一系列评估的指令,将程序状态从一个值更改为另一个值。 我们对影响力和健全性的定义自然会扩展到一系列已执行的指令。

 

看完再补

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值