AMPLE: 基于图简化和增强图表征学习的漏洞检测

GNN已被证实能有效学习源代码的图表示,然而GNN难以处理代码结构图中长距离节点之间连接的局限性,导致无法捕获代码图的全局信息(即远距离节点间的依赖关系)。针对上述问题,提出漏洞检测框架AMPLE,它包括图简化(缩小代码结构图的节点大小来减少节点之间的距离)和增强图表征学习(捕捉远处图节点之间的关系)两个部分。在三个公共基准数据集上的实验表明,AMPLE 的准确率和 F1 分数指标分别比最先进的方法高出 0.39%-35.32% 和 7.64%-199.81% ,证明了 AMPLE 在学习代码图的全局信息以进行漏洞检测方面的有效性。

1 问题描述

GNN 模型在处理非直接相邻节点之间的长距离连接时存在局限性。虽然可以使用多层堆叠的 GNN 来学习图的全局信息(即节点间的长距离依赖关系),但深度 GNN 产生的过度平滑问题会导致具有不同标签的节点出现相似的嵌入,从而降低漏洞检测性能。现有的 GNN 模型(如 GGNN、GCN)无法充分模拟图中的边特征。

2 解决方案

提出了一种新型漏洞检测框架 AMPLE,它具有图形简化和增强型图形重现学习功能。AMPLE 包括两大部分:1)图形简化,通过缩小代码结构图的大小来减少节点之间的距离。2) 增强图形表示学习,包括两个模块。边缘感知图神经网络模块考虑边缘类型信息,并将异构边缘信息融合到节点表示中;而核缩放表示模块则扩大卷积核大小,以明确捕捉远距离图节点之间的关系。

3 框架设计

AMPLE由两个部分组成:图简化模块、增强图表征学习。

3.1 图简化

1)基于类型的图简化:类型合并规则如表 1 所示,PType表示父节点类型,CType表示子节点类型。合并规则1,2,3,4,5-7分别对应 C/C++ 编程语言中不同类型的语句,包括表达式语句、标识符声明语句、条件语句、for-loop 语句和函数调用语句。对于每一对与合并规则相匹配的相邻节点,其子节点将被删除,因为其信息是对父节点的细化,也可以反映在其后续节点中。

表 1 类型合并规则表

如图 1 所示,红色虚线边框的节点根据规则 2 与父节点合并。具体来说,子节点 " * first = malloc(10) "中的信息也被父节点及其三个子节点所覆盖。

图 1 基于节点类型的图简化

2)基于变量的图简化:在代码结构图中将具有重复变量的节点合并为一个节点,仅适用于AST的叶节点,因为叶节点不具有子节点,将它们合并不会改变父子层次结构。合并后的变量节点有多个父节点,因此可以同时聚合来自不同语句的信息,可以增强节点表示,促进全局图表征学习。图 2 展示了一个基于变量的图简化实例。变量 "str "同时出现在 "char str[15]; "和 "scanf("%s",str); "的子节点中,因此合并了这两个 "str "叶节点。

图 2 基于变量的图简化

图简化算法如算法1所示:整个图形简化(GS)过程如算法 1 所示,其中类型图简化(TGS)和变量图简化(VGS)分别对应第 2-19 行和第 20-25 行。该算法以原始代码结构图为输入,根据 TGS 和 VGS 输出简化后的代码结构图。对于 TGS,算法对 AST 执行广度优先遍历,每次遇到一对符合表 1 中合并规则的相邻节点(u、v)时(第 10 行),都会执行以下操作(第 11-12 行):删除 v 和与 v 相连的边,然后在 u 和 v 的所有子节点之间添加新边。对于 VGS,该算法首先获取所有包含相同变量的组,然后将包含相同变量的节点合并为一个节点。最终简化后的代码结构图被输入到 AMPLE 的后续部分。

算法 1 图简化算法

3.2 增强图表征学习

图 3 AMPLE检测架构

图 3(B)为增强图表征学习模块,该模块主要进行图节点嵌入以及下游分类任务,由边缘感知图卷积网络模块和核缩放表征模块两部分组成。

1)边缘感知图卷积网络模块(Edge-aware GCN module,EA-GCN)简化后的代码结构图有3种类型的边,分别为进入边(in),出去边(out)和自循环边(self-loop),这些边也即代码结构图中的 CFG Edge、NCS Edge,DFG Edge 或 AST Edge。EA-GCN 模块首先通过对三种不同类型的边分别进行加权(不同类型的边对于节点的重要程度不同,这里的边缘感知(EA)可以理解为在图结构中嵌入了 3 种分别表示不同语法和语义信息的边(Edge),利于每个节点聚合邻近节点更多以及更强的语义信息),然后聚合邻近节点来计算目标节点向量(实际上就是对与目标节点相邻的节点嵌入表示),在图中的每个节点重复执行此操作,得到所有的节点向量,最后根据多头注意力增强重要节点的表示,得到边增强的节点表征向量矩阵。

2)核缩放表征模块:该模块旨在通过明确捕捉远处节点之间的关系来学习图的全局信息。在得到边增强的节点表征向量矩阵后,在核缩放表征模块中设计两个不同尺寸的卷积核,一个大核,和一个小核。大核用于捕获边缘/远处节点特征,小核侧重于邻近/邻居节点特征的获取,通过上述操作,从而捕获代码结构图的全局信息。

4 实验分析

4.1 数据集

AMPLE 在研究中采用了三个漏洞数据集,包括 FFMPeg+Qemu、Reveal和 Fan et al。实验数据集的统计数据如表 2 所示。Devign 提供的 FFMPeg+Qemu 数据集是人工标注的,来自两个开源 C 项目,它包含约 1 万个易受攻击实例和 1.2 万个非易受攻击实例。Reveal 数据集收集自两个开源项目:Linux Debian 内核和 Chromium。该数据集包含约 2k 个易受攻击实例和 20k 个非易受攻击实例。Fan 等人从 300 多个开源 C/C++ GitHub 项目中收集了数据,涵盖了 2002 年至 2019 年通用漏洞与暴露(CVE)数据库中的 91 种不同漏洞类型,该数据集包含约 1 万个易受攻击实例和 17.7 万个非易受攻击实例。

表 2 数据集

4.2 结果分析

文中采用以下 4 个指标:Precision、Recall、F1 score、和Accuracy来衡量实验结果。

AMPLE根据下列4个问题来展开实验:

  • 问题 1:AMPLE 在漏洞检测方面的效果如何?
  • 问题 2:图形简化是否提高 AMPLE 的性能?
  • 问题 3:增强图形表征学习是否提高 AMPLE 的性能?
  • 问题 4:超参数对 AMPLE 性能有何影响?

针对问题 1,如表 3 所示,就准确率和 F1 分数而言,AMPLE 优于所有基准方法。特别是,在三个数据集上,AMPLE 的 F1 分数比最佳基准方法分别提高了 7.63%、16.48% 和 40.40%。

表 3 与基线和SOTA方法对比实验结果

针对问题 2,如表 4 所示,可以观察到图简化对 AMPLE 的性能有显著贡献,在三个数据集上的 F1 分数分别提高了 12.56%、14.20% 和 34.86%。节点、边和距离的平均简化率分别为 41.64%、16.79% 和 41.65%。

表 4 图简化前和简化后的实验结果对比

针对问题 3,如表 5 和表 6 所示,增强图表征学习模块可以有效提高 AMPLE 性能。在 FFMPeg+Qemu、Reveal 和 Fan 等数据集的测试中,EA-GCN 模块分别提高了 4.46%、30.08% 和 48.66% 的 F1 分数,而 KSR 模块则分别提高了 13.13%、57.53% 和 27.93%。

表 5 EA-GCN 模块核 KSR 模块对 AMPLE 性能的影响

表 6 EA-GCN 与其它 GNN 模型的实验结果对比

针对问题 4,如表 7 所示,不同的超参数设置会影响 AMPLE 在漏洞检测中的性能。

表 7 超参数对 AMPLE 性能的影响

5 总结

文中提出了一种新颖的漏洞检测框架 AMPLE,它具有图简化和增强图表征学习功能。AMPLE 可以缩小代码结构图的节点数量,从而减少节点之间的距离。同时结合边缘类型来增强局部节点的表示,以应对节点表示中更多的异构关系。通过捕捉远处图节点之间的关系来获取图的全局信息。与最先进的基于深度学习的方法相比,AMPLE 在所有数据集上的漏洞检测性能都有显著提高,F1 分数提高了 7.64%-199.81%。

6 原文链接

论文题目:Vulnerability Detection with Graph Simplification and Enhanced Graph Representation Learning

论文出处:2023 IEEE/ACM 45th International Conference on Software Engineering (ICSE 2023)

原文链接:[2302.04675] Vulnerability Detection with Graph Simplification and Enhanced Graph Representation Learning (arxiv.org)

项目地址:https://github.com/AMPLE001/AMPLE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/312529.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习引领金融革命:重塑金融服务领域新格局,开启智能化新篇章

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

我们一起看看《看漫画学C++》中如何介绍的字符串的用法

C中的字符串使用的是 std::string 类型,它是C标准库中提供的字符串类,提供了丰富的字符串操作方法。下面是关于C字符串的一些常用用法: 字符串拼接 字符串查找 字符串追加 购书地址:https://item.jd.com/14418856.html

【教程】一个比较良心的C++代码混淆器

这是一个比较良心的C代码混淆器,用于信息竞赛训练和保护代码免受抄袭。本文将介绍这个混淆器的使用方法、混淆效果和已知的一些bug。同时,我们也会给出一些示例来演示混淆器的具体操作。 引言 在信息竞赛训练和实际开发中,保护代码的安全性和…

Docker 学习笔记(十):Centos7 中 Docker 部署 Redis 集群,打包 SpringBoot 微服务

一、前言 记录时间 [2024-4-17] 系列文章简摘: Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备 Docker 学习笔记(七)&#x…

关于外网后端服务访问内网minio中间件,因连接minio超时,启动失败问题

注:服务器情况:2台服务器,内网服务器包含(activemq、minio、nginx、redis、mysql、后端java服务)。外网服务器只有后端java服务,访问内网的中间件(内网服务器开放了部分指定端口) 问…

web安全学习笔记(9)

记一下第十三课的内容。 准备工作:在根目录下创建template目录,将login.html放入其中,在该目录下新建一个reg.html。在根目录下创建一个function.php 一、函数声明与传参 PHP中的函数定义和其他语言基本上是相同的。我们编辑function.php …

【C++】哈希

1. unordered系列关联式容器 STL提供了底层为红黑树结构的一系列关联式容 这里介绍 unordered_set 和 unordered_map a. unordered_map unordered_map 是存储<key, value>键值对的关联式容器&#xff0c;其允许通过 key 快速的索引到与 其对应的 value unordered_m…

nested exception is dm.jdbc.driver.DMException: 字符串截断

nested exception is dm.jdbc.driver.DMException: 字符串截断 背景问题分析问题解决 背景 今天在日常工作中遇到了一个问题&#xff0c;正常的 insert into操作报错了 ### Cause: dm.jdbc.driver.DMException: 字符串截断 ; 字符串截断; nested exception is dm.jdbc.driver…

element-ui container 组件源码分享

今日简单分享 container 组件的源码实现&#xff0c;从以下两个方面来讲解&#xff1a; 1、container 组件的页面结构 2、container 组件的属性 一、container 组件的页面结构 二、container 组件的属性 1、container 部分的 direction 属性&#xff0c;子元素的排列方向&am…

Redis(哨兵模式)

什么是哨兵机制 问题: redis 主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工进行主从切换, 同时大量客户端需要被通知切换到新的主节点上, 对于有一定规模的应用来说, 对于人力的资源消耗会很大.解决: 通过哨兵对主从结构进行监控, 一旦出现主节点挂了的情况, 自动…

利用CSS延迟动画,打造令人惊艳的复杂动画效果!

动画在前端开发中是经常遇到的场景之一&#xff0c;加入动画后页面可以极大的提升用户体验。 绝大多数简单的动画场景可以直接通过CSS实现&#xff0c;对于一些特殊场景的动画可能会使用到JS计算实现&#xff0c;通过本文的学习&#xff0c;可以让你在一些看似需要使用JS实现的…

网络编程(现在不重要)

目录 网络编程三要素与InetAddress类的使用 软件架构 面临的主要问题 网络编程三要素&#xff08;对应三个问题&#xff09; InetAddress的使用 TCP与UDP协议剖析与TCP编程案例&#xff08;了解&#xff09; TCP协议 UDP协议 例子 UDP、URL网络编程 URL&#xff1a;&…

求奖金(if)(C语言)

一、N-S流程图&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int I 0;float bonus 0;//提示用户&#xff1b;printf("请输入利润I&#xff1a;");//获取用户值&#xf…

【优选算法专栏】专题十三:队列+宽搜(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

【Linux系统编程】第四弹---基本指令(二)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、echo指令 2、cat指令 3、more指令 4、less指令 4、head指令 5、tail指令 6、时间相关的指令 7、cal指令 8、find指…

包装类的认识

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

如何鉴别品深茶叶的真伪?

鉴别品深茶叶的真伪可以通过以下三点进行判断&#xff1a;第一是看&#xff0c;观察茶叶的颜色和形状是否自然&#xff1b;第二是闻&#xff0c;感受茶叶的香气是否纯净&#xff1b;第三是泡&#xff0c;品尝茶汤的味道是否醇厚。最好的方式还是通过官方访问进行查询&#xff0…

简单的网站-表白墙(前后端交互)

提交信息后&#xff0c;就得到了下面的一行话 但是存在一些问题 在一个网站中&#xff0c;服务器起到的最主要的效果&#xff0c;就是 “存储数据” 因此服务器这边往往也就需要能够提供两种风格的接口。存数据 、取数据 二、实现前后端交互 1&#xff09;先规定此处请求和响…

2024最新面试跳槽,软件测试面试题的整理与解析

今天接着来说说测试工程师面试比较高频的面试题&#xff0c;大家可以通过面试题内的一些解析再结合自己的真实工作经验来进行答题思路的提取、整理。 硬背答案虽可&#xff0c;但容易翻车哦。能够举一反三才是重点&#xff01; 1&#xff1a;请介绍一下UI自动化测试中三种时间等…

ESP32 S3音频开发

1. 音频硬件框架 Codec&#xff1a;音频编解码芯片&#xff0c;一种低功耗单声道音频编解码器&#xff0c;包含单通道 ADC、单通道 DAC、低噪声前置放大器、耳机驱动器、数字音效、模拟混音和增益功能。它通过 I2S 和 I2C 总线与 ESP32-S3-WROOM-1 模组连接&#xff0c;以提供独…