Page 101 - 《软件学报》2020年第11期
P. 101

段旭  等:基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法                                                3417


                                  Table 3    Amount of data in the sub-dataset composed of C programs
                                         表 3   由 C 语言程序构成的子数据集中的数据量
                                         数据集                源文件数量      坏函数数量       好函数数量
                               SARD缓冲区错误C语言源程序子集              4 264      4 242       6 669
                              SARD资源管理错误C语言源程序子集              3 116      3 033       6 550

                    同样地,本文以 6:2:2 的比例分别将子数据集划分为训练集、验证集和测试集.表 4 为 TBCNN 和本方法在
                 SARD 缓冲区错误数据集和 SARD 资源管理错误数据集中,由 C 语言源程序构成的子集的测试集上进行对比实
                 验的结果.从对比实验数据中可见,本方法在两个数据集上的表现均明显优于 TBCNN,其在两个数据集上的 F1
                 分数分别达到了 82.5%和 78.0%.
                                       Table 4    Result of comparative experiment with TBCNN
                                             表 4   与 TBCNN 进行对比实验的结果
                              数据集              工具或方法     误报率(%)    漏报率(%)   查全率(%)   查准率(%)   F1分数(%)
                                                 TBCNN     25.2      41.4     58.6     60.9     59.7
                     SARD缓冲区错误C语言源程序子集
                                                 本方法       7.06      22.3     77.7     88.1     82.5
                                                 TBCNN     3.02      55.5     44.5     87.7     59.0
                    SARD资源管理错误C语言源程序子集
                                                 本方法       12.8      19.1     80.9     75.4     78.0
                    本文针对 TBCNN 的实验进行了分析.TBCNN 使用抽象语法树对程序进行建模,但是这种方式仅考察了程
                 序中的语法结构,没有将控制流、数据流等对于漏洞密切相关的因素进行考量.此外,TBCNN 中仅将抽象语法树
                 的节点类型作为节点的特征信息,其不足以涵盖程序中细粒度的信息,导致其在面对类间差异小的分类任务时
                 表现不佳,例如对仅有细微差别的漏洞代码与非漏洞代码进行分类.
                    反观本方法,其使用代码属性图对程序进行建模,其中同时包括了程序的语法结构、控制流和数据流这 3
                 种与漏洞密切相关的信息;并且本方法利用精心设计的编码方法,在将代码属性图装换为特征张量时,极大地保
                 留了代码属性图中的信息,有利于分类器进行学习.此外,本方法中引入的注意力机制有效地捕获了特征张量中
                 的关键信息,使其在面对类间差异小的分类问题时仍具有良好的表现.
                    最后,为研究注意力机制在本方法中的作用,证明注意力机制的有效性,本文将图 1(b)中程序的特征张量输
                 入到在 SARD 缓冲区错误数据集上训练完毕的神经网络中,并获得了注意力层输出的注意力权重分布,将每个
                 节点的注意力向量取均值后得到标量并归一化,从而直观地表示该节点上的注意力,最终使用热力图对其进行
                 可视化的结果如图 8 所示,颜色越亮注意力权重越高.













                                        Fig.8    Visualization of attention weights distribution
                                                图 8   注意力权重分布可视化

                    该程序调用 memcpy 库函数对内存数据进行拷贝,如果目标地址空间不足以接收指定长度的数据,则会发
                 生缓冲区错误.该漏洞可以被攻击者利用,使得返回地址指向预先设定的恶意代码处,从而实现对恶意代码的执
                 行.该漏洞是由 memcpy 敏感库函数的调用以及长度判断语句中额外的“2”所导致的,从图 8 中可以发现,注意力
                 主要分布在 memcpy 和 malloc 等敏感库函数附近,并且在 buf、BUF_SIZE 和“2”处具有较高的注意力权重.由于
   96   97   98   99   100   101   102   103   104   105   106