Page 319 - 《软件学报》2021年第7期
P. 319
张献 等:基于代码自然性的切片粒度缺陷预测方法 2237
LSTM 网络分析切片后的代码 token 序列,然后利用神经网络自动生成的语义特征进行分类器学习和对新模块
的缺陷检测,因此,该方法具有专家经验依赖少的优点,但同时也造成了模型和语义特征的可解释差等问题.与
VulDeePecker 相比,本文的 CNDePor 方法在两类缺陷数据集上得到了相近结果,其中,在 BE-ALL 上,本文方法
的漏报率、查全率较对比方法均改善 6.8%.同时,CNDePor 方法以语言模型和 CE 类度量元为基础,因此相比基
于端到端深度学习的“黑箱”检测方法来说,具有更好的可解释性.下面通过实例分析给出进一步解释.图 7 展示
了两类安全缺陷的两个切片样本及语言模型度量的 CE 类特征值,其中,第 1 个实例来自 NVD 库 QEMU2.3.0 开
源软件的 esp.c 文件,其具有缓冲区溢出风险;第 2 个样本来自 SARD 库,具有资源管理缺陷.经过缺陷修复后,各
自得到下方的安全版本,其中,代码标红处为修复前后切片间差异.
Fig.7 Slice samples and its CE scores
图 7 切片样本及其 CE 值
由图 7 可以看出,样本 1 的 get_cmd()函数内部调用了库函数 memcpy()用于内存拷贝.但该函数并不安全,
没有自主越界检查功能,因此存在缓冲区溢出风险,易被恶意程序利用与攻击或造成进程崩溃.经漏洞修补后,
get_cmd()内部增加了数据长度的越界检查,同时增设了相应形参,确保了内存的安全拷贝.可以看到,本文的
CNDePor 方法度量该缺陷样本获得的 M-CE 和 M-CE-Inv 指标值分别为 1.205 76 和 1.330 25,而修复后样本的
指标值下降至 0.359 50 和 0.478 62,自然性提高显著,利于分类器识别.样本 2 中,原局部变量 dataBuffer 定义在
栈中,其由系统自动分配和释放空间.而原代码错误地将该栈区变量释放,造成了潜在隐患(如系统崩溃).为此,将
dataBuffer 改为堆区声明,避免了相应错误.类似地,该样本修复前获得的 M-CE 和 M-CE-Inv 值分别为 3.002 48
和 3.295 40,而修复后指标值下降至 0.600 99 和 0.676 19,自然性得到显著提高,有利于预测模型判断.由上述实
例分析可知,本文提出的 W-NLM 可以通过语料库学习来捕获语言序列的发生规律,进而可以衡量待测软件模
块的自然性并完成缺陷倾向性预测.
在对比基于代码自然性的方法方面,本文选取了我们已发表的工作 DefectLearner.该方法将 NLM 度量的代
码 CE 度量元引入到缺陷预测中,以增强分类器的预测性能.但是,由于 NLM仅单向学习语料库,致使模型对软件
模块自然性的度量没有本文方法全面.其次,就缺陷预测任务而言,NLM 的训练是无监督的,它们未利用模块的
缺陷信息,致使生成的 CE 度量元的缺陷判别力有限.从数据对比来看,本文的 CNDePor 方法性能整体上优势明
显,其中,在 BE-ALL 数据集上的查准率、查全率和 F1 指标分别提升 12.0%、25.3%和 18.6%.