毕业设计:基于图神经网络的切片级漏洞检测及解释方法

目录

前言

设计思路

一、课题背景与意义

二、算法理论原理

2.1 深度学习

2.2 Transformer 网络

2.3 迁移学习

三、检测的实现

3.1 数据集

3.2 实验环境搭建

3.3 实验及结果分析

最后


前言

       📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

        🚀对毕设有任何疑问都可以问学长哦!

         选题指导:

        最新最全计算机专业毕设选题精选推荐汇总

        大家好,这里是海浪学长毕设专题,本次分享的课题是

        🎯基于图神经网络的切片级漏洞检测及解释方法

设计思路

一、课题背景与意义

        随着软件复杂性的增加,漏洞检测成为了确保软件安全性的关键任务。传统的漏洞检测方法往往依赖于人工分析和经验判断,效率低下且容易遗漏。近年来,基于深度学习的漏洞检测方法得到了广泛关注,其中,基于图神经网络的切片级漏洞检测及解释方法成为了一个新兴的研究方向。该方法旨在通过图神经网络对代码切片进行自动化特征提取和漏洞检测,同时提供对检测结果的解释,从而帮助开发人员快速定位和修复漏洞。

二、算法理论原理

2.1 深度学习

        在选择适合的神经网络模型来更好地学习代码的上下文语义以提高软件漏洞检测性能时,研究者通常使用循环神经网络(RNN)作为代码的特征表示层。RNN解决了传统神经网络无法根据先前向量的特征来推断后续向量的问题。RNN具有循环结构,可以在网络中持续保存信息。在标准的RNN网络中,这种重复结构通常由简单的tanh函数层组成。RNN的链式结构允许模型根据先前的上下文信息来理解后续的代码语义。RNN的特点使其适合处理与文本分类任务中类似的代码上下文特征。通过学习代码的上下文语义,RNN可以更好地捕捉代码中的关键信息和语义关联,从而提高软件漏洞检测的性能。

毕业设计:基于图神经网络的切片级漏洞检测及解释方法

        LSTM的结构与RNN类似,但其内部单元与标准RNN的单元不同,LSTM具有四个网络层。LSTM的核心是细胞状态,它类似于一个传送带,贯穿整个细胞单元但很少有分支,确保信息可以在整个细胞单元中流动。LSTM网络使用一种称为门的结构来修改和控制细胞状态。门结构可以决定哪些信息可以通过,哪些信息不能通过。LSTM包含三种类型的门结构,分别为遗忘门、输入门和输出门。这些门结构由sigmoid层和点乘操作组成。

        通过遗忘门、输入门和输出门的操作,LSTM网络可以有效地控制和调节信息的流动,从而解决了长期依赖问题。LSTM的特点使其在处理自然语言处理任务中具有优势,并被广泛应用于文本生成、机器翻译、情感分析等领域。

毕业设计:基于图神经网络的切片级漏洞检测及解释方法

        LSTM和简单的RNN网络在自然语言处理领域都取得了很好的性能并得到广泛应用。然而,LSTM由于其复杂的内部结构而存在计算开销较大的缺点。考虑到软件漏洞数据库通常包含大量的数据,因此使用GRU网络也是有必要的。GRU网络的优势在于其结构相对简单(只有两个门运算结构),计算开销相对较小,适用于处理更大规模的数据集。虽然LSTM在自然语言处理中表现出了很好的性能,但由于计算开销较大,针对较大规模的软件漏洞数据库,可以考虑使用计算开销较小的GRU网络。GRU网络的简单结构使其在处理大规模数据时具有优势。

毕业设计:基于图神经网络的切片级漏洞检测及解释方法

2.2 Transformer 网络

        Encoder-Decoder是一种在NLP领域广泛使用的模型框架,常用于机器翻译、语音识别等任务。它并不特指某种具体的算法,而是指一类算法的总称。在该框架下,算法使用者可以根据具体任务选择不同的算法来解决问题。然而,在软件漏洞检测任务中,与文本翻译任务不同,更类似于文本分类任务。在软件漏洞检测任务中,我们关注的是将序列化的输入通过编码器获取特征向量,然后将特征向量输入深度学习的分类器,以获得分类结果。特征向量通常是一个较短的向量,对于二分类任务而言,可能只有0或1两个取值,因此不需要使用完整的Encoder-Decoder架构。

毕业设计:基于图神经网络的切片级漏洞检测及解释方法

        在软件漏洞检测任务中,我们可以选择使用Transformer网络的编码器作为代码上下文的特征提取层,而不需要Decoder部分。Transformer的编码器在处理序列数据时具有很好的表现,可以有效地捕捉代码的上下文语义特征。分类输出则可以使用其他分类器模型进行处理。对于软件漏洞检测任务,我们可以选择使用Transformer的编码器作为代码上下文的特征提取层,而不需要完整的Encoder-Decoder架构。这样可以有效提取代码的特征,并通过其他分类器模型进行分类输出。

毕业设计:基于图神经网络的切片级漏洞检测及解释方法

2.3 迁移学习

        为了处理新的问题和数据集,引入了迁移学习方法。迁移学习利用已有的知识和模型,在处理新任务时通过传递学习经验来提升性能。其中不同形状代表不同类型的数据,不同颜色表示来自不同分布的数据集。通过迁移学习,可以将预训练的模型应用于新的任务,从而利用已有的模型特征和表示来处理不同领域的数据。这种方法可以提高模型在新任务上的性能,减少对大量标注数据的需求,并加快模型训练过程。迁移学习为处理新问题提供了一种有效的方法,使得深度学习模型能够更好地适应不同的任务和数据集。

毕业设计:基于图神经网络的切片级漏洞检测及解释方法

        迁移学习结构,其中包含两个输入层Input_a和Input_b,分别来自不同的代码数据集。这些向量经过数据预处理编码为长度为50的向量。然后,两个输入流同时输入Transformer层,用于学习代码上下文特征。Transformer层的参数和设置与第四章中相同。输出层(Out)为全连接层,根据Input_a的值输出对应的类别,采用与第四章相同的配置,由密集层(dense)和丢弃层(dropout)堆叠而成。输出层使用分类损失函数进行训练。模型中的Distance层没有可训练的参数,其作用是计算Input_a和Input_b在向量空间中的距离。Distance层使用语义分离损失和语义对齐损失作为损失函数。

        在模型训练过程中,使用随机梯度下降和反向传播更新整个模型中的参数。分类损失函数提高了模型的分类精度,而语义分离损失和语义对齐损失使Transformer特征提取层能够使来自不同分布但属于同一类别的样本更接近,同时使来自不同分布且不属于同一类别的样本更远离。

三、检测的实现

3.1 数据集

        针对现有漏洞数据集的限制,我决定自行构建一个基于图神经网络的切片级漏洞检测数据集。首先,我从开源软件中收集真实漏洞样本,并进行规范化处理。然后,利用代码切片技术将每个漏洞样本切割成多个代码切片,以保留关键信息并减少冗余。接着,我为每个代码切片生成对应的图结构表示,其中节点表示代码中的基本块,边表示控制流关系。最后,我标注每个代码切片是否包含漏洞,并构建相应的标签集。通过这个自制的数据集,我相信能够为基于图神经网络的切片级漏洞检测及解释方法提供有力的支持,并推动该领域的发展。

        数据扩充是机器学习领域常用的一种技术,旨在增加训练样本的数量和多样性,从而提高模型的泛化能力。在基于图神经网络的切片级漏洞检测中,数据扩充同样具有重要意义。通过对原始代码切片进行旋转、翻转、缩放等变换操作,我们可以生成更多的训练样本,以丰富模型的训练数据。此外,还可以采用生成对抗网络(GAN)等高级技术来生成更加逼真的模拟数据。这些扩充后的数据将有助于提升漏洞检测模型的准确性和稳定性,为软件开发提供更加可靠的安全保障。

import numpy as np
import cv2

# 原始图像数据
img = cv2.imread('image.jpg')

# 旋转图像
rotated_img = cv2.rotate(img, angle=45)

# 翻转图像
flipped_img = cv2.flip(img, flipCode=1)  # 1 表示水平翻转

# 缩放图像
scaled_img = cv2.resize(img, dsize=(640, 480))

# 显示扩充后的数据
cv2.imshow('Original Image', img)
cv2.imshow('Rotated Image', rotated_img)
cv2.imshow('Flipped Image', flipped_img)
cv2.imshow('Scaled Image', scaled_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 实验环境搭建

        在训练深度学习模型的过程中,由于本检测模型涉及大量的矩阵运算,GPU 的使用成为了必不可少的环节。GPU 凭借其并行处理能力和高效的计算性能,可以显著加速训练速度,从而缩短模型的训练时间。通过利用 GPU 的强大计算能力,我们能够更快地进行反向传播、梯度下降等关键操作,提高训练效率,更快地获得准确的模型结果。

3.3 实验及结果分析

        SDA 方法训练深度学习模型需要两个输入流:源域数据和目标域数据。源域数据全部用于训练,目标域数据量较少且与测试数据分布相同。数据单元格式为五个向量的元组,包括源域和目标域的特征向量以及对应的类别和类别判断。损失函数包括分类损失和语义分离与对齐损失。

        实验设计方面,我们使用交叉验证训练神经网络模型,选取在软件漏洞检测任务中效果最佳的参数。针对 Transformer 中的 head 值,观察其不同取值对算法效果的影响。对于其他参数,我们设置为默认值或广泛采用的值。代码切片的向量表示的 token 数量设为 50,dropout 值为 0.5,batchsize 值为 64,epoch 设为 5,隐藏层的节点数为 300,隐藏层的个数为 4。我们在 RE 和 BF 数据集上分别进行实验,实验结果如下图所示,采用 F1 值作为度量标准。

相关代码示例:

data = pd.read_csv('software_vulnerabilities.csv')  
X = data.drop('vulnerability', axis=1)  # 特征  
y = data['vulnerability']  # 标签  
  
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 数据标准化  
scaler = StandardScaler()  
X_train = scaler.fit_transform(X_train)  
X_test = scaler.transform(X_test)  

pretrained_model = load_model('pretrained_model.h5')  
  
# 假设我们使用预训练模型的最后一层作为特征提取器  
pretrained_features = pretrained_model.predict(X_train)  
  
# 使用这些特征训练一个新的分类器  
input_layer = Input(shape=(pretrained_features.shape[1],))  
dense_layer = Dense(64, activation='relu')(input_layer)  
output_layer = Dense(1, activation='sigmoid')(dense_layer)  
  
model = Model(inputs=input_layer, outputs=output_layer)  
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])  
  
model.fit(pretrained_features, y_train, epochs=10, batch_size=32, validation_data=(pretrained_features, y_test))  
  
# 对测试集进行预测  
predictions = model.predict(pretrained_model.predict(X_test))  
  
# 将预测结果转换为二进制形式  
predictions = (predictions > 0.5).astype(int)  
  
# 计算准确率  
accuracy = np.mean(predictions == y_test)  
print(f'Accuracy: {accuracy * 100:.2f}%')

实现效果图样例:

创作不易,欢迎点赞、关注、收藏。

毕设帮助,疑难解答,欢迎打扰!

最后

  • 31
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值