type
status
date
slug
summary
tags
category
icon
password
Property
Oct 13, 2024 01:48 AM
论文题目:基于CNN-GAP可解释性模型的软件源码漏洞检测方法
论文作者:WANG Jian, , KUANG Hongyu, LI Ruilin, SU Yunfei
发表会议/期刊:电子与信息学报
发布时间:2022年
Part 1 研究背景
1. 传统检测方法的局限
静态分析检测方法包括基于逻辑推理的抽象解释和模型检验方法,以及基于中间表示形式的程序分析方法;动态检测方法包括模糊测试、符号执行、污点分析等。静态分析检测方法代码覆盖率高,但准确率低、漏报高;动态检测方法准确率高,但效率低、开销大
2. 深度学习在漏洞检测中的应用及问题
- 程序源码信息提取困难,不清楚哪些信息能反映漏洞特征以及如何提取
- 程序源码信息向量嵌入存在问题,由于源码中自定义标识符多,词嵌入时会出现很多库外词,难以同时缓解此问题并保留语义相关性。
- 神经网络模型缺乏可解释性,难以解释模型判定的依据。
Part 2 实验思路
数据处理阶段:
归一化处理
将源代码中的函数转化为适合神经网络模型处理的数据。建立 3 种分隔符的语料库,将函数切分为 token 序列,对部分自定义标识符进行归一化,用占位符代替原来的标识符,保留一些特殊标识符,如内存操作和类型名相关的标识符。通过正则表达式匹配出函数名、变量名和字符串,并用特定格式替换。
词向量嵌入
用 One - hot 编码方式对 token 进行词向量嵌入,整个语料库共有 255 个词,每个 token 被编码成 255 维的词向量。为得到固定形状大小的神经网络输入,对 token 序列的函数源码进行截断或补齐,最终函数源码转换为的向量。
模型选择思路:
采用卷积神经网络和全局平均池化相结合的模型(CNN - GAP)。使用 3 层卷积神经网络模型,卷积核数量为 128 个,卷积核大小分别为 6、5、4,移动步长均为 1。在前 3 层卷积计算中,将输出特征图补全到原图形状大小。全局平均池化层将最后一个卷积层输出的每个特征图的激活值取平均,其加权和作为 Softmax 层的输入。
- 有效特征提取
通过 CNN 的卷积层,能够自动从输入的函数源码向量中提取出有效的特征。不同大小卷积核的组合可以充分捕捉源码中不同层次和尺度的特征信息,这些特征对于判断函数是否存在漏洞至关重要。
- 特征简化与整合
GAP 层的作用是对卷积层提取的复杂特征进行简化和整合。它避免了传统池化方法(如最大池化)可能丢失过多信息的问题,通过平均池化的方式保留了特征图的整体信息。
- 分类决策
Softmax 层基于 GAP 层输出的特征向量进行分类决策,输出每个类别的概率值。这使得模型能够根据输入的函数源码特征判断其是否属于包含漏洞的类别。
Part 3 训练和结果分析
与Russell 模型对比
在 CWE - 119 类型的数据集上,将 CNN - GAP 模型与 Russell 模型进行对比实验。对比指标包括 F1 值、Precision 值、Recall 值、AUC 值等,通过这些指标评估两个模型在漏洞检测性能上的差异。
分析两个模型在不同召回率下的精确率变化情况,以及通过 ROC 曲线对比模型的整体性能。同时,考虑到两个模型对 token 处理方式的不同,分析这种差异对漏洞检测效果的影响。
- CNN - GAP 在准确性和对正负样本区分能力上表现良好.
- Russell 模型对 token 进行归一化的方式是将 token 替换成字符串、浮点数等类型;CNN - GAP 模型对每个 token 都采用不同的占位符来表示
与 VulDeePecker 模型对比
将已训练好的 CNN - GAP 模型与 VulDeePecker 模型在 VulDeePecker 测试的 CWE - 119 类型数据集上进行对比。同样对比 F1 值、Precision 值、Recall 值等指标,验证 CNN - GAP 模型的泛化性能。
分析两个模型在处理程序源码方式上的差异,如 VulDeePecker 模型需要对程序进行分析切片提取,而 CNN - GAP 模型直接处理整个函数源码,探讨这种差异对模型性能和实用性的影响。
- CNN - GAP 模型虽然没有在 VulDeePecker 模型的数据集上进行训练,仅仅在其测试集上进行实验,但实验结果非常接近 VulDeePecker 模型。这表明 CNN - GAP 模型具有较好的泛化性能
- VulDeePecker 模型需要将程序进行分析切片提取,其前向切片和后向切片只保留了其关注的程序中几种易出现漏洞的元素,CNN - GAP 模型无需对程序进行切片,简化了预处理过程,而且包含了整个函数中所有元素的控制流和数据流依赖
- CNN - GAP 模型包含了更全面的代码信息,虽然在 Recall、F1 等参数上略低于 VulDeePecker 模型,但在精确率上高于 VulDeePecker 模型,更适用于漏洞分类。
可解释性分析实验
由于模型的输出值是根据特征图中各位置的激活值得到的,而全局平均池化(GAP)层对最后一个卷积层输出的特征图进行了处理。
通过对 GAP 层输出信息进行可解释性分析,可以计算得到源码中每个 token 对分类结果的重要性,实验将 GAP 中的特征映射到函数源码中的每条语句,而不是每个 token。即将程序语句中每个 token 的重要性(权重值)进行相加作为此程序语句对分类结果的重要性。
- 针对堆溢出漏洞代码,图8中第10行到13行与漏洞特征相关,这几行代码包含了 strncat 漏洞代码、data 堆内存、source数组,直观上能表示出漏洞特征对最后分类的重要性。
- 针对栈溢出漏洞代码,图 9 中表明第 12、13 行与漏洞特征相关,这几行代码包含了 memcpy 漏洞代码,也能直观地表示出漏洞特征对最后分类的重要性。
Part 4 总结
论文主要工作是提出一种基于 CNN - GAP 可解释性模型的软件源码漏洞检测方法。首先在源代码预处理中对部分自定义标识符归一化并用 One - hot 编码词嵌入缓解库外词问题;接着构建 CNN - GAP 神经网络模型识别含 CWE - 119 缓冲区溢出漏洞的函数;最后通过 CAM 可解释方法可视化输出结果标识相关代码。通过与 Russell 等人及 VulDeePecker 模型对比,验证了 CNN - GAP 模型的有效性和泛化性。
- 作者:百川🌊
- 链接:https://www.baichuanweb.cn/article/example-80
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。