法律状态公告日
法律状态信息
法律状态
2018-12-18
授权
授权
2017-02-01
实质审查的生效 IPC(主分类):G06F11/36 申请日:20160802
实质审查的生效
2017-01-04
公开
公开
技术领域
本发明属于安全技术领域,涉及一种基于代码仓库提交说明的PoC快速生成方法。
背景技术
目前越来越多的软件项目使用版本控制功能,通过代码仓库来跟踪软件项目的整个开发过程。代码仓库可以在空间上保证项目内容的统一管理,也可在时间上保证开发过程中的每个更改细节都被记录并保存。每次更改代码的提交都附带提交说明,内容包括提交时间、提交作者、提交原因、提交内容等,提交目的可能是补充功能,或者修复项目中存在的安全漏洞等。
PoC(Proof of Concept),中文解释为概念验证,在本发明中特指用于验证安全漏洞的测试代码。PoC可以还原安全漏洞的发生场景,证明软件系统中安全漏洞的存在和利用方式,被广泛应用于安全测试、渗透测试、安全漏洞验证等领域。然而,在实际应用中常常需要大量的PoC作为测试样本或验证样本,然而目前并没有可靠、充分的搜集来源。
发明内容
本发明提出一种基于代码仓库提交说明的PoC快速生成方法,目的在于快速地搜集大量可靠有效的PoC作为软件安全测试、渗透测试的输入实例,或者作为安全漏洞的验证样本,协助安全技术人员快速准确定位安全漏洞的位置,为安全漏洞的验证提供帮助。
为实现上述目的,本发明采用如下技术方案:
一种基于代码仓库提交说明的PoC快速生成方法,其步骤包括:
1)从代码仓库提交说明中提取含有代码的commit段,生成待测集;
2)提取步骤1)生成的待测集中commit段的语义特征,并根据commit段中是否含有PoC打正负标签,将语义特征协同正负标签一同作为输入,训练生成PoC分类器;
3)使用步骤2)生成的PoC分类器,对步骤1)生成的待测集进行并行分类,将含有PoC的commit段生成PoC集合,输出PoC。
在本发明中,PoC(概念验证)特指用于验证安全漏洞的测试代码;代码仓库用于跟踪软件项目的整个开发过程,在空间上保证项目内容的统一管理,在时间上保证开发过程中的每个更改细节都被记录并保存。本发明所述的代码仓库包括但不限于Git;commit段指的是代码仓库中每次变更代码提交时附带的提交说明,内容包括提交时间、提交作者、提交原因、提交内容。
进一步地,步骤1)包括以下步骤:
1-1)根据代码仓库提交说明中的关键字将代码日志切割为多个commit段,人工挑选含代码的commit段作为正训练样本,不含代码的commit段作为负训练样本。
1-2)对正训练样本和负训练样本进行数据预处理。所述预处理包括文本分词(样本语言为中文)、去停止词和词根还原(样本语言为英文)。
1-3)提取预处理后的正训练样本和负训练样本的特征,并进行文本向量化。
1-4)基于向量化的文本,采用并行机器学习方法对代码仓库提交说明中所有的commit段分类。
1-5)根据步骤1-4)分类的结果提取含有代码的commit段生成待测集。
进一步地,步骤1-4)中,在GPU中开设多个线程,将传输自CPU的代码仓库提交说明中所有的commit段均分给多个线程,每个线程均完成相同的分类操作。
进一步地,步骤2)包括以下步骤:
2-1)在待测集的commit段中,选取含有PoC的段落作为正训练样本集,打正标签,非描述PoC的段落作为负训练样本集,打负标签。
2-2)对正训练样本集和负训练样本集中的段落进行预处理,所述预处理包括分句处理。
2-3)对预处理后的训练样本采用并行深度学习方法训练隐层模型,提取语义特征。
2-4)将步骤2-3)所得最后隐层的语义特征,协同正标签和负标签,一同输入分类器,训练生成PoC分类器。
进一步地,步骤2-3)采用并行深度学习方法训练隐层模型的步骤又包括:
2-3-1)将预处理后的训练样本切分为多批次,每批次切分为多块;
2-3-2)对于每一批次的训练样本,在GPU中开启多个线程,每个线程负责一块训练样本的隐层模型训练;
2-3-3)每个线程的隐层模型训练完成后,将得到的结果进行统一化及整合后,对每个线程的训练结果进行更新,继续对下一批次的训练样本进行隐层模型训练。
进一步地,步骤2-3)还包括在采用并行深度学习方法训练隐层模型时如需添加隐层则重复该步骤,最后再进入步骤2-4)。
进一步地,步骤3)包括以下步骤:
3-1)以步骤1)生成的待测集为测试样本,并将测试样本切分为数据1,数据2…,数据N。
3-2)将切分后的数据1至数据N平均分配给GPU中开辟的多个线程,每个线程并发执行步骤2)生成的PoC分类器,对本线程的测试样本进行语义分析和分类判断,将结果返回给CPU。
3-3)CPU根据步骤3-2)返回的结果,将所含代码为PoC的commit段生成PoC集合,输出PoC。
进一步地,本发明所述的并行方法是基于GPU的,GPU的并行贯穿于步骤1-4)的机器学习方法、步骤2-3)的深度学习方法和步骤3)的并行分类过程。其中,步骤1-4)所述的并行机器学习方法的目标是通过分类获得含有代码的commit段,并不限定具体模型,因此所有得以实现该目标的机器学习模型均可用于该步骤;步骤2-3)所述的并行深度学习方法的目标是提取语义特征并分类获得含有PoC的commit段,并不限定具体模型,因此所有得以实现该目标的深度学习模型均可用于该步骤。
本发明的有益效果在于:
申请人在研究过程中,经调查发现,在代码仓库中的关于修复安全漏洞的代码提交说明里,常常存在验证该安全漏洞的测试代码,用于解释本次提交的原因、验证提交前后的对比效果。本发明首次发现代码仓库的提交说明可以作为PoC的数据来源,并提供了有效可行的提取PoC方法,能够快速地生成PoC集合,为软件项目的安全测试、渗透测试等提供大量可靠的测试实例,同时降低安全技术人员搜集漏洞验证样本的难度,进而为安全漏洞的研究带来帮助。
由于代码仓库的提交说明数据量庞大,导致分析过程耗时费力,本发明引入GPU并行计算来解决时间瓶颈问题。与CPU架构不同,GPU含有更多的晶体管用于数据处理而非数据缓存和逻辑控制,旨在解决高密度、高并行度的计算问题。GPU并行计算的最佳适用场景为数据量大并且重复的操作,例如深度学习中使用大量数据反复执行的模型训练等。因此本发明结合机器学习方法、深度学习方法和GPU并行计算提出了一种基于代码仓库提交说明的PoC快速生成方法。该方法首先使用并行机器学习方法构造分类器,对代码仓库的提交说明进行分类,筛选出含代码的commit段作为待测集。接着使用并行深度学习方法对待测集的commit段进行语义分析,根据语义特征进一步筛选出含有PoC的commit段,生成PoC集合。本发明适用于所有使用代码仓库进行版本控制的软件项目。因此对于任意使用代码仓库进行版本控制的软件项目,均可通过本发明快速地得到相应PoC集合,包括但不限于Android和Linux Kernel。
附图说明
图1是本发明基于代码仓库提交说明的PoC快速生成方法的示意图。
图2是本发明使用并行机器学习方法生成含代码的commit待测集的流程图。
图3是本发明使用深度学习方法训练模型生成PoC分类器的流程图。
图4是本发明使用GPU并行训练隐层模型的流程图。
图5是本发明使用PoC分类器对commit待测集分类的流程图。
图6是本发明使用GPU并行分类的流程图。
具体实施方式
下面结合附图,通过实施例对本发明作进一步的说明。
本发明基于代码仓库提交说明的PoC快速生成方法,其总体架构如图1所示,主要包括以下步骤:
步骤S101、将代码仓库提交说明切割为多个commit段,人工挑选含代码和不含代码的commit段作为正负训练样本集,经数据预处理后,对其提取特征,使用并行机器学习方法对测试样本集即所有commit段进行分类,区分commit段是否含有代码,提取含有代码的commit段作为待测集。具体的步骤流程如图2所示,说明如下:
步骤S201、获取训练样本。根据代码仓库提交说明中的关键字将代码日志切割为多个commit段,人工挑选含代码的commit段作为正训练样本,不含代码的commit段作为负训练样本。
步骤S202、对上述正、负训练样本进行数据预处理。包括文本分词(样本语言为中文)、去停止词和词根还原(样本语言为英文)。
步骤S203、提取正、负训练样本的特征,将文本向量化。将数据预处理后挑选出的词用作构建文本向量空间的特征项,选取合适的权重算法,为每个特征项赋权值,构建文本向量。
步骤S204、使用并行机器学习方法对代码仓库提交说明中所有commit段(即下述的“测试样本集”)分类。由于测试样本集数量庞大,且机器学习方法中文本向量距离的计算内容较为简单,故可将该步骤移入GPU中以减少时间代价。在GPU中开设多个线程,将传输自CPU的测试样本集均分给多个线程,每个线程均完成相同的操作。
本发明在并行机器学习方法的使用中并不限定具体的机器学习模型,为了具体描述实施步骤,本实施例以K最近邻(kNN,k-NearestNeighbor)模型为例,实际上在该步骤中也可使用其他机器学习模型。
步骤S205、计算本线程中的测试样本与每个训练样本的向量间距离。
步骤S206、挑选出与本线程中的测试样本相似度最高的k个训练样本。
步骤S207、根据该k个训练样本的所属类别,采用多数表决方法,推断出本线程中的测试样本的类别。
步骤S208、将分类结果传输至CPU,由CPU负责最后的逻辑整合。根据分类结果判别测试样本集中每个commit段是否含有代码。若含有,则转至步骤S209;若不含代码,则转至步骤S210。
步骤S209、提取含有代码的commit段生成待测集,作为步骤S103的测试样本集。
步骤S210、结束。
步骤S102、使用并行深度学习方法,训练隐层模型,提取语义特征,进而生成PoC分类器。首先在待测集的commit段中人工选取训练集,对其进行数据预处理,训练语义特征,生成PoC分类器,该分类器可分类出含有PoC的commit段。具体的步骤流程如图3所示,说明如下:
步骤S301、获取训练样本。在待测集的commit段中,人工选取大量描述PoC的段落作为正训练样本集,非描述PoC的段落作为负训练样本集。
步骤S302、数据预处理。对正、负样本集中的段落进行分句处理。
步骤S303、将预处理后的所有训练样本(不携带正负标签)作为输入,无监督的并行训练隐层模型,学习特征。
步骤S304、由于深度学习模型可包含多个隐层,该步骤由人工根据实践经验决定是否继续添加隐层。若是,则转入步骤S303,继续训练新隐层模型;若不是,则转入步骤S305。
步骤S305、将所得训练样本最后隐层的特征,即语义特征,协同正负标签,一同输入分类器,通过有监督的学习对分类器进行微调。
步骤S306、生成PoC分类器。
在步骤S303训练隐层模型中,由于训练样本集规模庞大,且训练过程需要反复调节,导致该步骤耗费大量计算资源和计算时间,故采用GPU并行方法来加速计算效率。将训练数据切分为多批次,每批次切分为多块。对于每一批次的训练数据,在GPU中开启多个线程,每个线程负责一块训练样本的隐层模型训练任务。每个线程训练隐层模型的具体流程如图4所示,说明如下:
本发明在深度学习方法的使用中并不限定具体的深度学习模型,为了具体描述实施步骤,本实施例以自编码器模型为例,实际上在该步骤中也可使用其他深度学习模型。
步骤S401、训练本线程的自编码器。自编码器由一对编码器和解码器构成,对输入数据先编码后解码,若编码结果与输入数据近乎一致,则认为该编码结果为输入数据的良好表达,即抽象特征。
步骤S402、判断代价函数是否收敛。通过对比自编码器的输出结果与原始输入的差异,可形成代价函数,若代价函数收敛,则表明重构误差趋近最小,特征提取准确,转至步骤S404;若不收敛,则转至步骤S403。
步骤S403、调整编码器和解码器的参数,转至步骤S401继续训练自编码器。
步骤S404、保存编码器作为本线程最终的隐层模型,丢弃解码器,提取编码结果作为抽象特征。
由于每块训练样本不同,致使每个线程的隐层模型训练结果有所差异,即产生了多个模型实例。本发明引入图4中的参数服务器完成模型统一化,每个线程模型训练完成后,将结果模型汇报给参数服务器,参数服务器负责将整合后的新模型分发给各线程,更新训练模型之后,继续对下一批次的训练样本进行隐层模型训练。
步骤S103、使用步骤S102生成的PoC分类器对S101生成的含代码的commit待测集进行语义分析,分类出含PoC的commit段,生成PoC集合。为了加快分类效率,引入GPU并行方法,将测试样本均分给多个线程,并发执行语义分析。具体的步骤流程如图5所示,说明如下:
步骤S501、将步骤S101得到的含代码的commit待测集作为测试样本集。
步骤S502、由于测试样本集数量庞大,故引入GPU并行方法加速分类效率。首先对测试样本数据进行切分,如图6所示,将切分后的数据1至数据N平均分配给GPU中开辟的多个线程,每个线程并发执行步骤S102生成的PoC分类器,对本线程的测试样本进行语义分析和分类判断,将结果返回给CPU。
步骤S503、CPU根据分类结果判别commit段所含代码是否为PoC,若是,则转至步骤S504;若不是,则转至步骤S505。
步骤S504、生成PoC集合,输出PoC。
步骤S505、结束。
实施例
下面提供一个具体应用实例,其实施步骤包括:
1)使用并行机器学习方法对代码仓库提交说明中的commit段分类,区分commit段是否含有代码,提取含有代码的commit段作为待测集。
以Linux kernel项目的代码仓库提交日志为例,使用并行机器学习方法对其分类,得到commit-77238f2b942b38ab4e7f3aced44084493e4a8675中含有代码,将该commit段添加进待测集中。
2)使用并行深度学习方法,训练隐层模型,提取commit段的语义特征。根据commit段中是否含有PoC来挑选正负样本,将语义特征协同正负标签一同作为输入,训练生成PoC分类器。
3)使用步骤2)生成的PoC分类器,并行地对步骤1)生成的commit待测集进行语义分析,分类出含有PoC的commit段,生成PoC集合。
根据分类器的分类结果显示,commit-77238f2b942b38ab4e7f3aced44084493e4a8675含有PoC。该commit段中的描述部分如下所示。
AF_UNIX:Fix deadlock on connecting to shutdown socket I found a deadlock bug in UNIX domain socket,which makes able to DoS attack against the local machine by non-root users.
How to reproduce:
1.Make a listening AF_UNIX/SOCK_STREAM socket with an abstruct namespace(*),and shutdown(2)it.
2.Repeat connect(2)ing to the listening socket from the other sockets until the connection backlog is full-filled.
3.connect(2)takes the CPU forever.If every core is taken,the system hangs.
PoC分类器通过对其文字描述部分进行语义分析,发现所述内容与PoC相关,故将该commit段添加进PoC集合中。生成的PoC如下所示。
以上实施例仅用于说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。
机译: 安装在水稻种植机上的液体喷雾装置,并且本申请是使用该方法的同时种植溶液喷雾的方法(相关申请的交叉引用),该申请的优先权已于2012年3月12日提交“ RICETRANSPLANTER-MOUNTEDLIQUIDREAGENTAPPLICATIONDEVICE”中国专利申请基于CN201210064117.7的申请,旨在要求专利申请的优先权,假定将所述申请的全部内容结合到本说明书的内容中。
机译: 在2000年11月28日提交的美国临时专利申请No.60 / 253,612中,本发明的实施例(与相关申请的交叉引用)对通信系统中的救济连接过程的重试限制是“那些要求优先权的”。限制,以检查呼叫缓解信道过程的限制)和RetryLimitforDropCallRescueChannelProcedures,以及2001年10月16日提交的美国专利申请第09/978974号“ ForwardLinkdBasedRescueChannelMethod andApparatusforTelecommunicationSystem”,涉及“(一种通信系统的设备转发和基于链路的救援信道方法),出于任何目的,我将其内容通过引用合并于此。
机译: 本申请支持交换层安全传输的数据处理方法和交换设备,于2010年12月20日提交给中国专利局,申请号为201010596665.5,发明名称支持“链路层安全传输,本申请要求基于中国专利申请是一种“数据处理方法”和“将设备切换到”,并通过公开内容整体并入本文。