摘要:TDSC 2022发表了安全补丁识别最新的方案“Enhancing Security Patch Identification by Capturing Structures in Commits” (E-SPI)。
本文分享自华为云社区《【论文推荐】TDSC2022 安全补丁识别最新的方案E-SPI》,作者: 华为云软件分析Lab。
TDSC 2022发表了安全补丁识别最新的方案“Enhancing Security Patch Identification by Capturing Structures in Commits” (E-SPI),该方案同时考虑代码提交的Message和Changed Code的拓扑特征,通过实验表明,该方案超过了当前业界的SOTA,达到业界领先。
根据《2021年开源安全与风险分析报告》统计,平均每个代码仓含158个安全漏洞,84%的代码仓都至少存在1个安全漏洞。相比20年,21年高风险漏洞环比增长了11%。开源软件带来便利的同时,也引入了潜在的安全风险。大多数软件漏洞都在公开源组件被静默修复,这就导致集成它们的已部署软件无法及时更新,鉴于此,如何高效的识别开源组件的安全补丁成为学术界一个热门的问题。
最近几年,随着深度学习的飞速发展,基于深度学习的安全补丁识别模型快速提升了安全补丁识别模型的有效性。但是,目前大多数现有的安全补丁识别方案直接把代码提交修改的代码、提交信息当成Token,忽略了代码的结构信息,这篇文章提出了E-SPI模型,有效的利用了隐藏在提交中的结构信息,进一步提升识别模型的效果。
E-SPI整体的架构入上图所示,该方案分别对代码提交中的代码修改以及提交信息进行Embedding,最终联合两者的特征,来识别安全补丁。
代码修改编码器:对于代码提交中代码修改,该方案首先抽取代码修改前的函数Pre-function 和代码修改后的函数Post-function ;接着对着两个函数进行AST解析,为了适配序列模型的输入,该方案创新的提出了AST Path提取方法,将、对应AST的图转换成两类AST Paths:Within-context paths、Within-changes paths,其中Within-context paths代表AST树上开始的节点在修改代码中,结束节点不在修改的代码中的路径,Within-changes path代表AST树上开始和结束都在修改代码中的路径;最终以1:1的比例随机分别选取K个Within-context paths 和Within-context paths,来表征代码修改,输入Bi-LSTM完成代码修改的Embedding。
提交信息编码器:对于代码提交中的提交信息,该方案将原始的自言语言进行Dependency Graph解析,从而获取自言语言的依赖关系,针对该图结构,使用Gated Graph Neural Network完成编码。
为了对比,这篇文章选取了学术界7个典型的安全补丁识别算法,这些模型主要的特征以及架构如下
首先,这篇文章从整体上对所有的模型进行了比较,结果(见下图)显示E-SPI达到了SOTA,这表明,相对其他的方案,E-SPI能更好的对代码提交进行建模。通过进一步观察发现,代码提交信息是安全补丁识别问题的重要特征,加入提交信息的模型(Stacking、PatchRNN、SPI、Transformer、E-SPI)显著比没有加入代码提交信息的模型(Commit2Vec、VulFixMiner)要好,即使架构最简单的Stacking模型(添加了代码提交信息特征)也比只使用修改代码的模型Commit2Vec,VulFixMiner结果要好;另外可以发现,在特征相同的情况下,Transformer-Based的模型(Transformer)反而没有BiLSTM-Based的模型(PatchRNN,SPI,E-SPI)结果好,这有可能是样本不足,导致Transformer-Based模型训练不充分。
为了进一步比较不同模型对代码的建模能力,该篇文章在只使用代码修改作为特征的前提下,也对不同模型进行了比较,结果见下图。结果显示Transformer-Based的模型(Transformer)对代码的建模能力会显著优于其他的架构模型(PatchRNN、SPI、Commit2vec、E-SPI w/o changes、E-SPI w/o context);另外我们可以发现AST Paths在代码特征建模有显著的增益,这就导致,在整体上E-SPI对代码的建模能力依然超过了Transformer模型。
文章来自:PaaS技术创新Lab,PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!
PaaS技术创新Lab主页链接:https://www.huaweicloud.com/lab/paas/home.html
【1】Enhancing Security Patch Identification by Capturing Structures in Commits,
论文地址:https://arxiv.org/pdf/2207.09022.pdf
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我想为我的Rails网络应用程序提供推荐功能。特别是,我想向新注册的用户推荐他可能想要关注的其他用户。Rails中是否有用于此目的的引擎/gem?如果没有,我应该从哪里开始构建它?谢谢。 最佳答案 有Coletivogemhttps://github.com/diogenes/coletivo我试了一下。在MySQL上运行。Neo4jhttp://neo4j.org真的很容易实现一个“跟随谁”。事实上,大多数展示其能力的样本都涉及“跟随谁”。快速提示-只有在JRuby上运行时,Neo4j.rb才会很酷。如果不是-使用Neograph
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同
我在一个ruby文件中有一个函数可以像这样写入一个文件File.open("myfile",'a'){|f|f.puts("#{sometext}")}这个函数在不同的线程中被调用,使得像上面这样的文件写入不是线程安全的。有谁知道如何以最简单的方式使这个文件写入线程安全?更多信息:如果重要的话,我正在使用rspec框架。 最佳答案 您可以通过File#flock给锁File.open("myfile",'a'){|f|f.flock(File::LOCK_EX)f.puts("#{sometext}")}
您能为RubyonRails推荐好的数据网格类/gem吗?喜欢http://code.google.com/p/zend-framework-datagrid/采埃孚 最佳答案 你也可以试试datagridgem。这不仅关注带有列的网格,还关注过滤器。classSimpleReportincludeDatagridscopedoUser.includes(:group)endfilter(:category,:enum,:select=>["first","second"])filter(:disabled,:eboolean)fi