论文名称 | 发表时间 | 发表期刊 | 期刊等级 | 研究单位 |
Path-sensitive code embedding via contrastive learning for software vulnerability detection |
2022年 | ISSTA | CCF A | 悉尼科技大学 |
1. 引言
研究背景:尽管人们在提高软件安全性方面做出了相当大的努力,但漏洞仍然是现代软件开发中的一个主要问题。现有的静态错误检测器(例如 Checkmarx、RATs、ITS4、CoBOT、Coverity、SVF、Infer)严重依赖于用户定义的规则和领域知识的有效性,使其成为一项劳动密集型工作。尽管它们在检测传统的明确定义的错误(例如释放后使用、空取消引用)方面取得了成功,但这些检测器仍然难以发现更广泛的漏洞(例如命名问题和不正确的业务逻辑),并报告大部分误报/漏报。深度学习技术最近的成功为开发更智能的检测系统提供了新的机会,通过学习漏洞模式,通过预测模型捕获易受攻击的程序与其提取的代码特征之间的相关性。深度神经网络通过学习漏洞模式可以更好的实现漏洞检测
现存问题:代码嵌入旨在通过分布式向量表示来表示代码语义,最近已被提出用于源代码分析和错误检测。最初,嵌入方法通过应用自然语言处理技术来学习代码语义而无需代码结构信息,将程序视为文本标记。后来,几种方法通过保留结构信息来改进嵌入结果,例如通过程序依赖图,然后使用图神经网络(GNN)来分类(子)代码片段图是否容易受到攻击。传统的代码嵌入主要基于自然语言处理技术和图嵌入技术
虽然学习代码的图形表示可以用于代码分类或摘要任务,但对于基于路径的漏洞检测仍然不足。这是因为输入图表示不区分程序路径,这对后端GNN来说是不透明的。图特征是通过GNN中所有连接节点对之间的消息传递来学习的,无法获得任何可行/不可行 value-flow。因此,这些预测模型不知道潜在的错误路径(这些路径表明错误是如何产生和触发的)。基于图嵌入的方法无法有效识别执行路径
研究挑战:为了解决上述限制,检测方法需要研究可以保留 value-flow path 的精确学习模型。受到词嵌入中 a bag of token 想法的启发,最近的一些代码嵌入方法在抽象语法树(AST)或 value-flow grapg(VFG)上嵌入 a bag of path 以进行代码分类和总结 [ Flow2Vec: value-flow-based precise code embedding ] 。这些方法随机采样一小部分路径来生成它们的嵌入向量,然后将它们聚合以形成代码片段的最终表示。然而,这些方法不能直接用于复杂的任务,例如基于路径的错误检测,因为需要嵌入的程序路径的数量可能是无限的。现有的基于自然语言的方法无法有效识别执行路径
基于路径的模型的有效性在于路径选择策略。其关键在于识别和保留单个可行路径,而不是通过随机采样聚合不可行或与错误无关的路径。这需要选择性地学习具有判别性特征的路径(有助于模型对错误语义的学习),从而为基于路径的漏洞检测产生精确的嵌入。为了实现执行路径的有效识别,需要选择性的学习具有判别性特征的路径
研究内容:论文提出一种路径敏感的代码嵌入方法 ContraFlow,该方法通过自监督的对比学习实现基于 value-flow path 的漏洞检测。(1)通过对比学习生成预训练路径编码器,该编码器使语义上相似的路径保持彼此接近(反之亦然)。(2)通过预训练路径编码器结合主动学习来指导路径选择过程,减少训练下游微调任务(漏洞检测)所需的 value-flow path 数量。在路径选择过程中,论文将稀疏和受保护的 value-flow 分析引入代码嵌入中,通过检查路径可行性来进一步细化所选的 value-flow(只有可行的 value-flow path 被保留在嵌入空间中以精确地表示代码片段)。(3)论文的漏洞检测能够根据路径敏感表示检测潜在的错误执行路径,并解释导致漏洞的重要 value-flow path。
- Contrastive Value-Flow Embeding:该阶段使用对比学习训练 value-flow 嵌入模型,即 Value-Flow Path Embeding(VPE)。基于静态分析器 SVF 从未标记源代码中提取的一组 value-flow path,论文首先执行数据增强以生成 con