APP下载

采用双向GRU的软件源代码漏洞检测方法

2022-09-17赵墨刊李冬辉

现代电子技术 2022年18期
关键词:误报率漏报源代码

赵墨刊,李冬辉

(天津大学 电气自动化与信息工程学院,天津 300072)

0 引 言

软件源代码漏洞检测始终是软件安全领域的一个重要问题。目前,越来越多的项目使得软件更加复杂和多样化,从而导致很难管理。在一个巨大的软件系统中,任何微小的漏洞都可能导致整个系统崩溃。尽管漏洞的危害性是众所周知的,但要开发没有漏洞的完美软件是不可能的,软件源代码出现漏洞不可避免。因此,源代码漏洞检测在软件开发和维护中起着不可或缺的作用。

在软件安全领域,如何发现和减少软件源代码漏洞已经成为一个根本性的问题,研究人员提出了各种各样的方法来检测软件中潜在的漏洞问题。依据在检测时程序是否正在运行,漏洞检测可分为静态分析和动态分析。静态分析工具已被证明在特定的应用领域非常有效,如嵌入式系统或航空应用。然而,使用这些传统的软件技术往往非常费时费力。一些轻量级的静态分析工具可以应用到恶意代码漏洞检测中,但这些方法通常会导致某种特定的代码漏洞误报的可能性非常高。软件程序员通常使用静态分析技术并结合其他工具进行信息预处理,如利用Concolic完成漏洞分析。在之前的研究中也对Android恶意软件检测进行了静态分析,Fuzzing技术这样的动态分析方法被认为是识别大型软件漏洞的有效方法。然而,目前的分析工具仅限于检测已公开的漏洞,漏洞的普遍发现仍然基于繁琐的手工审计,这需要大量的专业知识和资源。

随着人工智能的发展,机器学习方法被广泛地应用于软件源代码漏洞检测中,并且在软件安全中扮演着重要的角色。深度学习技术为软件源代码漏洞检测领域提供了新的潜力。一方面,深度学习模型的分层结构有助于学习抽象和高度非线性的特征,能够捕捉复杂数据的内在结构;另一方面,深度学习模型允许对特征进行自动提取,具有多级抽象,并可能具有更高的通用性,从而将专家从劳动密集型且可能容易出错的特征工程任务中解放出来。此外,深度学习方法能够发现专家可能从未考虑的潜在特征,这大大扩展了特征搜索空间。通过引入记忆单元,循环神经网络(Recurrent Neural Network,RNN)具备了一定的记忆性,能够进行代码语义推理,但RNN存在梯度消失或爆炸的缺点,GRU解决了这个问题。相比于RNN,GRU具有更强大的对软件源代码特征分析进行处理的能力,仅通过学习复杂的模型和挖掘软件源代码语义的代码的高级表示,就能实现对软件源代码潜在漏洞的识别。

本文主要针对软件源代码漏洞检测误报率和漏报率高的问题,提出一种基于双向门控递归单元(Bidirectional Gated Recurrent Unit,BGRU)的软件源代码漏洞检测方法,将软件源代码漏洞视为多分类问题,不同类型的漏洞对应不同的标签。

通过采用基于Token的方法和Word2vec模型将软件源代码转换为分布式向量并输入到BGRU神经网络中,利用BGRU自动从正反两个方向生成深层次的高维特征表示,这样可以有效学习软件源代码的规律和特性,以此来降低软件源代码漏洞检测的误报率和漏报率。

1 软件源代码表征方法

本文采用基于Token的表征方法。该方法是通过对软件源代码进行词法分析得到的,即在编译过程中,创建一个自定义的C++/C#词法分析器来构建通用、简单的函数表示对软件源代码的字符流进行扫描;然后根据程序语言的词法规则,标记软件源代码的标识符、运算符、函数名和关键字等重要信息,从而将软件源代码的字符流转换为等价的Token序列;最后将Token序列按照类似于二进制的形式表征为one⁃hot向量。

2 向量转换模型

本文采用Word2vec向量转换模型,该模型是自然语言处理领域的一种单词转换为向量的表示方法,在自然语言处理领域,单词需要被向量化或数字化后才能被相关的算法或者模型进行学习或利用。Word2vec模型的连续词汇模型(Continuous Bag of Word Model,CBOW)结构如图1所示。

图1 Word2vec模型的CBOW结构

Word2vec模型是包含输入层、隐含层和输出层三层结构的神经网络。输入层中的sR是每个词的one⁃hot向量表示,向量经过输入层到隐藏层的权重矩阵计算后得到一个中间层向量,用公式表示为:

式中:为输入向量的个数;∈R与∈R为权重矩阵。输出层输出公式为:

该神经网络的优化函数为:

式中是损失函数,用于计算s,x的偏离程度。

3 GRU和BGRU原 理 结 构

GRU网络包括更新门和重置门两个门结构,更新门决定哪些重要历史信息需要被保留下来,重置门决定哪些不重要的历史信息需要被忘记。GRU具有长短期记忆功能,能够实现对长期语境等关系进行建模。GRU网络公式为:

式中:x为当前输入软件源代码向量;hh表示隐藏层的状态记忆变量;rz分别为重置门状态、更新门状态;͂表示候选集状态,y的输出状态;WWW表示可训练权重参数矩阵;表示单位矩阵;“·”表示矩阵点乘;[]表示向量连接;“×”表示矩阵乘积;表示sigmoid激活函数。

GRU基本结构如图2所示。

图2 GRU隐含层结构

sigmoid与tanh的表达式分别为:

传统GRU神经网络所存在的一点缺陷是其仅能从单一方向读取输入的软件源代码信息。然而实际情况需要充分考虑前后软件源代码的特征表示,即正反两方向的软件源代码特征均需要被考虑在内。为了克服常规GRU神经网络的局限性,本文采用BGRU神经网络分别从正、反两个不同的方向来捕获输入软件源代码向量的特征。

BGRU结构原理图如图3所示。

图3 BGRU结构原理图

在BGRU神经网络的前向层中,GRU的⇀按照正向顺序依次读取输入的向量(从到x),并计算对应于每个向量的前向隐藏层状态,即(⇀,…,⇀,…,⇀)。类似地,在BGRU神经网络的反向层中,GRU的↼按照倒序的方式依次读取输入向量(从x到),并计算对应于每个向量的反向隐藏层状态,即(↼,…,↼,…,↼)。通过参考式(7)和式(8)提供的隐藏层状态计算过程,第个输入向量的前向、反向隐藏层状态可具体表示为:

随后,将BGRU的前向、反向隐藏层状态级联在一起,构成BGRU的隐藏层状态h,即:

4 基于BGRU的软件源代码漏洞的方法

由于软件源代码无法直接输入到BGRU网络实现软件源代码的漏洞检测,所以本文首先利用基于Token的表征方法将软件源代码按顺序表征为one⁃hot形式的向量。one⁃hot形式的软件源代码表征向量具有如下弊端:

1)稀疏性强,当维度过多时,one⁃hot形式向量具有非常多的0,使得整个向量中有用的信息过少,造成计算机几乎无法计算的后果。

2)不能刻画相关软件源代码背后的语义。Word2vec算法是使用三层结构的神经网络将one⁃hot形式的软件源代码表征向量变换为分布式的表征向量,又能把相关软件源代码之间背后的语义用作模型的特征。因此,本文利用Word2vec使one⁃hot形式的向量转化为分布式向量以便深度学习网络自动挖掘和提取特征。

BGRU层:将经Word2vec输出的分布式向量作为BGRU的输入,利用BGRU神经网络来分别从正、反两个不同的方向捕获输入分布式向量的特征。

输出层:输出层的输入为BGRU层的输出h,输出通过全连接层和softmax计算输出的概率值。softmax公式为:

式中:y表示全连接层第个节点的输出值;为输出节点个数;(y)表示第个元素表示属于第个类别的概率值,1≤≤。

5 实验及分析

5.1 实验组成与步骤

图4所示为白酒质量监控系统的架构图,其包含6大功能模块。本系统是基于Microsoft的NET架构开发实现的,软件源代码是由C#语言编写的,数据库软件为MySQL⁃8.0.23。

图4 白酒质量监控系统架构图

软件源代码漏洞检测流程如图5所示。

图5 漏洞检测流程

软件源代码漏洞检测具体步骤如下:

1)本文样本来源于白酒质量监控系统软件,选取70%和30%的样本分别作为训练样本和测试样本,针对10种开放式Web应用程序安全项目(Open Web Application Security Project,OWASP)(2017年)漏洞进行检测。

表1为10种OWASP漏洞的名称以及对应的英文全称和英文缩写。

表1 10种OWASP漏洞的名称以及对应的英文全称和英文缩写

2)设置主要参数的初始值。本实验采取手动遍历的方式进行参数选取,选取的参数为:BGRU的输入向量维数为20,输入向量个数为20,学习率设为0.001,batch大小设为64。

3)将训练样本利用基于Token的方法和Word2vec神经网络转换为分布式向量后输入到模型中进行模型训练。选用交叉熵损失函数和自适应矩估计算法进行反向传播,优化权重和偏置项。损失函数表达式为:

4)当>,终止训练并保存模型;否则返回步骤3)。其中=5,表示当前输出准确率连续高于历史输出最高准确率的次数。

5)采用与步骤3)训练样本相同的处理方法将测试样本转换为分布式向量后,输入到训练好的模型中进行源代码故障检测。

5.2 实验结果与分析

本实验将测试集样本输入到训练好的模型中测试模型性能,并且将双向循环神经网络(Bidirectional Recurrent Neural Network,BRNN)、卷 积 神 经 网 络(Convolutional Neural Network,CNN)与本文所提方法进行对比。两种方法的设置参数如下:BRNN方法与BGRU方法所选参数相同,CNN采用3层卷积⁃池化网络;输入维度为20×20,三层卷积核和三层池化核尺寸大小分别设为3×3和2×2;三层卷积核的数量分别为64,128,128;卷积步长和池化步长分别设为1,其他参数与BGRU所提方法所选参数相同。本文将软件源代码漏洞视为阳性,无漏洞为阴性,误报率为无漏洞的软件源代码样本中被检测为漏洞的软件源代码样本所占的比例,漏报率为在有漏洞软件源代码样本中被检测为无漏洞软件源代码样本所占的比例。三种方法针对OWASP检测的实验结果如图6和图7所示。

图6 三种方法对于OWASP的漏洞检测误报率对比

图7 三种方法对于OWASP的漏洞检测漏报率对比

由图6和图7可知,BGRU方法对于不同类型的漏洞具有不同的漏洞检测误报率和漏洞检测漏报率,整体上能够保持较低的误报率和漏报率。对于BA、SDE和XSS,采用BRNN方法的漏洞误报率均超过15%;对于I、XSS和UKVC,采用CNN方法的误报率也均超过15%;对于XEE、BAC、SM、XSS和ID,采用BRNN方法的漏洞漏报率均在8%以上;对于BA、XEE、BAC、ID和UKVC,采用CNN方法的漏报率也均在12%以上。

由此得出,在其他两种方法检测软件源代码漏洞出现了很大的误报率或漏报率时,BGRU方法依然具有较低的漏洞检测误报率和漏报率,验证了文中方法具有非常好的检测效果。本文给出了采用BGRU方法识别XEE漏洞的截图,如图8所示,标记为黑色部分为漏洞追踪到软件源代码的位置。

图8 采用BGRU方法检测XEE漏洞所追踪到软件源代码的位置

6 结 语

针对软件源代码漏洞检测误报率和漏报率高的问题,本文提出一种BGRU深度学习方法,用于降低白酒质量监控系统软件源代码漏洞检测误报率和漏报率。本文采用基于Token的方法和Word2vec模型将软件源代码转换为分布式向量并输入到BGRU神经网络,以实现对软件源代码规律和特性的有效学习。实验结果表明:BGRU方法对于OWASP(2017年)不同类型的漏洞具有不同的漏洞检测误报率和漏报率,整体上能够保持较低的误报率和漏报率;在其他两种方法检测软件源代码漏洞出现了很大的误报率或漏报率时,BGRU方法依然具有较低的漏洞检测误报率和漏报率。综上,本文提出的BGRU检测方法能够有效降低软件源代码漏洞检测误报率和漏报率。

猜你喜欢

误报率漏报源代码
人工智能下复杂软件源代码缺陷精准校正
原始数据动态观察窗法在火灾特征信号融合提取中的应用研究
家用燃气报警器误报原因及降低误报率的方法
基于TXL的源代码插桩技术研究
钻杆管体超声波探伤误报分析及措施
软件源代码非公知性司法鉴定方法探析
各类气体报警器防误报漏报管理系统的应用
揭秘龙湖产品“源代码”
传染病漏报原因分析及对策
日本厂商在美漏报事故千余起被指管理疏漏