前言
这个学期的软件安全课程学习了符号执行的一些基本原理,然后期末有项任务是读论文,写一写心得体会,选中了这篇论文。然后我原本想在网上找一找中文的解读,发现没有,就想自己写一篇,算是帮助大家快速上手理解论文中的重点。当然博主水平有限,如果有不正确的地方,欢迎大家指正,不胜感激。
这篇论文我是中英文对照着阅读的,中文版本由我们组长提供,翻译质量还是很高的,帮我省去了很多工作。作为一个论文小白,我喜欢读论文的时候先看中文版本获得关键的信息,关键部分又看回英文原版。
论文的动机与创新点
好的,言归正传。那么大家都知道,符号执行作为一种漏洞检测的方法,它最大的缺点就是会出现“路径爆炸”(即分支条件过多,需要运行的代码量实在太大了)的问题。
本篇论文(神经网络-符号执行,下文简称NEUEX)的作者在文中提出了一种方法,即在传统动态符号执行出现“路径爆炸”时,利用神经网络完成约束求解。(这里插句题外话,就我所知采用全连接方式的神经网络的,中间的参数也不少,训练这样的神经网络也挺耗时的,所以效果怎么样,还是得看实验结果)为了完成这一步,有两个问题需要解决,一是如何构建神经网络,二是神经网络经过线性求和和激活函数后得到的结果,如何利用它解出符号化的变量的实际值。
图 1 论文的创新点
具体实现
神经网络构建
图 2 神经符号执行的神经网络模式
从神经网络的流程图可以发现,对于每一次漏洞发掘,都需要根据可能的候选漏洞点,先通过SMT(传统符号执行的求解器)求出对应的输入,并在此基础上适当突变,生成对应的训练集,并通过训练集来训练神经网络。(这里也可以看出其实模型的泛化能力有待提高。)神经网络采用多层感知机(即神经元之间采用全连接的方式)。采用Relu作为激活函数(此处敲小黑板,这个激活函数很重要,能够解决梯度消失的问题)。此外,作者还引入了早停机制减少了过拟合。
图 3 Relu激活函数
NEUEX执行步骤
图 4 NEUEX执行步骤
首先,对代码进行预处理,估计程序中可能出现的候选漏洞点(例如除0、缓冲区溢出等)。
之后,采用传统的动态符号执行运行程序。当出现动态符号执行无法捕获的约束条件时,终止此路径上的动态符号执行。并记录下所有符号约束和所有相关变量的具体值,开启一个单独的神经网络并行进程。
当程序的输入通过神经网络进程,最终输出后,分为纯神经执行输出和混合执行输出(我的理解是纯神经执行中不包含能被传统符号执行求解器求解的约束;而混合执行中既有符号执行的约束,也有神经执行的约束)。对于纯神经执行,将最终神经网络得到的结果编码为一个对每个变量 都可导的损失函数 ,之后对于每个变量,都通过其导函数,更新得到 (其中 为学习率,控制更新的速度 )。(听到这里,是不是感觉高数、人智和论文的知识都结合起来了)此外,作者还设置了最大迭代次数避免无限循环;并从多个随机初始状态开始避免陷入局部最小值。对于混合执行,作者提出了两种解决策略。一是首先运行符号执行,得到可能的变量的取值,带入神经执行中判断,如果满足则输出SAT(找到解),否则将符号执行的解作为反例,重新求解新约束下的符号执行。二是作者提出的创新点,作者提出,可以将符号约束也编码为损失函数 ,具体不同符号约束的编码方式如下。
表 1 符号约束编码为损失函数
(a和b表示任意表达式。S1和S2表示任意的符号约束。L表示用于神经约束求解的损失函数。 Ls1和ls2 表示符号约束S1和的损失函数 S2分别。α代表一个小的正值,β表示非零的小实数值。)
Symbolic Constraint | Loss Function (L) |
S1 ::= a<b | L =max(a -b+ α,0) |
S1 ::= a >b | L =max(b -a+ α,0) |
S1 ::=a≤b | L = max(a- b, 0) |
S1 ::= a≥b | L =max(b- a,0) |
S1 ::=a=b | L = abs(a-b) |
S1 ::=a≠b | L = max( -1 , -abs(a-b+β)) |
S1∧S2 | L =Ls1 +Ls2 |
S1 V S2 | L =min(Ls1,Ls2) |
这样编码合理吗?举个栗子,来看第一条。我们的目标是使损失函数 最小,当其取 时,说明 ,近似忽略 满足符号约束;当其取 时,首先使其大于0 ,但又满足其最小,因此 略小于 ,满足符号约束。此外,根据损失函数得到的变量的结果,还需要带入符号约束中进行检验。因此,从我的角度来看,这样编码还是非常有效且方便的。
效果
作者将NEUEX与其他符号执行的方法进行了比较。
首先是与经典的动态执行Vanilla Klee相比。从图5和图6可以看到,NEUEX无论在找到Bug数量和发现漏洞的时间上,都显著优于Klee。
图 5 NEUEX与Klee发现Bug数量比较
图 6 NEUEX与Klee发现Bug的时间对比
尾声
好的,我觉得这篇论文中比较重要的点都介绍完了。其中如果有不正确的地方,欢迎大家评论讨论。