LineVul: 基于Transformer的行号级漏洞预测

2024-04-18 08:36

本文主要是介绍LineVul: 基于Transformer的行号级漏洞预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文中提出一种基于Transformer的行号级漏洞预测方法 LineVul,以解决最先进的 IVDetect 方法的若干局限性。该方法通过对包含 188k+ C/C++ 函数的大规模真实数据集进行实证评估,LineVul 实现了:(1)函数级预测的 F1-measure 提升160%-379%;(2)行号级预测的 Top-10 Accuracy 提升12%-25%;以及(3)E ffort@20%Recall 比基准方法低29%-53%。附加分析还表明,LineVul 在预测前 25 个最危险的 CWE 所影响的易受攻击函数也非常准确(75%-100%)。

1 问题描述

最近提出的一种基于图的粒度漏洞预测方法,IVDetect,存在以下局限性:

  1. IVDetect 的训练过程仅限于项目特定的数据集。
  2. IVDetect 方法中基于 RNN 的架构仍无法有效捕捉源代码中长期有意义的依赖关系和语义。
  3. IVDetect 的子图解释仍然是粗粒度的。

2 解决方案

文章贡献如下:

  1. LineVul 是一种基于Transformer的行号级漏洞预测方法,解决了现有漏洞预测方法的各种局限性。
  2. 验结果表明,与现有漏洞预测方法相比,LineVul 更准确、更经济、更有效。

在图 1 中,易受攻击的函数 unPremulSkImageToPremul 包含了一行易受攻击的行(即第九行),其中变量类型被错误地定义,并进一步导致了 CWE-787 漏洞类型。IVDetect 生成了 PDG 子图,指出第 5 行、第7 行、第 8 行和第 9 行为易受攻击模式。另一方面,LineVul 直接指出了实际的易受攻击行。

图1 研究动机

3 方法设计

LineVul 方法分为两个阶段:预测漏洞函数和定位漏洞代码行,图2为LineVul的大致架构。

图2 LineVul整体架构图

3.1 函数级漏洞预测

BPE子词标记化。BPE 会将所有单词分割成字符序列,并找出最常出现的符号对(例如,两个连续字符对),将其合并为一个新符号。BPE 是一种将稀有词拆分成有意义的子词,同时保留常用词(即不将常用词拆分成更小的子词)的算法。比如函数名 "unPremulSKImageToPremul" 将被拆分为一串子词 ["un", "Prem", "ul", "Sk", "Image", "To", "Prem", "ul"]。常见的单词 "Image" 被保留,其它罕见的词被拆分。在对各种函数名进行标记化时,使用 BPE 子词标记化将有助于减少词汇量大小,因为它会将罕见的函数名分割成多个子组件,而不是直接将完整的函数名添加到字典中。文中在 CodeSearchNet 语料库中应用了 BPE 方法,以生成一个适用于源代码语料库预训练语言模型的子词标记化器。

LineVul模型构建。基于BERT架构并利用CodeBERT的初始权重建立了 LineVul 模型:(1)LineVul 对子词标记的函数进行词和位置编码,以生成每个词的嵌入向量及其在函数中的位置。(2)然后,将该向量输入 BERT 架构,该架构由 12 个 Transformer 编码器模块堆叠而成,每个编码器由多头自注意层和全连接前馈神经网络组成。(3)最后,输出的向量被送入一个线性层,以便对给定函数进行二元分类。

(1)词和位置编码。步骤的目的是生成编码向量,这些编码向量捕获token的语义及其在输入序列中的位置。为此,对于每个子词标记化的标记,生成两个向量:(1)单词编码向量,表示给定代码标记与其他代码标记之间的有意义关系;(2)位置编码向量,表示给定标记在输入序列中的位置。记号编码向量根据词嵌入矩阵Wte|V|xd生成,其中|V|为词汇表大小,d为嵌入大小。位置编码向量根据位置嵌入矩阵Wpecxd生成,其中c为上下文大小,d为嵌入大小。最后,将单词编码向量和位置编码向量连接起来,得到Transformer 编码器块的输入向量。

(2)具有双向自注意力机制的12个 Transformer 编码器。在这一步中,编码后的向量被送入一个由12个仅含编码器的 Transformer 模块组成的堆栈中(即BERT架构)。每个编码器块由两个组件组成,即双向多头自注意力层和全连接前馈神经网络。

(3)单个线性层。在堆叠 Transformer 编码器模块中建立了多个具有非线性激活函数(即 ReLU)的线性变换,因此最终编码器输出的表示是有意义的。只需要一个线性层来将代码表示映射成二进制标签,即 y = WTX + b。

3.2 行级漏洞定位

给定一个被 LineVul 预测为易受攻击的函数,利用 Transformer 架构内的自注意力机制来定位易受攻击的代码行,从而执行号级的漏洞定位。对预测贡献最大的令牌(token)很可能就是易受攻击的令牌,对于函数中的每个子词令牌,总结 12 个 Transformer 编码器块中其对应的自注意力得分。在获得关注的子词令牌分数后,将这些分数整合为行分数。通过换行控制字符(即 \n)将整个函数拆分成许多令牌列表(每个令牌列表代表一行代码)。最后,对于每个令牌得分列表,将其汇总为一个关注行得分,并按降序排列这些行得分,得分最高的行为易受攻击的代码行。

4 实验设计

文中实验旨在回答以下3个研究问题:

  1. LineVul 的函数级漏洞预测的准确性如何?
  2. LineVul 的行号级漏洞定位的准确率怎样?
  3. 对于行级漏洞定位,LineVul的成本效益是什么?

实验结果分别如下图所示。

(RQ1)图3 LineVul和7个基线关于函数级漏洞预测实验对比的结果

(RQ2)图4 文中自注意力方法和其他五种方法的前10准确率和IFA值得对比

Top-10 Accuracy:在前十名排名中出现至少一个实际易受攻击代码行的易受攻击功能的百分比。

Initial False Alarm(IFA):安全分析人员需要检查的错误预测行(即,错误地预测为易受攻击或错误警报的非易受攻击行)的数量,直到找到给定函数的第一个实际易受攻击行。IFA被计算为安全分析师在发现第一个实际易受攻击的线路之前必须检查的假警报的总数。IFA值越低,说明安全分析人员在检查虚警上花费的精力越少。

(RQ3)图5 自注意力方法和其它五种方法的Effort@20%Recall,Recall@1%LOC值对比结果

表1 LineVul的每个组件对函数级漏洞预测的贡献

表2 LineVul对前25个最危险的CWEs检测的准确性

5 总结

文中提出了一种基于Transformer的漏洞预测方法LineVul,用于预测哪些函数以及哪些代码行存在漏洞。通过对一个包含 188k+ C/C++ 函数的大规模真实数据集进行实证评估,LineVul 在函数级预测上F1-measure 提升了160%-379%;在行号级预测上 Top-10 Accuracy 提升12%-25%;且Effort@20%Recall比最先进的方法低29%-53%。该研究结果表明,LineVul 比现有的漏洞预测方法更准确、更精细。

6 原文链接

论文题目:LineVul: A Transformer-based Line-Level Vulnerability Prediction

论文出处:2022 IEEE/ACM 19th International Conference on Mining Software Repositories (MSR)

原文链接:LineVul: A Transformer-based Line-Level Vulnerability Prediction | IEEE Conference Publication | IEEE Xplore

项目地址:GitHub - awsm-research/LineVul: A Transformer-based Line-Level Vulnerability Prediction

这篇关于LineVul: 基于Transformer的行号级漏洞预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914277

相关文章

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

Java反序列化漏洞-TemplatesImpl利用链分析

文章目录 一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1)getTransletInstance2)defineTransletClasses 2.3 创建实例 3. 完整POC 三、参考文章 一、前言 java.lang.ClassLoader#defineClass defineClass可以加载字节码,但由于defineClas

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重

Transformer从零详细解读

Transformer从零详细解读 一、从全局角度概况Transformer ​ 我们把TRM想象为一个黑盒,我们的任务是一个翻译任务,那么我们的输入是中文的“我爱你”,输入经过TRM得到的结果为英文的“I LOVE YOU” ​ 接下来我们对TRM进行细化,我们将TRM分为两个部分,分别为Encoders(编码器)和Decoders(解码器) ​ 在此基础上我们再进一步细化TRM的

【vulhub】thinkphp5 2-rce 5.0.23-rce 5-rce 漏洞复现

2-rec 1.启动环境  cd /.../vulhub/thinkphp/2-rce # cd进入2-rce靶场文件环境下docker-compose up -d # docker-compose启动靶场docker ps -a # 查看开启的靶场信息 2.访问192.168.146.136:8080网页 3.构造payload http

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

LLM模型:代码讲解Transformer运行原理

视频讲解、获取源码:LLM模型:代码讲解Transformer运行原理(1)_哔哩哔哩_bilibili 1 训练保存模型文件 2 模型推理 3 推理代码 import torchimport tiktokenfrom wutenglan_model import WutenglanModelimport pyttsx3# 设置设备为CUDA(如果可用),否则使用CPU#

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积

逐行讲解Transformer的代码实现和原理讲解:计算交叉熵损失

LLM模型:Transformer代码实现和原理讲解:前馈神经网络_哔哩哔哩_bilibili 1 计算交叉熵目的 计算 loss = F.cross_entropy(input=linear_predictions_reshaped, target=targets_reshaped) 的目的是为了评估模型预测结果与实际标签之间的差距,并提供一个量化指标,用于指导模型的训练过程。具体来说,交叉