论文学习_Path-sensitive code embedding via contrastive learning for software vulnerability detection

论文名称 发表时间 发表期刊 期刊等级 研究单位

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
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以在 checkbox 的槽函数中根据选中状态来执行相应的查询。 例如,你可以在每个 checkbox 的槽函数中,判断该 checkbox 是否选中,如果选中则执行对应的数据库查询: ``` void MyWidget::on_checkBox_stu_num_toggled(bool checked) { if (checked) { QString str = ui->let_yyw_student_number->text(); // 执行学号查询 // ... } // 更新数据显示 updateTable(); } void MyWidget::on_checkBox_name_toggled(bool checked) { if (checked) { QString str = ui->let_yyw_name->text(); // 执行姓名查询 // ... } // 更新数据显示 updateTable(); } // 其他 checkbox 的槽函数类似 ``` 在每个槽函数中,你可以根据选中的 checkbox 执行对应的数据库查询,并使用 updateTable() 函数更新数据显示。在 updateTable() 函数中,你可以根据所有 checkbox 的选中状态,确定要显示的数据,然后更新数据显示。具体实现可以参考你提供的代码。 另外,你也可以使用 QButtonGroup 类来管理多个 checkbox,这样可以在一个槽函数中处理所有 checkbox 的状态变化。例如: ``` void MyWidget::onCheckBoxToggled(int id, bool checked) { switch (id) { case 1: if (checked) { QString str = ui->let_yyw_student_number->text(); // 执行学号查询 // ... } break; case 2: if (checked) { QString str = ui->let_yyw_name->text(); // 执行姓名查询 // ... } break; // 其他 checkbox 的查询处理 } // 更新数据显示 updateTable(); } // 在构造函数中创建 QButtonGroup 并连接槽函数 MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { ui->setupUi(this); // 将多个 checkbox 添加到同一个 QButtonGroup QButtonGroup *group = new QButtonGroup(this); group->addButton(ui->checkBox_stu_num, 1); group->addButton(ui->checkBox_name, 2); // 添加其他 checkbox // 连接槽函数 connect(group, SIGNAL(buttonToggled(int,bool)), this, SLOT(onCheckBoxToggled(int,bool))); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值