USENIX2021-Fine Grained Dataflow Tracking with Proximal Gradients

具有近梯度的细粒度数据流跟踪

摘要

我们介绍了近端梯度分析(PGA),这是一种新的、理论上有根据的方法,可以跟踪更精确和细粒度的数据流信息。PGA使用近似梯度(不可微函数梯度的推广)在程序中精确地合成不可微操作上的梯度。在程序上合成渐变消除了DTA中发生的许多数据流传播错误,并提供了关于每个测量数据流如何影响程序的更丰富信息。我们将我们的原型PGA实现与7个现实世界程序上的三种最先进的DTA实现进行了比较。我们的结果表明,PGA可以在不引入任何显著开销(平均<5%)的情况下,将数据流跟踪的F1精度提高33%(平均20%)。我们通过发现22个bug(20个由开发人员确认)和2个侧通道泄漏,并在测试程序中识别19个现有CVE中可利用的数据流,进一步证明了PGA的有效性。

实现代码:https://github.com/gryan11/PGA

主要内容

在本文中,我们提出了一种替代的数据流度量方法,它解决了DTA的局限性,同时保留了DTA在可伸缩性方面的优势。我们观察到,梯度是初等微积分导数的多变量推广,是通过可微模型跟踪输入影响的常用方法。
优势:
(一)细粒度跟踪。梯度测量影响的大小和方向,这表明对操作输入的更改将如何影响其输出。这意味着可以使用渐变来确定哪些标记源最有影响力,以及它们将如何影响程序行为。这如图1所示,其中梯度的大小确定了最有影响的输入,梯度的方向指示了如何改变输入以达到漏洞。
(二)准确的构成。梯度可用于确定操作输入何时因合成而对其输出没有影响。
然而,一般来说,程序包含许多不可微操作,这些操作具有不同类型的非光滑行为(如图2所示的位运算、整数算术和分支),无法直接区分。因此,我们在丰富的非光滑微积分文献的基础上,为满足较弱形式的链式规则的程序定义广义梯度[22,31,52]。为了评估程序上的广义梯度,我们使用了近似梯度,它通过寻找局部极小值来计算不可微操作上的梯度。近梯度为梯度评估提供了一个理论基础框架,允许我们精确跟踪真实程序中的数据流,且合成误差最小。
Proximal Algorithms
近端梯度法(Proximal Gradient Method, PG)
在高层,我们的梯度传播框架PGA类似于Autodiff,计算每个操作的梯度,并将结果作为下一个梯度计算的输入。然而,与Autodiff不同,我们用近端梯度近似离散函数的梯度.
在这里插入图片描述

在这里插入图片描述
算法2正式描述了在程序中计算从一组源到每个指定汇的梯度的过程。返回的JacobianJ基于从每个源传播到每个汇的最大导数包含每个汇的梯度(例如,如果汇在循环中,汇可能记录来自单个源的多个导数)。

导数传播规则
我们定义了一个通用框架,用于在程序分析中需要处理的5个抽象操作类上传播导数:浮点操作、整数值操作、加载和存储变量、分支以及对外部库的函数调用。
1.浮点运算:我们将浮点运算视为连续函数,并应用标准链式规则及其解析导数。如果存在任何潜在的非平滑浮点操作,例如浮点模运算,或浮点类型之间的类型转换,则使用近似导数。
2.整数运算:我们考虑任何涉及整数的布尔或类型转换为整数运算,以及任何算术、位移位或整数或指针类型的模运算。一般来说,我们在所有整数运算中使用近似导数,尽管在某些情况下,例如算术加法和乘法,我们使用解析导数作为可选优化。
3.加载和存储:当从内存中存储或加载变量时,也会存储或加载其关联的导数(我们的实现使用阴影内存来跟踪内存中的导数,尽管可以使用任何关联跟踪机制)。如果传递给加载指令的内存地址具有非零导数,则将加载变量的导数设置为1。如果它没有非零导数,则为0。这是一个简化的近似值,可能会导致计算近端梯度时出现错误。然而,我们注意到,通过对相邻内存位置进行采样,可以潜在地评估加载操作的近端导数。我们把这留给今后的工作。
4.分支:当动态计算导数时,我们只能对当前执行路径上的导数进行推理。如果计算导数需要对备用执行路径进行采样,则我们将该导数设置为0。因此,当遇到分支时,我们将基于将更改分支条件的样本的任何导数设置为0。这种方法可能会遗漏梯度的某些部分,但可以确保我们不会传播错误的导数。我们注意到,在处理分支时,跨多个执行路径采样可以产生更精确的近端导数和关于控制流数据流(即隐式数据流)的原因,我们将此留给未来的工作。
5.外部库函数:如果它们没有副作用,外部库函数调用的导数可以使用近端导数计算,而具有副作用的函数必须逐个处理。当外部函数覆盖缓冲区时,我们也会清除与该缓冲区关联的存储导数。

总体架构
我们将grsan建立在LLVM的污染跟踪实现DataFlowSanitizer(dfsan)的基础上,该实现使用阴影内存跟踪污染标签。对于应用程序内存的每个字节,有两个对应的阴影内存字节存储该字节的污染标签。
首先,我们添加与存储渐变信息的每个标签相关联的附加元数据,该信息存储在单独的表中。阴影内存中的每个标签都与渐变表中不同的导数值相关联。0标签是为0导数保留的,任何对常量或未标记变量的阴影内存查找都会返回标签0。
其次,我们更改数据流传播规则,以计算每个操作的梯度。grsan仪器如何工作的示例。给定一个操作y=2*x,仪器首先从阴影内存中查找每个输入2和x的导数。如果任何输入具有非零导数,它将计算输出y的导数,并通过将当前最大标签增加1来生成新的阴影内存标签。然后,它在阴影内存和渐变表中分配空间,并存储新标签和相关的y导数。
在这里插入图片描述
作为额外的优化,在存储操作的输出导数时,我们首先将其与输入导数进行比较。如果输出导数等于其中一个,我们将等效输入导数的标签应用于输出,而不是生成新的标签和渐变表项。由于许多操作不会更改导数的值(例如,x=x1;),这将显著减少需要跟踪的不同标签的数量。
在当前的实现中,grsan一次跟踪来自单个源的导数,并行传播来自源的两个导数。当计算多个源(例如输入文件中的字节)上的梯度时,我们对每个源执行一次程序。我们打算在未来的工作中扩展grsan以支持多个并行源。
优点
在预测源和汇之间的数据流时,以梯度编码的附加信息可以极大地提高精度(即减少误报的数量),而幅度和方向信息可以用于根据重要性和预测效果对数据流进行优先级排序。我们在数据流准确性、引导模糊以及漏洞检测和分析评估(第5.2.1节、第5.2.3节、第5.3节)中看到,相对于DTA,PGA的性能得到了改进,从梯度中获得的附加信息带来了好处。
PGA的局限性
虽然我们的PGA实现在我们的评估基础上明显有效,但如何在评估近端梯度时对非平滑操作进行最佳采样是一个开放的问题。我们的原型使用了一种简单的固定采样策略,在某些操作上没有完全实现近似梯度,例如带导数的指针上的负载(第3.3节),这有时会导致梯度计算中的错误。这些错误的影响可以在我们的数据流准确性评估(第5.2.1节)中看到,其中GRSAN的召回率略低于DFSAN,表明某些梯度错误地评估为0。我们相信,在抽样策略中加入更多关于特定操作的信息,以及跟踪某些操作的有效域,将减少这些错误。
我们实现PGA的第二个限制是,与大多数DTA框架一样,它不建模隐式数据流,例如控制流依赖项。这可以在我们的CVE评估(第5.3.1节)中看到,其中两个测试CVE不能被PGA或DTA检测到。我们打算在未来的工作中探索评估近端梯度和建模隐式数据流的更精确方法。

相关工作

动态污染分析。动态污染分析(DTA)在运行时跟踪从污染源到污染汇的数据流。DTA的常见应用包括软件漏洞分析和信息泄漏检测[15,18,34,58,59]。DTA通常会高估受污染的字节,这会造成巨大的性能开销。因此,DTA最近的大部分工作都集中在开发更高效的系统[7,25,29]。与DTA一样,PGA动态传播数据流信息,但它以梯度的形式提供更细粒度的信息。此外,PGA比DTA更精确,从而减少了大型程序中的过度上漆。一些DTA系统使用位级污染跟踪来提高精度,但代价是更高的开销[54,55]。尽管我们尚未在当前原型中实现它,但基于函数布尔分析,梯度也可以在单个位上传播,我们希望它能够在更高的开销下提供类似的折衷,以提高精度[35]。最近,自动学习污染规则已被用于减少DTA中的近似误差[12]。这种方法与我们的方法是正交的,也有可能用于学习梯度传播规则。
定量信息流。定量信息流(QIF)使用基于熵的度量,如信道容量和minentropy,测量通过程序的潜在信息传输[19,28,50]。QIF主要用于检测信息泄漏和确保程序机密的完整性[3,17,23],但也被提议作为加强污染跟踪的一种方式[33]。PGA添加了附录a中讨论的不同类型的信息,并且没有精确估计信息流所涉及的高计算复杂度。
梯度引导模糊。最近的模糊化者使用梯度近似来指导他们的变异过程。Angora通过对修改后的输入执行程序并记录输出中的变化来估计有限差分,这是一种梯度近似,具有许多已知的限制,特别是对于高维问题[10,39]。NEUZZ、MTFuzz和Neutaint训练神经网络来预测程序分支行为,并使用网络的梯度来指导变异算法[43–45]。与基于工具的方法相比,这会产生更少的开销,但也不太准确,因为它是在程序的近似模型上运行的。相比之下,PGA直接在程序的各个指令上计算梯度,因此产生精确的梯度。
程序平滑。先前的工作探索了通过高斯核[8,9]或SMT的参数松弛[41,57]平滑解释程序来计算梯度。这些方法使用符号推理,尚未应用于实际程序的分析。PGA的近似方法更有效,并已成功地在实际程序中演示。

相关知识点

  • 动态污点分析(Dynamic Taint Analysis)

动态污点分析浅述

  • 定量信息流(QIF)

动态污点分析的原理是,攻击者不应能够控制函数指针和返回地址等值,但它使用简单的二进制近似值来控制,这通常会导致假地址和假阴性错误。基于信道容量,我们提出了一种更精确的影响定量度量,它可以有效区分真实攻击和误报。我们使用影响测量技术的实际实现,结合在x86二进制文件上运行的动态污染分析,对易受攻击的网络服务器产生的污染警告进行分类,例如受到Blaster和SQL Slammer蠕虫攻击的服务器。影响度量能够正确区分真实攻击和污染误报,否则这项任务需要手动完成。
《Measuring Channel Capacity to Distinguish Undue Influence》

DTA的局限性导致一些研究人员提出了基于定量信息流(QIF)的方法,作为更细粒度的数据流形式[33]。然而,虽然QIF能够更精确地跟踪数据,但计算这些度量在计算上非常昂贵,并且不有效地扩展到大型程序。

定义:Lipschitz连续,要求函数图像的曲线上任意两点连线的斜率一致有界,就是任意的斜率都小于同一个常数,这个常数就是Lipschitz常数。
从局部看:我们可以取两个充分接近的点,如果这个时候斜率的极限存在的话,这个斜率的极限就是这个点的导数。也就是说函数可导,又是Lipschitz连续,那么导数有界。反过来,如果可导函数,导数有界,可以推出函数Lipschitz连续。
从整体看:Lipschitz连续要求函数在无限的区间上不能有超过线性的增长,所以这些函数在无限区间上不是Lipschitz连续的。

作者:cielo
链接:https://www.zhihu.com/question/51809602/answer/151391605
来源:知乎

Lipschitz连续条件限制了一个连续函数的最大局部变动幅度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值