首页 / 专利库 / 软件 / 控制流图 / 一种代码漏洞检测方法、装置、介质及设备

一种代码漏洞检测方法、装置、介质及设备

阅读:493发布:2020-05-16

专利汇可以提供一种代码漏洞检测方法、装置、介质及设备专利检索,专利查询,专利分析的服务。并且本 发明 属于计算机技术领域,提供一种代码漏洞检测方法、装置、介质及设备,本发明提供的技术方案中,获取待检测程序代码以及预设污点数据规则;提取待检测程序代码中的线程;针对提取的每个线程,生成该线程的数据流图;根据预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;将提取的各个线程的代码中的污点数据保存至污点数据集合;判断提取的各个线程中是否包括多个线程对污点数据集合中的同一污点数据进行了 指定 操作;若是,确定待检测程序代码中存在线程间释放后重用漏洞。本发明结合静态代码分析技术以及释放后重用漏洞的污点数据规则,可以确定线程间释放后重用漏洞。,下面是一种代码漏洞检测方法、装置、介质及设备专利的具体信息内容。

1.一种代码漏洞检测方法,其特征在于,包括:
获取待检测程序代码以及预设污点数据规则,所述预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据;
提取所述待检测程序代码中的线程;
针对提取的每个线程,生成该线程的数据流图;
根据所述预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;
将提取的各个线程的代码中的污点数据保存至污点数据集合;
判断提取的各个线程中是否包括多个线程对所述污点数据集合中的同一污点数据进行了指定操作;
若是,确定所述待检测程序代码中存在线程间释放后重用漏洞。
2.根据权利要求1所述的方法,其特征在于,将各个线程的代码中的污点数据保存至污点数据集合,具体包括:
提取各个线程的代码中未设置互斥机制的污点数据;
将各个线程的代码中互不重复且未设置互斥机制的污点数据保存至所述污点数据集合。
3.根据权利要求1所述的方法,其特征在于,生成该线程的数据流图,具体包括:
将该线程的入口函数作为起始函数,生成该线程的函数调用图;
根据所述函数调用图,生成该线程的函数间控制流图
根据所述函数间控制流图,生成该线程的函数间数据流图。
4.根据权利要求1所述的方法,其特征在于,还包括:
若所述待检测程序代码中仅包括一个线程对该污点数据进行指定操作,则确定所述待检测程序代码中存在线程内释放后重用漏洞。
5.根据权利要求1~4任一所述的方法,其特征在于,所述确定该线程的代码中的污点数据,具体包括:
将该线程的代码中已释放的数据确定为源污点数据;
遍历该线程的代码中将所述源污点数据传递给线程间共享数据的语句,并将遍历到的语句作为污点陷入点;
判断该线程的数据流图中是否包括从所述源污点数据到所述污点陷入点的数据流;
若是,确定所述源污点数据以及所述线程间共享数据为该线程的代码中的污点数据。
6.根据权利要求5所述的方法,其特征在于,所述污点数据为已释放的内存的指针,则判断提取的各个线程中是否包括多个线程对所述污点数据集合中的同一污点数据进行了指定操作,具体包括:
获取从所述待检测程序代码提取的各个线程中,利用该已释放的内存的指针对该已释放的内存进行了读或写操作的线程,作为该已释放的内存的指针的操作线程;
判断是否存在多个该已释放的内存的指针的操作线程。
7.根据权利要求1~4任一所述的方法,其特征在于,所述污点数据为已释放的内存的指针,则判断提取的各个线程中是否包括多个线程对所述污点数据集合中的同一污点数据进行了指定操作,具体包括:
获取从所述待检测程序代码提取的各个线程中,利用该已释放的内存的指针对该已释放的内存进行了读或写操作的线程,作为该已释放的内存的指针的操作线程;
判断是否存在多个该已释放的内存的指针的操作线程。
8.一种代码漏洞检测装置,其特征在于,包括:
获取模,用于获取待检测程序代码以及预设污点数据规则,所述预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据;
提取模块,用于提取所述待检测程序代码中的线程;
生成模块,用于针对提取的每个线程,生成该线程的数据流图;
第一确定模块,用于根据所述预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;
保存模块,用于将提取的各个线程的代码中的污点数据保存至污点数据集合;
判断模块,用于判断提取的各个线程中是否包括多个线程对所述污点数据集合中的同一污点数据进行了指定操作;
第二确定模块,用于在所述判断模块判断是的情况下,确定所述待检测程序代码中存在线程间释放后重用漏洞。
9.根据权利要求6所述的装置,其特征在于,所述保存模块,具体包括:
提取单元,用于提取各个线程的代码中未设置互斥机制的污点数据;
保存单元,用于将各个线程的代码中互不重复且未设置互斥机制的污点数据保存至所述污点数据集合。
10.根据权利要求6所述的装置,其特征在于,所述生成模块,具体包括:
第一生成单元,用于将该线程的入口函数作为起始函数,生成该线程的函数调用图;
第二生成单元,用于根据所述函数调用图,生成该线程的函数间控制流图;
第三生成单元,用于根据所述函数间控制流图,生成该线程的函数间数据流图。
11.根据权利要求6所述的装置,其特征在于,还包括:
第三确定模块,用于若所述待检测程序代码中仅包括一个线程对该污点数据进行指定操作,则确定所述待检测程序代码中存在线程内释放后重用漏洞。
12.根据权利要求8-11任一所述的装置,其特征在于,所述第一确定模块,具体包括:
第一确定单元,用于将该线程的代码中已释放的数据确定为源污点数据;
遍历单元,用于遍历该线程的代码中将所述源污点数据传递给线程间共享数据的语句,并将遍历到的语句作为污点陷入点;
判断单元,用于判断该线程的数据流图中是否包括从所述源污点数据到所述污点陷入点的数据流;
第二确定单元,用于在所述判断单元判断是的情况下,确定所述源污点数据以及所述线程间共享数据为该线程的代码中的污点数据。
13.一种非易失性计算机存储介质,其特征在于,所述计算机存储介质存储有可执行程序,该可执行程序被处理器执行实现权利要求1-7任一所述方法的步骤。
14.一种计算机设备,其特征在于,包括存储器、处理器及存储在存储器上的计算机程序,所述处理器执行所述程序时实现权利要求1-7任一所述方法的步骤。

说明书全文

一种代码漏洞检测方法、装置、介质及设备

技术领域

[0001] 本申请涉及计算机技术领域,尤其涉及一种代码漏洞检测方法、装置、介质及设备。

背景技术

[0002] 代码漏洞是在软件开发过程中进行程序代码编辑时有意或无意产生的代码缺陷。代码漏洞的存在会威胁开发出的软件的安全稳定运行。因此,需要对代码漏洞进行检测,以保证相应软件的稳定运行。
[0003] 代码漏洞可以包括单线程对应的代码中的释放后重用漏洞(以下简称线程内释放后重用漏洞)和多个线程之间的释放后重用漏洞(以下简称线程间释放后重用漏洞)等漏洞。其中,线程间释放后重用漏洞会导致内存信息的泄露、代码执行异常以及线程所在的软件崩溃等问题。因此,如何检测出程序代码中的线程间释放后重用漏洞是一个需要考虑的问题。发明内容
[0004] 本申请提供一种代码漏洞检测方法、装置、介质及设备,用于解决现有技术中存在的无法检测程序代码中多个线程之间的释放后重用漏洞的问题。
[0005] 一方面,本申请实施例提供一种代码漏洞检测方法,包括:获取待检测程序代码以及预设污点数据规则,所述预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据;提取所述待检测程序代码中的线程;针对提取的每个线程,生成该线程的数据流图;根据所述预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;将提取的各个线程的代码中的污点数据保存至污点数据集合;判断提取的各个线程中是否包括多个线程对所述污点数据集合中的同一污点数据进行了指定操作;若是,确定所述待检测程序代码中存在线程间释放后重用漏洞。利用本实施例,可确定该程序代码存在线程间释放后重用漏洞,从而结合静态代码分析技术以及释放后重用漏洞的污点数据规则,实现了线程间释放后重用漏洞的确定。
[0006] 另一方面,本申请实施例提供一种代码漏洞检测装置,包括:获取模,用于获取待检测程序代码以及预设污点数据规则,所述预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据;提取模块,用于提取所述待检测程序代码中的线程;生成模块,用于针对提取的每个线程,生成该线程的数据流图;第一确定模块,用于根据所述预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;保存模块,用于将提取的各个线程的代码中的污点数据保存至污点数据集合;判断模块,用于判断提取的各个线程中是否包括多个线程对所述污点数据集合中的同一污点数据进行了指定操作;第二确定模块,用于在所述判断模块判断是的情况下,确定所述待检测程序代码中存在线程间释放后重用漏洞。
[0007] 再一方面,本申请实施例提供一种非易失性计算机存储介质,所述计算机存储介质存储有可执行程序,该可执行程序被处理器执行实现上述实施例提供的任一代码漏洞检测方法的步骤。
[0008] 又一方面,本申请实施例提供一种计算机设备,其特征在于,包括存储器、处理器及存储在存储器上的计算机程序,所述处理器执行所述程序时实现上述实施例提供的任一代码漏洞检测方法的步骤。
[0009] 本申请实施例提供的代码漏洞检测方法、装置、介质及设备,生成待检测程序代码中每个线程的数据流图,并根据该数据流图和预先设定的污点数据规则,确定相应线程中针对释放后重用漏洞的污点数据以及将待检测程度代码的各个线程中的污点数据保存至污点数据集合,若待检测程序代码中包括多个线程对污点数据集合中的同一污点数据进行了指定的操作,则确定该待检测程序代码中存在线程间释放后重用漏洞,从而结合静态代码分析技术以及预设的污点数据规则,实现了线程间释放后重用漏洞的检测。。附图说明
[0010] 通过参考附图阅读下文的详细描述,本申请示例性实施例的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本申请的若干实施方式,其中:
[0011] 图1为本申请实施例提供的代码漏洞检测方法的应用场景示意图;
[0012] 图2为本申请实施例提供的代码漏洞检测方法的流程示意图;
[0013] 图3为本申请实施例提供的确定线程的代码中的污点数据的方法流程示意图;
[0014] 图4为本申请实施例提供的将污点数据保存至污点数据集合的方法流程示意图;
[0015] 图5为本申请实施例提供的生成线程的数据流图的方法流程示意图;
[0016] 图6为本申请实施例提供的代码漏洞检测方法的具体实施过程的流程示意图;
[0017] 图7为本申请实施例提供的利用静态分析工具进行代码漏洞确定的示意图;
[0018] 图8为本申请实施例提供的代码漏洞检测装置结构示意图;
[0019] 图9为本申请实施例提供的计算机设备的硬件结构示意图。

具体实施方式

[0020] 为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
[0021] 在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
[0022] 在本文中,需要理解的是,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。为了方便理解,下面对本申请实施例中涉及的名词进行解释。
[0023] 静态代码分析技术:在不运行程序代码的情况下,通过词法分析、语法分析、控制流分析、数据流分析等技术对程序代码进行扫描,验证程序代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。
[0024] 函数调用图:用于表示程序代码中各个函数之间的调用关系。
[0025] 控制流分析:基于函数调用图,对各个函数内部代码的执行路径进行分析。
[0026] 控制流图:控制流分析产生的结果,为有向图,该图中的节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环。
[0027] 数据流分析:对控制流图进行遍历,对代码在不同路径上的执行过程中,数据的赋值和存储、内存的读和写过程进行分析。
[0028] 数据流图:数据流分析产生的结果,记录了代码在不同路径上的执行过程中,数据的赋值和存储、内存的读和写过程。
[0029] 线程:是操作系统能够进行运算调度的最小单位,是进程中的实际运作单位。一个线程是进程中的一个单一顺序的控制流,一个进程中可以并发多个线程,各线程可并行执行相应的任务。
[0030] 释放后重用(Use-After-Free,UAF)漏洞:仍对已释放的数据仍进行操作,包括线程内释放后重用漏洞和线程间释放后重用漏洞,其中,线程内释放后重用漏洞为该线程对其已释放的数据进行操作;线程间释放后重用漏洞为其中一个线程释放数据后,其它线程仍对已释放的数据进行操作,其中,数据可以包括程序代码中的变量、指针等,比如,线程A释放内存A后,线程B仍对内存A的指针进行调用,以对内存A的指针指向的内存区域进行读或写操作。
[0031] 污点数据:已释放的数据以及与该已释放的数据具有关联关系的共享数据。
[0032] 污点数据规则:用于判定代码中的污点数据,可根据代码漏洞的特征设置相应的污点数据规则。
[0033] 互斥机制:针对共享数据而设置,每次只允许一个线程访问该共享数据的机制。若一个线程正在访问一个设置了互斥机制的共享数据,则其它线程必须等待该线程对该共享数据访问完毕后,才可去访问该共享数据。
[0034] 竞争条件:多个线程在同时运行的情况下对未设置互斥机制的共享数据进行读或写操作的状态,即在共享数据没有互斥机制保护的情况下,多个线程对该共享数据进行读/写操作,则认为该多个线程存在竞争条件。
[0035] 目前,程序的代码中通常会涉及多线程并行执行的技术。当并行执行的多个线程需要访问同一共享数据时,需要针对该共享数据设置互斥机制,以避免出现多个线程对该共享数据进行竞争的现象。然而,在代码编写的过程中,难免会出现漏掉设置互斥机制的情况,此时就会出现线程间存在竞争条件的现象。线程间存在竞争条件时,若其中一个线程释放了共享数据后,与该线程存在竞争条件的其它线程仍然对该已释放的共享数据进行操作,则会出现线程间释放后重用漏洞。
[0036] 发明人发现,现有的静态代码分析技术无法检测线程间释放后重用漏洞。因此,如何检测线程间释放后重用漏洞成为一个需要解决的问题。
[0037] 为此,本申请实施例提供一种代码漏洞检测方法,该方法可以包括:获取待检测程序代码以及预设污点数据规则,该预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据;提取待检测程序代码中的线程;针对提取的每个线程,生成该线程的数据流图;根据获取的污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;将提取的各个线程的代码中的污点数据保存至污点数据集合;判断提取的各个线程中是否包括多个线程对该污点数据集合中的同一污点数据进行了指定操作;若是,确定待检测程序代码中存在线程间释放后重用漏洞。
[0038] 本申请实施例提供的代码漏洞检测方法,生成待检测程序代码中每个线程的数据流图,并根据该数据流图和预先设定的污点数据规则,确定相应线程中针对释放后重用漏洞的污点数据以及将待检测程度代码的各个线程中的污点数据保存至污点数据集合,若待检测程序代码中包括多个线程对污点数据集合中的同一污点数据进行了指定的操作,则确定该待检测程序代码中存在线程间释放后重用漏洞,从而结合静态代码分析技术以及预设的污点数据规则,实现了线程间释放后重用漏洞的检测。
[0039] 下面结合图1提供的应用场景,对本申请实施例提供的代码漏洞检测方案进行说明。
[0040] 如图1所示,包括客户端101、服务器设备102。其中,客户端101可向服务器设备102发送待检测程序代码文件和预设污点数据规则,该待检测程序代码文件中存储了待检测程序代码,服务器设备102接收客户端101发送的待检测程序代码文件;从待检测程序代码文件中获取待检测程序代码以及预设污点数据规则,该预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据;提取待检测程序代码中的线程;针对提取的每个线程,生成该线程的数据流图;根据获取的污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;将提取的各个线程的代码中的污点数据保存至污点数据集合;判断提取的各个线程中是否包括多个线程对该污点数据集合中的同一污点数据进行了指定操作;若是,确定待检测程序代码中存在线程间释放后重用漏洞。服务器设备102将待检测程序代码中存在线程间释放后重用漏洞的结果反馈给客户端101。其中,预设污点数据规则也可存储在服务器102中,这里不做限定。图1中,客户端101与服务器设备102可以通过局域网、广域网或移动互联网等通信网络进行通信。客户端101和服务器设备102可以为便携设备(例如:手机、平板、笔记本电脑等),也可以为个人电脑(PC,Personal Computer)。
[0041] 作为另一种应用场景,图1中的客户端和服务器设备可以为同一台计算设备,即本申请实施例提供的代码漏洞检测方法运行于单台计算设备中,该计算设备可以为便携设备(例如:手机、平板、笔记本电脑等),也可以为个人电脑等具有计算能的设备。
[0042] 需要注意的是,上文涉及的应用场景仅是为了便于理解本申请的精神和原理而示出,本申请实施例在此方面不受任何限制。相反,本申请实施例可以应用于适用的任何场景。
[0043] 下面结合图2,对本申请实施例提供的代码漏洞检测方法进行说明。
[0044] 如图2所示,本申请实施例提供的代码漏洞检测方法,可以包括以下步骤:
[0045] 步骤201,获取待检测程序代码以及预设污点数据规则,该预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据。
[0046] 具体实施时,预先设置针对释放后重用漏洞的污点数据规则,该污点数据规则污点数据规则根据释放后重用漏洞的特性设置,用于确定线程的代码中的污点数据,以便对释放后重用漏洞进行检测。预设污点数据规则可以为:判定线程的代码中已释放的数据以及引用该已释放的数据的共享数据的为污点数据。比如:线程中已释放的数据为内存指针A,而该线程的代码中还包括语句B=A,其中,B为共享数据,此时,由于该语句引用了A,则认为B也为污点数据。
[0047] 待检测程序代码可以为指定的需要进行代码漏洞检测的代码块,比如,待检测程序代码为单个进程对应的代码。该待检测程序代码可以为源代码也可以为中间语言,若该待检测程序代码为源代码则将该源代码转换为相应的中间语言,以简化程序代码中变量之间的依赖性关系。比如:若待检测程序代码的源代码为利用C语言或C++语言编辑的代码,则可利用LLVM编译器项目将该源代码转换为LLVM IR(Intermediate Representation,中间语言),这种中间语言中的每个变量只会被赋值一次,这样可以简化变量之间的依赖关系。
[0048] 步骤202,提取待检测程序代码中的线程。
[0049] 具体实施时,可提取待检测程序代码中每个线程的标识,通过线程的标识提取该待检测程序代码中各个线程,进而从提取的线程中获取各个线程的代码。其中,线程的标识与线程一一对应,线程的标识可以为预先给线程设置的序列号,可选地,线程的标识为线程的入口函数或者创建该线程的语句,这里不做限定。本申请实施例中所涉及的所有线程的标识均为线程的入口函数,或者,均为创建线程的语句,或者,均为预先为线程设置的序列号。
[0050] 步骤203,针对提取的每个线程,生成该线程的数据流图。
[0051] 具体实施时,生成提取的每个线程的数据流程图,可根据线程的代码生成相应线程的数据流图。
[0052] 步骤204,根据预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据。
[0053] 在确定各个线程的数据流图后,本步骤针对每个线程,利用预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据,从而得到提取的各个线程的代码中的污点数据。更具体的,根据预设污点数据规则,确定线程的数据流图中的污点数据,将确定出的污点数据作为该线程的代码中的污点数据。
[0054] 步骤205,将提取的各个线程的代码中的污点数据保存至污点数据集合。
[0055] 具体实施时,可对各个线程的代码中的污点数据进行筛选后保存至污点数据集合,更具体的,可将多个线程的代码中共同存在的污点数据进行去重处理后,保存至污点数据集合,比如,针对线程1和线程2的代码中共同存在的污点数据A,令污点数据集合中仅包括一个污点数据A即可,无需在污点数据集合中保存多个污点数据A。或者,也可将各个线程的代码中的污点数据不经筛选,直接保存至污点数据集合,再或者,根据实际需求从各个线程的代码中的污点数据中随机选取一定数量的污点数据保存至污点数据集合,这里不做限定。
[0056] 步骤206,判断提取的各个线程中是否包括多个线程对污点数据集合中的同一污点数据进行了指定操作。
[0057] 具体实施时,在确定提取的各个线程中包括多个线程对污点数据集合中的同一污点数据进行了指定操作的情况下,执行步骤207。其中,指定操作包括修改操作、赋值操作、读操作以及写操作等,这里不做限定。
[0058] 步骤207,确定待检测程序代码中存在线程间释放后重用漏洞。
[0059] 针对污点数据集合中的每个污点数据,若确定待检测程序代码中包括多个线程对该污点数据进行了指定操作,则确定该待检测程序代码中存在线程间释放后重用漏洞。
[0060] 具体实施时,针对污点数据集合中的每个污点数据,确定该污点数据所属的线程,若该污点数据在多个线程的代码中出现,则进一步确定出现该污点数据的多个线程中是否存在至少两个线程对该污点数据进行指定操作,如果是,则确定待检测程序代码存在线程间释放后重用漏洞。比如:污点数据A在线程1的代码和线程2的代码中均出现,则若线程1和线程2均对该污点数据A进行指定操作,则确定线程1和线程2之间存在释放后重用漏洞。
[0061] 本申请实施例提供的代码漏洞检测方法,生成待检测程序代码中每个线程的数据流图,并根据该数据流图和预先设定的污点数据规则,确定相应线程中针对释放后重用漏洞的污点数据以及将待检测程度代码的各个线程中的污点数据保存至污点数据集合,若待检测程序代码中包括多个线程对污点数据集合中的同一污点数据进行了指定的操作,则确定该待检测程序代码中存在线程间释放后重用漏洞,从而结合静态代码分析技术以及预设的污点数据规则,实现了线程间释放后重用漏洞的检测。
[0062] 作为一种可能的实施方式,可按照图3提供的内容,确定该线程的代码中的污点数据:
[0063] 步骤301,将该线程的代码中已释放的数据确定为源污点数据。
[0064] 具体实施时,预设污点数据规则中,确定线程的代码中已释放的数据为源污点数据,该源污点数据具体为该线程的代码中已释放的数据。
[0065] 步骤302,遍历该线程的代码中将所述源污点数据传递给线程间共享数据的语句,并将遍历到的语句作为污点陷入点。
[0066] 具体实施时,遍历线程的代码,若代码中包括将源污点数据传递给线程间共享数据的语句,则将该语句作为污点陷入点。进一步地,针对被传递源污点数据的线程间共享数据,若该线程的代码中包括将该线程间共享数据传递给其它线程间共享数据的语句,则也可将该语句作为污点陷入点。
[0067] 步骤303,判断该线程的数据流图中是否包括从源污点数据到污点陷入点的数据流,若是,执行步骤304,否则,执行步骤305。
[0068] 步骤304,确定该源污点数据以及该线程间共享数据为该线程的代码中的污点数据。
[0069] 步骤305,确定该源污点数据以及该线程间共享数据为该线程的代码中的非污点数据。
[0070] 具体实施时,在该线程的数据流图中包括从源污点数据到污点陷入点的数据流的情况下,说明在该线程的代码中对该污点数据进行了传播,此时可记录从源污点数据到污点陷入点的数据流对应的传播路径并将该传播路径保存至漏洞报告文本文件中,以便相关技术人员查阅产生线程间释放后重用漏洞的路径,从而对程序代码进行维护。其中,相关技术人员可通过查阅漏洞报告文件中产生释放后重用漏洞的路径检查程序代码,以进一步确定漏洞报告文件中的线程间释放后重用漏洞是否为误报漏洞,从而可在一定程度上避免利用本发明实施例确定的代码漏洞中存在的将非线程间重用漏洞确定为线程间重用漏洞的问题。
[0071] 本步骤中,在该线程的数据流图中不包括从该源污点数据到污点陷入点的数据流时,则将该线程的源污点数据以及污点陷入点中的线程间共享数据丢弃,不作为该线程的污点数据。
[0072] 这种可能的实施方式中,将代码中已释放的数据作为源污点数据,将对源污点数据进行线程间传递的语句作为污点陷入点,在数据流图中包括从源污点数据到污点陷入点的数据流的情况下,确定线程的代码中的污点数据,从而可以保证确定出的污点数据多为线程间的污点数据,进而便于确定线程间释放后重用漏洞。
[0073] 在步骤205中简单介绍了将各个线程的代码中的污点数据保存至污点数据集合的实现方式。作为本申请实施例中的一种可能的实施方式,可按照图4提供的内容,将各个线程的代码中的污点数据保存至污点数据集合:
[0074] 步骤401,确定各个线程的代码中未设置互斥机制的污点数据。
[0075] 目前,在多线程并行运行的情况下,为了防止多个线程同时访问同一共享数据的情况,通常会针对各个共享数据设置互斥机制,但是,在技术人员编程过程中,难免会出现遗漏设置互斥机制的情况,此时,多个线程之间就会存在竞争条件。本步骤中,遍历各个线程的代码中的各个污点数据,并确定其中未设置互斥机制的污点数据,此时,若多个线程需要访问该污点数据的情况下,多个线程间会存在竞争条件。
[0076] 步骤402,将各个线程的代码中互不重复的未设置互斥机制的污点数据保存至污点数据集合。
[0077] 本步骤中,互不重复的未设置互斥机制的污点数据为线程间互不重复的未设置互斥机制的污点数据,比如,线程1和线程2的代码中共同存在的未设置互斥机制的污点数据A,此时,污点数据集合中仅出现一次A即可,无需在污点数据集合中保存两个污点数据A。
[0078] 单个线程的代码中可能存在该线程内共享数据,而互斥机制是针对多个线程设置的,因此利用这种可能的实施方式,可将线程间的共享数据保存至污点数据集合,以便于确定线程间释放后重用漏洞。此外,多个线程对未设置互斥机制的共享数据进行访问时,出现线程间释放后重用漏洞的可能性很大,因此,这种可能的实施方式将未设置互斥机制的共享数据保存至共享数据集合。
[0079] 可选地,按照图5提供的内容,生成该线程的数据流图:
[0080] 步骤501,将该线程的入口函数作为起始函数,生成该线程的函数调用图。
[0081] 具体实施时,可基于函数指针名的匹配、函数指针数据分析等方式,生成线程的函数调用图。其中,也可将线程的主函数作为起始函数,这里不做限定。
[0082] 步骤502,根据该函数调用图,生成该线程的函数间控制流图。
[0083] 具体实施时,分析该线程的函数调用图中每个函数内的代码执行过程,从而得到该线程的控制流转移情况,进而得到该线程的函数间控制流图(也可称为过程间控制流图)。比如,分析并记录if-else条件判定语句、go跳转语句、以及循环语句等对应的代码块的代码执行过程,该代码执行过程即为代码块之间的控制流,再比如,分析并记录函数内不同代码块的控制流,以及该函数调用其它函数的控制流。
[0084] 步骤503,根据该函数间控制流图,生成该线程的函数间数据流图。
[0085] 具体实施时,基于该线程的函数间控制流图,对于线程的代码在不同路径上的执行过程中,数据的赋值和存储、内存的读和写过程进行分析、记录,从而得到该线程的函数间数据流图。
[0086] 利用这种可能的实施方式可得到各个线程的函数间数据流图,为确定线程间释放后重用漏洞提供前提。
[0087] 作为一种可能的实施方式,本申请实施例中所涉及的污点数据可以为已释放的内存的指针,则判断提取的各个线程中是否包括多个线程对污点数据集合中的同一污点数据进行了指定操作,具体包括:
[0088] 获取从待检测程序代码提取的各个线程中,利用该已释放的内存的指针对该已释放的内存进行了读或写操作的线程,作为该已释放的内存的指针的操作线程;判断是否存在多个该已释放的内存的指针的操作线程。
[0089] 具体实施时,线程的代码中会涉及对内存进行释放的过程,此时,已释放的内存的指针即为污点数据,从待检测程序代码中提取的各个线程中获取利用该已释放的内存的指针对该已释放的内存进行了读或写操作的线程,则将获取的线程作为该已释放的内存的指针的操作线程;若该已释放的内存的指针的操作线程包括多个,则确定待检测程序代码中存在线程间释放后重用漏洞。
[0090] 作为一种可能的实施方式,可采用以下方式判定任一线程是否对污点数据进行指定操作:从该线程的代码中查找是否包括对该污点数据进行指定操作的语句,若是,确定该线程对该污点数据进行指定操作;否则,确定该线程未对该污点数据进行指定操作。
[0091] 作为一种可能的实施方式,若提取的各个线程中不包括多个线程对污点数据集合中的同一污点数据进行了指定操作,则进一步判断提取的各个线程中是否仅包括一个线程对污点数据集合中的同一污点数据进行了指定操作,若是,则确定待检测程序代码中存在线程内释放后重用漏洞。具体为对该污点数据进行指定定操作的该线程内存在释放后重用漏洞。比如,污点数据为已释放的内存的指针,则在确定待检测程序代码中仅包括一个线程利用该已释放的内存的指针对该已释放的内存进行读或写操作时,确定该线程内存在释放后重用漏洞。
[0092] 下面结合图6对本申请实施例提供的代码漏洞检测方法的实施过程进行详细介绍。
[0093] 如图6所示,本申请实施例提供的代码漏洞检测方法可以包括:
[0094] 步骤601,获取待检测程序代码以及预设污点数据规则。
[0095] 具体实施时,相关技术人员可通过代码载入界面载入待检测程序代码,本申请实施例的执行主体接收载入的待检测程序代码。本申请实施例提供的代码漏洞检测的产品主要面向程序开发、测试等技术人员,因此不需过于复杂的界面载入待检测程序代码,实际应用中可采用命令行形式,载入待检测程序代码,比如在命令行中输入待检测程序代码的访问路径和起始函数的名称即可,该起始函数一般为该待检测程序代码的主函数。其中,可调用LINUX系统的命令行,在该命令行中输入相应的路径和函数名称。
[0096] 步骤602,提取待检测程序代码中的线程。
[0097] 步骤603,针对提取的每个线程,将该线程的入口函数作为起始函数,生成该线程的函数调用图。
[0098] 步骤604,根据所述函数调用图,生成该线程的函数间控制流图。
[0099] 步骤605,根据所述函数间控制流图,生成该线程的函数间数据流图。
[0100] 步骤606,提取该线程的代码中已释放的内存的指针。
[0101] 提取的已释放的内存的指针为源污点数据。
[0102] 步骤607,遍历该线程的代码中将该已释放的内存的指针传递给线程间共享变量的语句,并将该语句作为污点陷入点。
[0103] 其中,线程间共享变量为线程间共享数据。
[0104] 步骤608,判断该线程的数据流图中是否包括从已释放的内存的指针到污点陷入点的数据流,若是,执行步骤609,否则,执行步骤618。
[0105] 步骤609,将已释放的内存的指针以及上述线程间共享变量确定为该线程的代码中的污点数据。
[0106] 实际应用中,源污点数据为已释放的内存的指针,则认为上述线程间共享变量的实质也为指针。
[0107] 步骤610,提取各个线程的代码中未设置互斥机制的污点数据。
[0108] 步骤611,将各个线程的代码中互不重复且未设置互斥机制的污点数据保存至污点数据集合。
[0109] 步骤612,获取各个线程中利用污点数据集合中当前顺序的污点数据对应的内存进行了读或写操作的线程,作为当前污点数据的操作线程。
[0110] 其中,按照污点数据在污点数据集合中的位置由前到后的顺序,从位于第一位置的污点数据开始,依次将污点数据集合中的各个污点数据作为当前污点数据。
[0111] 步骤613,判断当前顺序的污点数据的操作线程是否包括多个,若是,执行步骤614,否则,执行步骤615。
[0112] 步骤614,确定待检测程序代码中存在线程间释放后重用漏洞。
[0113] 具体实施时,确定出待检测程序代码中存在线程间释放后重用漏洞后,将触发该线程间释放后重用漏洞时待检测程序代码的执行路径记录在漏洞报告文本文件中,以便相关技术人员对线程间释放后重用漏洞进行分析处理。
[0114] 步骤615,判断当前顺序的污点数据的操作线程是否仅包括一个,若是,执行步骤616,否则,执行步骤617。
[0115] 步骤616,确定待检测程序代码中存在线程内释放后重用漏洞。
[0116] 步骤617,将污点数据集合中下一顺序的污点数据作为当前顺序的污点数据,并转入步骤612。
[0117] 步骤618,丢弃该已释放的内存的指针以及该共享变量。
[0118] 实际应用中,本申请实施例提供的代码漏洞检测方法可嵌入或独立形成相应的静态代码分析工具,得出最终的漏洞报告文本文件,如图7所示为本申请实施例提供的利用静态分析工具进行代码漏洞确定的示意图,将待检测程序代码载入该静态代码分析工具,经过该静态代码分析工具的漏洞分析后,得到最终的漏洞报告文本文件。
[0119] 下面结合图8对本申请实施例提供的代码漏洞检测装置进行说明。
[0120] 如图8所示,为本申请实施例提供的代码漏洞检测装置结构示意图,包括:
[0121] 获取模块801,用于获取待检测程序代码以及预设污点数据规则,预设污点数据规则用于识别线程的代码中针对释放后重用漏洞的污点数据;
[0122] 提取模块802,用于提取待检测程序代码中的线程;
[0123] 生成模块803,用于针对提取的每个线程,生成该线程的数据流图;
[0124] 第一确定模块804,用于根据预设污点数据规则以及该线程的数据流图,确定该线程的代码中的污点数据;
[0125] 保存模块805,用于将提取的各个线程的代码中的污点数据保存至污点数据集合;
[0126] 判断模块806,用于判断提取的各个线程中是否包括多个线程对污点数据集合中的同一污点数据进行了指定操作;
[0127] 第二确定模块807,用于在判断模块806判断是的情况下,确定待检测程序代码中存在线程间释放后重用漏洞。
[0128] 作为一种可能的实施方式,第一确定模块804,具体包括:
[0129] 第一确定单元8041,用于将该线程的代码中已释放的数据确定为源污点数据;
[0130] 遍历单元8042,用于遍历该线程的代码中将源污点数据传递给线程间共享数据的语句,并将遍历到的语句作为污点陷入点;
[0131] 判断单元8043,用于判断该线程的数据流图中是否包括从源污点数据到污点陷入点的数据流;
[0132] 第二确定单元8044,用于在判断单元8043判断是的情况下,确定源污点数据以及线程间共享数据为该线程的代码中的污点数据。
[0133] 作为一种可能的实施方式,保存模块805,具体包括:
[0134] 提取单元8051,用于提取各个线程的代码中未设置互斥机制的污点数据;
[0135] 保存单元8052,用于将各个线程的代码中互不重复且未设置互斥机制的污点数据保存至污点数据集合。
[0136] 作为一种可能的实施方式,生成模块803,具体包括:
[0137] 第一生成单元8031,用于将该线程的入口函数作为起始函数,生成该线程的函数调用图;
[0138] 第二生成单元8032,用于根据函数调用图,生成该线程的函数间控制流图;
[0139] 第三生成单元8033,用于根据函数间控制流图,生成该线程的函数间数据流图。
[0140] 作为一种可能的实施方式,污点数据为已释放的内存的指针,则判断模块806,具体用于:
[0141] 获取从待检测程序代码提取的各个线程中,利用该已释放的内存的指针对该已释放的内存进行了读或写操作的线程,作为该已释放的内存的指针的操作线程;判断是否存在多个该已释放的内存的指针的操作线程。
[0142] 作为一种可能的实施方式,本申请实施例提供的代码漏洞检测装置,还包括:
[0143] 第三确定模块808,用于若待检测程序代码中仅包括一个线程对该污点数据进行指定操作,则确定待检测程序代码中存在线程内释放后重用漏洞。
[0144] 介绍了本申请实施例提供的代码漏洞检测方法和装置之后,下面介绍本申请实施例提供的非易失性计算机存储介质。
[0145] 本申请实施例提供一种非易失性计算机存储介质,所述计算机存储介质存储有可执行程序,该可执行程序被处理器执行实现上述实施例提供的任一代码漏洞检测方法的步骤。
[0146] 介绍了本申请实施例提供的代码漏洞检测方法、装置以及介质之后,下面介绍本申请实施例提供的计算机设备。
[0147] 本申请实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上的计算机程序,所述处理器执行所述程序时实现上述实施例中的任一代码漏洞检测方法的步骤。
[0148] 本申请实施例还提供一种计算机设备,用于执行上述实施例中的代码漏洞检测方法,如图9所示,为本申请实施中所述的计算机设备的硬件结构示意图,该计算机设备具体可以为台式计算机、便携式计算机、智能手机、平板电脑等。具体地,该计算机设备可以包括存储器901、处理器902及存储在存储器上的计算机程序,所述处理器执行所述程序时实现上述实施例中的任一代码漏洞检测方法的步骤。其中,存储器901可以包括只读存储器(ROM)和随机存取存储器(RAM),并向处理器902提供存储器901中存储的程序指令和数据。
[0149] 进一步地,本申请实施例中所述的计算机设备还可以包括输入装置903以及输出装置904等。输入装置903可以包括键盘鼠标触摸屏等;输出装置904可以包括显示设备,如液晶显示器(Liquid Crystal Display,LCD)、阴极射线管(Cathode Ray Tube,CRT),触摸屏等。存储器901,处理器902、输入装置903和输出装置904可以通过总线或者其他方式连接,图9中以通过总线连接为例。
[0150] 处理器902调用存储器901存储的程序指令并按照获得的程序指令执行上述实施例提供的代码漏洞检测方法。
[0151] 本申请实施例提供的代码漏洞检测方法、装置、介质及设备,具有以下有益效果:生成待检测程序代码中每个线程的数据流图,并根据该数据流图和预先设定的污点数据规则,确定相应线程中针对释放后重用漏洞的污点数据以及将待检测程度代码的各个线程中的污点数据保存至污点数据集合,若待检测程序代码中包括多个线程对污点数据集合中的同一污点数据进行了指定的操作,则确定该待检测程序代码中存在线程间释放后重用漏洞,从而结合静态代码分析技术以及预设的污点数据规则,实现了线程间释放后重用漏洞的检测。
[0152] 应当注意,尽管在上文详细描述中提及了代码漏洞检测装置的若干模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多模块的特征和功能可以在一个模块中具体化。反之,上文描述的一个模块的特征和功能可以进一步划分为由多个模块来具体化。
[0153] 本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0154] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0155] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0156] 尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
[0157] 显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈