# 摘要:
如何利用神经网络技术来学习和理解代码语义,以发现漏洞
# 1、部署之前——软件漏洞检测
# 基于代码分析可包括静态、动态和混合方法。
模式识别和机器学习去做代码漏洞检测。通过源代码,还有版本控制信息,开发者活动和commit
| 方法 | 内容 | 运行部分 |
|---|---|---|
| 模式识别和机器学习 | 识别潜在的和抽象的易受攻击得代码模式,可以显著提升泛化水平 | 基于源代码 |
缺点:需要特征工程,耗时易出错
# 基于神经网络/深度学习方法
| 方法 | 内容 | 运行部分 |
|---|---|---|
| 神经网络/深度学习 | 有助于促进抽象和高度非线性模式的学习,能够捕获复杂数据的内在结构。另一方面,神经网络的使用允许自动提取特征并具有多个抽象级别,泛化水平可能更高,这样就可以减少专家。(深度学习还能发现潜在特征有助于促进抽象和高度非线性模式的学习,能够捕获复杂数据的内在结构。另一方面,神经网络的使用允许自动提取特征并具有多个抽象级别) |
缺点:基于机器学习的检测方法也严重依赖于从代码分析中提取的精心设计的特征集
语义差距:以便基于机器学习的检测系统最终能够像人类一样学习和理解易受攻击的代码语义
语义鸿沟是指从业者可以理解的漏洞的抽象语义含义与机器学习算法可以学习到的语义之间缺乏一致性。
# 所回顾的工作
该工作应用了基于深度学习/神经网络的方法进行漏洞发现,并评估了神经网络学习到的不同类型的特征表示如何帮助捕获易受攻击的代码片段的特征,从而有助于弥合语义鸿沟。

# 存在的困难
1、将人类对漏洞的理解转化为数值特征是一个抽象和量化的过程,这会导致信息损失并引入偏差
2、当我们应用机器学习算法基于提取的特征来训练模型时,由于各种原因(例如,欠拟合/过拟合、数据噪声等),模型可能会偏离我们的预期
# 传统机器学习方案
基于软件度量
McCabe度量 复杂代码难以理解、维护和测试,变更度量 频繁修改的代码容易出错,代码复杂性不是代码易受攻击的决定性因素
文本挖掘技术,从源代码上下文提取代码模式。词袋技术会忽略语序,维度灾难
许多用“静态代码分析”提取结构化特征及,作为机器学习算法学习的代码模式。从语法树(AST)、控制流图(CFG)、数据流图(PDG)、程序依赖图等等提取。
基于易受攻击的代码模式
脆弱的代码模式视为偏离正确和正常代码模式的异常模式,强调的是什么可能导致漏洞,而不是发现漏洞。
基于异常
深度神经网络(DNN)被广泛应用于自动漏洞发现!且检测性能前景广阔
可以考虑NLP对语义分析的能力,处理源代码进行代码分析也可能有效
# 神经模型
全连接网络 (FCN):全连接网络,也称为多层感知机 (MLP),被许多先驱研究者选择作为漏洞检测的模型,主要基于手工制作的特征。
卷积神经网络 (CNN):CNN 被设计用于学习结构化的空间数据 [84]。在图像处理中,CNN 第一层的滤波操作
能够从语义上相似的附近像素中学习特征。然后,后续的滤波器 1 将学习更高层次的特征,这些特征将被后续层(即密集层)用于分类。CNN 能够从附近像素学习特征的能力也有助于 NLP 任务。
循环神经网络:与前馈网络(如FCN或CNN)相比,RNN自然地设计用于处理序列数据(例如,文本)。因此,大量研究应用RNN的变体来学习漏洞的语义含义。特别是,RNN的双向形式能够捕获序列的长期依赖性。因此,许多研究利用双向LSTM(Bi-LSTM)和门控循环单元(GRU)结构来学习代码上下文依赖性,这对于理解许多类型的漏洞(例如,缓冲区溢出漏洞)的语义至关重要。
# 四类特征表示
- 基于图的特征表示:大量研究应用 DNN 从不同类型的基于图的程序表示中学习特征表示,包括 AST、CFG、PDG 及其组合。
- 基于序列的特征表示:此类别中的研究利用深度神经网络(DNN)从顺序代码实体中提取特征表示,例如执行跟踪、函数调用序列和变量流/序列。
- 基于文本的特征表示:对于这类工作,特征表示直接从代码的表面文本中学习。
- 混合特征表示:这一类别包括最近的研究,这些研究结合了上述三种类型的特征表示。
# 研究
# 基于图的特征表示
AST ,作者保留三种类型节点 1)函数调用和类实例创建的节点;2)声明的节点;以及3)控制流节点。token化
大多数漏洞都表现出一些可以从程序的AST中检索到的语法特征
Bi-GRU获得了最佳性能,F1-measure为85.9%,而DBN的性能最差
目前还没有研究将抽象语法树与其他形式的基于图的程序表示(如控制流图、程序依赖图或数据依赖图)进行比较。此外,也没有研究评估哪种程序表示能够使神经模型学习更有效的代码语义,从而产生最佳的漏洞检测性能。
# 基于序列的特征表示
该方法假设来自静态和动态分析的调用序列/跟踪可以揭示C库函数的使用模式,这些模式会表现出内存损坏漏洞。
tokenization工具
而CNN-LSTM网络在F-Score方面优于其他网络 有83.3%。它们应用序列化代码实体,供深度神经网络学习特征表示以进行漏洞检测。
这是完全扁平化的
# 基于文本的特征表示
软件代码文本让DNN学习特征表示的研究。
# 混合特征表示
结合上述几种类别,
!!!!数据质量与稀缺性:高质量、标注准确的漏洞数据集仍然有限。