Page 214 - 《软件学报》2025年第7期
P. 214
邱少健 等: 基于函数间结构特征关联的软件漏洞检测方法 3135
attention network is utilized to further extract the correlation information between functions, thus improving the performance of
vulnerability detection. Experimental results show that CSFF-VD surpasses the current deep learning-based vulnerability detection methods
on three public vulnerability detection datasets. In addition, based on the extraction of independent features within the function, this study
proves the effectiveness of integrating the correlation information between functions by adding experiments on the inter-function correlation
feature extraction method in CSFF-VD.
Key words: vulnerability detection; code structural feature; correlation of function; graph attention network
随着软件规模和复杂度的不断增加, 软件中出现漏洞的概率也在增大 [1−3] . 软件漏洞是指软件程序或系统中的
缺陷或弱点, 攻击者可以利用这些漏洞窃取数据或对系统和用户造成损害. 软件的漏洞通常源于软件架构设计不
当、代码缺陷、执行错误和软件供应链问题等多种原因 [4] . 通过分析软件源代码进行漏洞检测和预警, 可以帮助
开发者提升软件的安全性和可靠性 [5−7] .
传统的软件漏洞检测方法主要依赖于专家制定的规则, 通过检测代码是否匹配这些规则以判断软件是否存在
漏洞 [8−10] . 然而, 传统基于规则匹配的方法容易产生漏洞的误报和漏报, 且预定义的规则难以及时适配新出现的漏
洞类型. 近年来, 随着人工智能的兴起, 学者们开始利用深度学习技术从代码样本中提取漏洞特征, 并基于这些特
征对软件源代码进行检测, 在一定程度上提升了漏洞检测技术的性能. 目前, 基于深度学习的漏洞检测方法可根据
不同的代码表示输入, 分为基于代码文本表示的漏洞检测方法和基于代码图结构表示的漏洞检测方法 [11] . 前者将
代码视作文本序列, 使用深度学习模型从代码文本中提取语义特征, 并以此构建漏洞检测模型. 后者则将代码转换
为抽象语法树、数据流图和控制流图等表示形式, 后采用图神经网络从多样的代码表示中提取代码结构特征, 并
以此构建漏洞检测模型.
然而, 上述基于深度学习的漏洞检测方法主要关注于代码实例本身的特征, 忽略了不同代码实例之间潜在的
结构相似性关联. 以两个函数检测为例, 如图 1(a) 所示, main_1 函数中存在 CWE-120 漏洞 (buffer copy without
checking size of input), 即在第 8 行处未对用户传入的“clienthp->h_name”进行边界检查, 且在第 10 行服务器处理
客户端请求时, 未使用安全的字符串拷贝, 导致“clienthp->h_name”的长度超过“hostname”的容量时会出现缓冲区
溢出的漏洞, 该漏洞可能被攻击者用于执行任意代码. 在图 1(b) 中的 main_2 函数中, 第 12 行代码在未对用户输
入信息进行输入验证就使用 sprintf 读取外部输入, 若客户端发送恶意的特制输入, 此处可被用于执行任意代码, 引
发 CWE-134 漏洞 (use of externally-controlled format string). 上述两个函数的漏洞触发方式虽然不同但代码结构模
式相似, 且其都未对用户输入进行充分的过滤和验证. 这种函数间结构近似的关联信息在现有研究中没有得到的
充分利用, 漏洞检测模型的性能仍有提升空间.
1 int main_1(){ 1 int main_2(){
2 ... 2 ...
3 struct hostname *clienthp; 3 std::cout << “Server Listening on port “ << port << std::endl;
4 char hostname[MAX_LEN]; int count = 0; 4 for (int i = 0; i < MAX_CONNECTIONS; i++){
5 for (count = 0; count < MAX_CONNECTIONS; count++){ 5 int newSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen;
6 int clientlen = sizeof(struct sockaddr_in); 6 if (newSocket >= 0){
7 int clientsocket = accept(serversocket, (struct sockaddr *)&clientaddr, &clientlen); 7
8 if (clientsocket >= 0){ 8 memset(clientMessage, 0, MAX_LEN);
9 clienthp = gethostbyaddr((char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), 9 read(newSocket, clientMessage, MAX_LEN);
AF_INET);
10
10 strcpy(hostname, clienthp->h_name);
11 logOutput(“Accepted client connection from host “, hostname); 11 char buffer[MAX_LEN];
12 12 sprint(buffer, “Received message from %s: %s”, inet_ntoa(clientAddr.sin_addr), clientMessage;
13 ... 13 std::cout << buffer << std::endl;
14 close(clientsocket); 14 ...
15 } 15 }
16 } 16 }
(a) CWE-120 漏洞样例 (b) CWE-134 漏洞样例
图 1 函数间的结构特征关联
针对上述问题, 本文面向软件的函数漏洞检测粒度, 提出了一种基于函数间结构特征关联的漏洞检测方法
(vulnerability detection method based on correlation of structural features between functions, CSFF-VD), 在提取代码函
数内独立结构特征的基础上, 构建并挖掘函数间的结构相似关联信息, 从而提升漏洞检测性能. 具体地, CSFF-VD
首先构建函数的代码属性图表示, 将其输入到残差门控图神经网络 [12] 中进行函数内独立结构特征提取. 然后, 在
各函数以独立结构特征向量表示的基础上, 使用欧氏距离计算函数独立结构特征间的相似度以构建函数节点间的
有向边, 从而建立函数间结构关联. 最后, 采用能够减少关联噪声的注意力图神经网络提取函数间关联特征, 并利

