Motivation:

  内存相关漏洞会导致性能下降和程序崩溃,严重威胁到现代软件的安全性。

  静态分析方法使用一些预定义的漏洞规则或模式来搜索不正确的内存操作,然而,定义良好的漏洞规则或模式高度依赖于专家知识,因此很难涵盖所有情况。并且大规模软件的复杂编程逻辑使得手工提取规则的难度大大提升。所以静态分析方法很难应用。

  基于深度学习(DL)的方法可以自动地从先前的易受攻击代码中提取隐含的漏洞模式,而不需要专家的参与,但现有的的DL-based方法也存在着流信息利用不足和粒度粗的局限。

Challenge:

  • 流信息利用不足
  1. 缺乏过程间分析:现有方法以函数级漏洞代码为输入,忽略了函数间的调用关系,对特征提取进行过程中分析。然而实际的程序中,调用用户定义的函数来实现内存分配或释放的操作是普遍存在的。 缺少过程间分析可能导致语义建模不完整,导致查全率和查准率较低;
  2. 模型训练中部分流信息丢失:BILSTM、GGNN和GCN等模型处理多重关系的能力的限制,在模型训练过程中会丢失部分流信息。
  • 粒度粗:

  现有方法检测粒度多在代码级或程序切片级,开发人员仍然需要花费大量时间手工缩小可疑语句(或操作)的范围。由于各种漏洞之间的巨大差异,现有的基于DL的通用漏洞检测方法必须牺牲特定漏洞特有的语义特征,以保证训练的模型能够覆盖大多数漏洞的通用特征。( 与其他漏洞相比,内存相关漏洞通常只需一行或几行代码即可修复,这使得细粒度检测成为可能。)

Contribution:

  • 提出了一种新的流敏感图神经网络(FS-GNN,联合嵌入语句和流信息,从漏洞代码中捕获程序语义)来支持内存相关漏洞的有效检测;

(为了获取更全面和精确的程序语义,MVD将程序依赖图(PDG)和调用图(CG)相结合,以获取过程间的控制和数据流信息。通过使用CG扩展PDG并添加额外的语义信息(包括函数之间的调用关系和返回值)来进行过程间分析。代码段和关系(即边)被嵌入到紧凑的低维表示中,以保留非结构化(即源代码)和结构化(即控制流和数据流)信息。)

  • 将漏洞检测形式化为细粒度的节点分类问题,以识别可疑的漏洞语句;

(将易受攻击语句的检测形式化为一个节点分类问题)

  • 验证。

Methodology:

                MVD分为两个阶段,训练阶段和检测阶段。

  训练阶段分为三步:

1. 基于数据流和控制流建立程序依赖图(PDG);

  为了获取全面而精确的程序语义,MVD扩展了PDG,增加了诸如调用关系和从调用图(CG)中获得的返回值之类的语义信息,以进行过程间分析;为了减少无关语义噪声,MVD从感兴趣的程序点进行节目切片。

2. 用DOC2VEC将每个切片的语句转换为低维向量表示;

3. 使用流敏感图神经网络(FS-GNN)联合嵌入节点和关系,学习隐含的漏洞模式,重新平衡节点标记分布。

  最后,构造了一个训练良好的模型,用于语句级的内存相关漏洞检测。

  检测阶段:

  通过过程间分析,首先提取目标程序的控制和数据依赖性进行程序切片,以捕获与存储器使用有关的精确程序语义。 然后,对于每个切片,以它的非结构化(即doc2vec的语句嵌入)和结构化(控制流数据流)信息为输入使用DL模型进行漏洞检测。

特征提取:

  使用静态分析工具Joern[1]解析源代码,构造程序依赖图(PDG)。然后,通过调用关系和调用图(CG)返回值等语义信息对PDG进行扩展,进行过程间分析,保留了完整的控制数据流信息。

  为了提高识别关键特征的性能,MVD不以整个程序为输入,而是以前后范围做切片为输入。

  关注的程序点:

1. system API call (滥用System Apicalls是造成漏洞的主要原因之一,包括与内存相关的漏洞。) 2. pointer variable(指针变量)

  图三为一个示例,节点5为关注的程序点,因为节点6不依赖于节点5的数据,所以它被移除。

节点嵌入:

  略。

图学习:

Graph Embedding:利用知识图嵌入方法[2]中使用的实体-关系复合操作 (·)联合嵌入语句节点和多个流边,将边嵌入结合到节点信息的更新中。

Resampling:分层图学习后,由于非易损节点和易损节点的分布极不平衡,直接在所有语句节点上训练分类器有偏差。为了生成一些合成的易损节点来重新平衡分布,采用图级过采样框架Graphsmote[3]作为重采样的基本组件。在易损节点周围邻居节点之间生成合成节点,再生成边和设置阈值。合成边的类型被设置为“控制”。重采样增加了内存相关漏洞语句的比例,避免了由于漏洞节点和非漏洞节点分布不均衡而造成的检测模型的偏差。

三个合成节点(粉红色阴影)与一个易受攻击的节点(即节点5)和一个非易受攻击的节点(即节点11)相连。

Classification:

略。

漏洞检测:

  与训练阶段类似,通过过程间分析捕获反映在源代码图形表示中的程序语义。 为了减少内存操作无关语句的数量,通过切片操作获得一批程序切片。程序切片中的语句节点通过DOC2VEC嵌入到低维向量中。最后,将非结构化(即语句嵌入)和结构化(即控制流和数据流)信息作为图形输入,输入到经过良好训练的检测模型中进行漏洞检测。

Experiment:

  数据集:从SARD和CVE手动构建的(包括CWE119,-120,-121,-122,-124,-125,-126,-401,-415,-416,-476,-787和-824),并对语句节点标注是否易受攻击。

  针对DL-based方法,静态分析方法和其他GNN方法做了对比实验。

Reference:

[1] Fabian Yamaguchi, Nico Golde, Daniel Arp, and Konrad Rieck. 2014. Modeling and Discovering Vulnerabilities with Code Property Graphs. In 2014 IEEE Symposium on Security and Privacy, SP 2014, Berkeley, CA, USA, May 18-21, 2014. IEEE Computer Society, 590–604.

[2] Antoine Bordes, Nicolas Usunier, Alberto García-Durán, Jason Weston, and Oksana Yakhnenko. 2013. Translating Embeddings for Modeling Multi-relational Data. In Advances in Neural Information Processing Systems 26: 27th Annual Conference on Neural Information Processing Systems 2013. Proceedings ofa meeting held December 5-8, 2013, Lake Tahoe, Nevada, United States. 2787–2795.

[3]Tianxiang Zhao, Xiang Zhang, and Suhang Wang. 2021. GraphSMOTE: Imbalanced Node Classification on Graphs with Graph Neural Networks. In WSDM’21, The Fourteenth ACM International Conference on Web Search and Data Mining, Virtual Event, Israel, March 8-12, 2021. ACM, 833–841.

最新文章

  1. 深入CSS,让网页开发少点“坑”
  2. 【bzoj2705】 SDOI2012—Longge的问题
  3. 概率 Gym 100502D Dice Game
  4. 利用java实现的一个发送手机短信的小例子
  5. ACM题目————玩转二叉树
  6. 异常System.Web.HttpException (0x80004005): Server cannot set status after HTTP headers have been sent.
  7. JavaScript 找出数组中重复的元素
  8. 用C语言写一个程序,得出当前系统的整形数字长(16位,32位,64位)等,不能使用sizeof()
  9. HDU1115--Lifting the Stone(求凸多边形的重心)
  10. div.2/D. As Fast As Possible<数学题,二分>
  11. 用javascript实现java的Map
  12. [Paper Reading]--Exploiting Relevance Feedback in Knowledge Graph
  13. Python3之数据类型
  14. 运行项目Tomcat报错
  15. SQLServer版本
  16. iOS报错:linker command failed with exit code 1 (use -v to see invocation) 问题解决方式之一
  17. NEERC-2017
  18. 图解安装Debian 9.5全过程
  19. day07 Python文件操作
  20. Xtrabackup的安装与使用

热门文章

  1. 初始化一个GCP项目并用gcloud访问操作
  2. SpringBoot 项目中配置多个 Jackson 的 ObjectMapper ,以及配置遇到的坑
  3. Sundial(一)
  4. 图解B树及C#实现(3)数据的删除
  5. 12月6日内容总结——BOM、DOM、两者查找标签的方式和操作标签的方式、操作class和css的方法、事件、jQuery类库
  6. requests进行webdriver协议,模仿selenium
  7. 洛谷p5723
  8. Symbol.iterator 迷惑行为
  9. js实现一二级域名共享cookie
  10. 交叉熵损失CrossEntropyLoss