Machine-Learning-Guided Selectively Unsound Static Analysis

题目: Machine-Learning-Guided Selectively Unsound Static Analysis
作者: Kihong Heo, Hakjoo Oh, Kwangkeun Yi
单位: Seoul National University
出版: ICSE, 2017

解决的问题

传统静态分析工具为了提高准确性和稳定性,通常是整体不完备(uniformly unsound)的。然而这就会导致它们的漏报率很高。采用完备的方法通常会导致高误报。本文的方法对上面两种进行了平衡。

贡献点

  • 选择性地增加不完备性
  • 利用机器学习的方法将静态分析自动调整为选择性不完备(selectively unsound)
  • 通过两个基于C语言的实验说明方法的有效性

原理

选择性不完备

为说明整体不完备分析(uniformly unsound analysis),整体完备分析(uniformly sound analysis)和选择性不完备分析(selectively unsound analysis),在区间分析中考虑图中两个循环:

- 对于整体不完备的方法,会将上面两个循环都展开一次,也就将两个缓冲区的访问都视为安全的了,因为两个循环展开后i的取值区间都为[0, 0],这会导致忽略掉第二个循环的true alarm。
- 整体完备的方法不会展开两个循环,它能够检测出第二个循环的漏洞,却会得到第一个循环的false alarm。因为在此区间无法获得str的属性,对于第一个循环,整体完备的方法会将i的范围考虑为0到正无穷。
- 我们的方法仅仅在有可能得到错误警告的地方引入不完备性。如下图所示:

选择性引入不完备性将利用机器学习方法完成。

机器学习过程

我们的选择性不完备学习过程分为三个步骤:
- 为codebase收集无害的程序组件(循环,库函数调用,…)
- 将程序组件表示为特征向量
- 用异常检测算法来学习无害程序组件的特性

方法

参数化静态分析策略

参数控制分析的完备性而不是精确性。完备性参数是需要进行完备分析的程序组件的集合。也就是说,这些组件有可能会产生真正的bug(true alarms)。例如程序组件是程序中的循环时,我们保留属于完备性参数集合的循环而不是将它展开。

得到分类器

特征:

对于集合中的每一个元素,得到一个特征向量。特征的选择要基于具体的例子。

学习过程:

使用OC-SVM算法,OC-SVM是一种无监督的异常检测模型——将新的数据分类为与训练数据相似或不同。我们假设(intuition)无害的程序组件会有一些共性,而有害的组件是非典型的。

生成训练数据:

我们的codebase是一个程序的集合,其中每个程序都含有一些有bug的程序点。对于每个程序,我们运行整体完备的静态分析,将输出的警告分为正确的和错误的。然后对于每个程序组件j,我们运行除j以外的所有组件,j被认为是无害的,当分析结果依旧能够得到所有的真正的bug,而错误警报有所下降。

实例

我们选择函数中的循环和库函数调用来选择性地添加不完备性,并且对两个实例进行分析:区间分析用来找出可能的缓冲区溢出错误,污点分析用来检测格式化字符串漏洞。

一般的,选择性不完备的静态分析

抽象语义

考虑下面的简单的形式语言:

在程序中,循环和库函数调用被标记出来,组成程序组件的集合。我们的分析方法的抽象语义如下图所示:

特征

我们为程序中的循环和库函数调用设计了如下37个特征:


在区间分析和污点分析中均使用以上特征。

区间分析


根据分析结果,当数组的序号比它的大小更大的时候就会报告一个缓冲区溢出警告。

污点分析


根据分析结果,当一个格式化字符串参数中包含污点时,报告一个格式化字符串漏洞警告。

实验

实验目的

我们设计了实验来回答以下问题:
- 我们的方法是否有效,与fully sound和fully unsound方法进行对比
- OC-SVM的有效性,与二分类进行对比
- 我们该如何选择特征来有效预测无害的程序组件
- 我们的时间开销有多大

实验设置

  • 我们在一个C静态分析器的基础上实现了我们的方法,该静态分析器是不完备的,旨在精确地找到bug。它忽略了复杂操作并且过滤掉了不可能为真的警告(?)。
  • 我们修改了这个基准分析器,创建了两个实例分析器:区间分析器和污点分析器。对于每个分析器,我们构建了一个完备的版本(baseline),一个整体不完备的版本(uniform)和一个选择性不完备的版本(selective)。
  • 对于区间分析,uniform被设定为对每个loop和library call不完备;对于污点分析,uniform被设定为对所有的library call不完备(而不包括loop)。
  • OC-SVM方面,我们利用了sk-learn包,并采用了算法的默认配置。
  • 我们的实验是在36个buggy程序点已知的程序上进行的。其中一共含有138个缓冲区溢出bug和106个格式化字符串bug。

方法有效性

leave-one-out交叉验证

利用一个程序进行验证,其他程序保留作为训练集。
区间分析的结果:

污点分析的结果:

2折/3折交叉验证

benchmark程序被随机分为2等份/3等份,其中一份被用来验证,其他用来训练,结果如下:

OC-SVM的有效性

我们利用一个二分类SVM分类器,一个50%的随机分类,和一个以OC-SVM的概率进行的随机分类作为对比,来检测OC-SVM的有效性,结果如下:

特征设计

我们利用信息增益对特征进行了评价。结果显示PtrInc,Array,FinString,Null,Const等对两个实例都起到了效果,对于污点分析,#Args和#AbsLoc是较好的特征。

时间开销

分析全部的区间分析程序,完备的分析器需要42.1s,不完备的分析器需要27.7s,我们的方法需要33.8s。

局限性

依然存在的false alarm

导致false alarm依然存在的主要原因是有时为了检测true alarm,false alarm是不可避免的。例如它们出现在同一个循环中则无法将它们分开。为减少这一类false alarm,我们需要更细粒度地引入完备性。

漏掉的true alarm

发生漏报的主要原因是这样的bug包含在了典型的无害循环中。然而根据我们的检查,这样的bug的根源一般都与我们检测到的其他bug相关。修复了我们所检测到的bug,漏报的bug也就自动被修复了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值