CN115033882A - 补丁程序的风险确定方法及装置、存储介质、电子设备 - Google Patents

补丁程序的风险确定方法及装置、存储介质、电子设备 Download PDF

Info

Publication number
CN115033882A
CN115033882A CN202110245317.1A CN202110245317A CN115033882A CN 115033882 A CN115033882 A CN 115033882A CN 202110245317 A CN202110245317 A CN 202110245317A CN 115033882 A CN115033882 A CN 115033882A
Authority
CN
China
Prior art keywords
code
patch
variable
risk
constraint condition
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202110245317.1A
Other languages
English (en)
Inventor
彭婧
郑兴
郭晶
范宇河
唐文韬
申军利
刘羽
甘祥
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202110245317.1A priority Critical patent/CN115033882A/zh
Publication of CN115033882A publication Critical patent/CN115033882A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本公开提供一种补丁程序的风险确定方法及装置、计算机可读存储介质、电子设备;涉及计算机安全技术领域。补丁程序的风险确定方法包括:获取补丁代码中的代码操作所针对的变量;在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码;根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件;获取所述补丁代码中的代码操作对应的预设约束条件;利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。本公开能够实现补丁的风险的自动化分析,提高补丁风险分析的效率和分析的准确性。

Description

补丁程序的风险确定方法及装置、存储介质、电子设备
技术领域
本公开涉及计算机安全技术领域,具体而言,涉及补丁程序的风险确定方法、补丁程序的风险确定装置、计算机可读存储介质以及电子设备。
背景技术
补丁是指对于已发布的软件,在使用过程中暴露的问题而发布的修补漏洞的小程序。在实际场景中,对于已发布的软件往往会生成很多相应的补丁,但是频繁的安装补丁会占用大量的资源。鉴于资源的有限,可以对补丁的风险进行一定的分析,从而按照一定的优先级顺序来选择进行漏洞修复的补丁,如优先选择明显的安全漏洞对应的补丁。
然而,对于如人工分析补丁的源代码评估其风险的方法,由于人工分析时需要进行大量的工作,因此容易出错,进而导致分析结果不够准确,且人工分析的效率低下;此外,在部分技术中,可以通过对补丁中添加的注释或概述进行语义分析,根据语义分析的结果确定各补丁的风险,但是由于大多数软件的补丁格式不一定规范、补丁的来源不一定可靠,且由于语义识别的结果不一定准确,进而导致最终确定的补丁的风险结果不够准确。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开实施例的目的在于提供一种补丁程序的风险确定方法、补丁程序的风险确定装置、计算机可读存储介质以及电子设备,进而能够更加准确的确定各补丁程序的风险。
根据本公开的一个方面,提供一种补丁程序的风险确定方法,包括:
获取补丁代码中的代码操作所针对的变量;在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码;根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件;获取所述补丁代码中的代码操作对应的预设约束条件;利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。
根据本公开的一个方面,提供一种补丁程序的风险确定装置,包括:
变量获取模块,被配置为获取补丁代码中的代码操作所针对的变量;风险代码确定模块,被配置为在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码;目标约束条件获取模块,被配置为根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件;预设约束条件获取模块,被配置为获取所述补丁代码中的代码操作对应的预设约束条件;风险分析模块,被配置为利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。
在本公开的一种示例性实施例中,所述变量获取模块通过下述方法获取补丁代码中的代码操作所针对的变量:
生成添加了原始补丁代码的源代码的第一中间语言代码;
生成未添加所述原始补丁代码的源代码的第二中间语言代码;
根据所述第一中间语言代码和所述第二中间语言代码之间的差异,确定所述原始补丁代码对应的中间语言代码;
在所述原始补丁代码对应的中间语言代码中,获取补丁代码中的代码操作所针对的变量。
在本公开的一种示例性实施例中,所述变量获取模块通过下述方法获取补丁代码中的代码操作所针对的变量:
获取所述补丁代码中的安全加固型操作代码所针对的变量;
所述获取所述补丁代码中的安全加固型操作代码所针对的变量,包括:
根据至少一种安全加固型操作代码对应的安全加固规则,获取补丁代码中的安全加固型操作代码所针对的变量;
所述至少一种安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码、权限检查操作代码中的一个或多个。
在本公开的一种示例性实施例中,所述变量获取模块通过下述方法获取补丁代码中的安全加固型操作代码所针对的变量:
在所述安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码中的一个或多个时,获取各所述安全加固型操作代码所涉及的各变量;
在所述安全加固型操作代码包括权限检查操作代码时,获取所述权限检查操作代码中的权限函数所针对的各非固定参数变量。
在本公开的一种示例性实施例中,所述风险代码确定模块通过下述方法在所述代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码:
在所述安全加固型操作代码包括边界检查操作代码时,在所述补丁代码对应的待修复代码中,确定使用所述变量作为访问下标进行内存访问的代码操作和使用所述变量作为读取函数或写入函数的输入参数的代码操作为风险操作代码;
在所述安全加固型操作代码为指针置空操作代码时,在所述补丁代码对应的待修复代码中,确定针对所述变量的指针取消引用的代码操作为风险操作代码;
在所述安全加固型操作代码为初始化操作代码时,在所述变量中确定出在所述补丁代码对应的待修复代码中未被初始化的变量,在所述补丁代码对应的待修复代码中,确定针对所述未被初始化的变量进行的代码操作为风险操作代码;
在所述安全加固型操作代码为权限检查操作代码时,针对权限检查操作代码中的权限函数所针对的非固定参数变量,在所述补丁代码对应的待修复代码中,确定采用预设结构类型的所述非固定参数变量所涉及的代码操作为风险操作代码。
在本公开的一种示例性实施例中,所述目标约束条件获取模块通过下述方法根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件:
针对每种安全加固型操作代码所针对的每个变量执行下述过程:
根据所述安全加固型操作代码、所述安全加固型操作代码所针对的变量和所述变量所对应的所述风险操作代码,生成所述变量对应的第一代码切片集合;
根据所述第一代码切片集合,确定出针对所述变量的目标约束条件。
在本公开的一种示例性实施例中,所述目标约束条件获取模块包括第一目标约束条件获取单元和第二目标约束条件获取单元,其中:
所述第一目标约束条件获取单元用于获取所述第一代码切片集合中的安全加固型操作代码针对所述变量所引入的约束条件,以得到针对所述变量的第一目标约束条件;
所述第二目标约束条件获取单元用于在所述补丁代码对应的待修复代码中,获取所述第一代码切片集合中的所述安全加固型操作代码所针对的变量和所述风险操作代码所针对的变量之间的变量转换路径,以得到针对所述变量的第二目标约束条件。
在本公开的一种示例性实施例中,所述风险分析模块通过下述方法生成所述变量的约束条件集:
针对每种安全加固型操作代码所针对的每个变量,合并所述第一目标约束条件、所述第二目标约束条件和所述预设约束条件,以生成所述变量的第一约束条件集。
在本公开的一种示例性实施例中,所述风险分析模块通过下述方法根据所述约束条件集的求解结果分析所述补丁代码的风险:
在至少一种安全加固型操作代码作所针对的至少一个变量的所述第一约束条件集无解时,确定所述补丁代码的风险等级为第一级风险;
在各安全加固型操作代码所针对的各变量的所述第一约束条件集均有解时,确定所述补丁代码的风险等级为第二级风险;
其中,所述第一级风险高于所述第二级风险。
在本公开的一种示例性实施例中,所述装置还包括第二约束条件集生成模块,所述第二约束条件集生成模块用于:
针对所述每种安全加固型操作代码所针对的变量,合并所述第一约束条件的反约束条件、所述预设约束条件的反约束条件和所述第二目标约束条件,以生成所述变量的第二约束条件集。
在本公开的一种示例性实施例中,所述风险分析模块通过下述方法根据所述约束条件集的求解结果分析所述补丁代码的风险:
针对每种安全加固型操作代码所针对的每个变量,根据所述变量对应的第一代码切片集合中的安全加固型操作代码所针对的变量和所述变量对应的所述风险操作代码,生成所述变量对应的第二代码切片集合;
基于相同的安全加固型操作代码所针对的变量和所述变量对应的风险操作代码,将各所述变量对应的各所述第一代码切片集合和各所述第二代码切片集合进行匹配;
根据各所述第一代码切片集合和各所述第二代码切片集合之间的匹配关系,将各所述变量的各所述第一约束条件集和各所述变量的各所述第二约束条件集进行匹配,以生成各所述变量对应的各约束条件集对;
在至少一种安全加固型操作代码所针对的至少一个变量的所述约束条件集对中的第一约束条件集和第二约束条件集均无解时,确定所述补丁代码的风险等级为第一级风险;
在各安全加固型操作代码所针对的各所述变量对应的各约束条件集对中的至少一个约束条件集均有解时,确定所述补丁代码的风险等级为第二级风险;
其中,所述第一级风险高于所述第二级风险。
在本公开的一种示例性实施例中,所述预设约束条件包括预设的导致所述安全加固型操作代码所针对的安全问题出现的求解条件。
根据本公开的一个方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述所述的补丁程序的风险确定方法。
根据本公开的一个方面,提供一种电子设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述所述的补丁程序的风险确定方法。
根据本公开的一个方面,提供一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述的补丁程序的风险确定方法。
本公开示例性实施例可以具有以下部分或全部有益效果:
在本公开示例性实施例所提供的补丁程序的风险确定方法中,一方面,基于获取的补丁代码中的相关变量能够通过符号执行的方法自动的分析出补丁代码的风险,相比于人工分析源代码而言更加高效准确;另一方面,相比于基于补丁代码中的语义自动分析补丁代码的风险,本公开示例性实施例中,则是将补丁的风险确定问题建模为约束条件求解的问题,进而根据约束条件的求解结果对补丁代码的风险进行分析,这样,可以通过严格的约束条件提高补丁代码的风险确定的准确性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示意性示出了根据本公开的一个实施例的补丁程序的风险确定方法的流程图;
图2示意性示出了根据本公开的一个实施例的获取补丁代码中的安全加固代码操作所针对的变量的方法的流程示意图;
图3示意性示出了根据本公开的一个实施例的获取目标约束条件的方法的流程示意图;
图4示意性示出了根据本公开的一个实施例的分析补丁代码的风险的方法的流程示意图;
图5示意性示出了根据本公开的一个实施例的生成第二约束条件集的方法的流程示意图;
图6示意性示出了根据本公开的一个实施例的确定约束条件集对的方法的流程示意图;
图7示意性示出了根据本公开的一个实施例的根据约束条件集对的求解结果分析补丁代码的风险的方法的流程示意图;
图8示出本公开一示例性实施例中的另一种补丁程序的风险确定方法的流程示意图;
图9示出了可以应用本公开实施例的一种补丁的风险确定方法及装置的补丁管理系统的框图;
图10示出本公开一示例性实施例中的补丁下发管理系统的框图;
图11示意性示出了根据本公开的一个实施例的补丁程序的风险确定装置的框图;
图12示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知技术方案以避免喧宾夺主而使得本公开的各方面变得模糊。
此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
补丁是指对于已发布的软件,在使用过程中暴露的问题而发布的修补漏洞的小程序。就像衣服烂了就要打补丁一样,人编写的计算机程序也不可能十全十美,所以软件避免不了的会出现漏洞,当软件出现漏洞时,可以用打补丁的方式对漏洞进行修复。在实际中,几乎每天都会有新的软件漏洞不断地被发现,随之软件开发者会生成对应的补丁以期修复出现的漏洞,但是频繁的按照补丁会占用大量的内存资源。
鉴于内存资源的有限,可以对补丁进行一定的分析,从而按照一定的优先级顺序来选择优先下发的补丁。
相关技术中,运维人员可以基于经验人工评估补丁的影响,但这不仅费时费力、效率低下,而且容易出错。与此同时,这种人工评估的方式,要求运维人员具有广泛的计算机程序安全领域的知识,评估的准确性取决于进行评估的运维人员的能力。
此外,在部分技术中,还可以通过对补丁中添加的注释或概述进行语义分析的方式,根据语义分析的结果自动确定出各补丁的风险,但是由于大多数软件的补丁格式不一定规范、补丁的来源不一定可靠,且由于语义识别的结果不一定准确,进而导致最终确定的补丁的风险结果不够准确。
基于上述的一个或多个问题,本示例性实施例首先提供了一种补丁程序的风险确定方法。参考图1,图1示意性示出了根据本公开的一个实施例的补丁程序的风险确定方法的流程图,该补丁程序的风险确定方法可以包括以下步骤:
步骤S110,获取补丁代码中的代码操作所针对的变量;
步骤S120,在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码;
步骤S130,根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件;
步骤S140,获取所述补丁代码中的代码操作对应的预设约束条件;
步骤S150,利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。
在本示例性实施例所提供的补丁程序的风险确定方法中,一方面,基于获取的补丁代码中的相关变量能够通过符号执行的方法自动的分析出补丁代码的风险,相比于人工分析源代码而言更加高效准确;另一方面,相比于基于补丁代码中的语义自动分析补丁代码的风险,本公开示例性实施例中,则是将补丁的风险确定问题建模为约束条件求解的问题,进而根据约束条件的求解结果对补丁代码的风险进行分析,这样,可以通过严格的约束条件提高补丁代码的风险确定的准确性。
此外,在下述的进一步改进方案中,还将添加了原始补丁代码的源代码和未添加原始补丁代码的源代码转换为用中间语言表示的中间语言代码,从而基于中间语言代码进行补丁程序的风险确定,提高了本示例性实施例提供的补丁程序的风险确定方法的通用性,可以对不同编程语言生成的补丁代码进行风险分析。
同时,本示例性实施例提供的补丁的风险确定方法中,安全加固型操作代码的类型可以根据分析需求进行自定义和不断的扩展,从而进一步提高了本示例性实施所提供的补丁程序的风险确定方法的灵活性和可扩展性。
下面,在另一实施例中,对上述步骤进行更加详细的说明。
在步骤S110中,获取补丁代码中的代码操作所针对的变量。
本公开中,补丁代码可以包括源代码形式的补丁代码,例如C语言形式的补丁代码、C++语言形式的补丁代码、Java语言形式的补丁代码等;也可以包括中间语言代码形式的补丁代码,例如LLVM-IR(Low Level VirtualMachine-Intermediate Representation,LLVM提供了一套适合编译器系统的中间语言,可以认为IR是LLVM的一种中间的语言表达形式,其也是一种汇编语言的表达形式)形式的补丁代码等。本示例性实施方式对此不做特殊限定。
在实际场景中,补丁代码有很多发布形式,如仅下发了源代码形式的补丁代码,此时源代码形式的补丁代码未添加到待修复的源代码中,可以通过运行源代码形式的补丁代码,生成一个添加了源代码形式的补丁代码的源代码;也有可能是已经将源代码形式的补丁代码添加到待修复的源代码中,直接下发的是添加了源代码形式的补丁代码后的源代码。
在本公开示例性的实施方式中,在下发的是源代码形式的补丁代码时,可以直接将源代码形式的补丁代码转换成对应的中间语言代码,从而在源代码形式的补丁代码的中间语言代码中,获取补丁代码中的代码操作所针对的变量。当然,也可以直接在源代码形式的补丁代码中获取补丁代码中的代码操作所针对的变量,本示例性实施方式对此不做特殊限定。
在直接下发的是添加了源代码形式的补丁代码后的源代码时,则可以根据图2所示的各个步骤获取补丁代码中的代码操作所针对的变量。示例性的,参考图2,获取补丁代码中的代码操作所针对的变量的方法可以包括步骤S210至步骤S240。其中:
在步骤S210中,生成添加了原始补丁代码的源代码的第一中间语言代码。
在示例性的实施方式中,原始补丁代码可以包括上述的源代码形式的补丁代码。第一中间语言代码可以包括添加了原始补丁代码的源代码对应的中间语言形式的代码,例如上述的LLVM-IR形式的中间语言代码。当然,也可以是其他形式的中间语言代码,本示例性实施方式对此不做特殊限定。
示例性的,可以通过LLVM IR生成器生成添加了原始补丁代码的源代码对应的中间语言代码,即第一中间语言代码。
在步骤S220中,生成未添加所述原始补丁代码的源代码的第二中间语言代码。
在示例性的实施方式中,未添加所述原始补丁代码的源代码包括待修复的源代码,即原始补丁代码所要修复的源代码。第二中间语言代码可以包括待修复的源代码对应的中间语言形式的代码,如上述的LLVM-IR形式的中间语言代码。当然,也可以是其他形式的中间语言代码,但需要说明的是,第一中间语言代码和第二中间语言代码属于同一种形式的中间语言代码。
示例性的,同样可以通过LLVM IR生成器生成未添加原始补丁代码的源代码对应的中间语言代码,即第二中间语言代码。
在步骤S230中,根据所述第一中间语言代码和所述第二中间语言代码之间的差异,确定所述原始补丁代码对应的中间语言代码。
本公开中,可以对比第一中间语言代码和第二中间语言代码,从而确定第一中间语言代码和第二中间语言代码之间的差异,进而将该差异确定为原始补丁代码对应的中间语言代码。
在步骤S240中,在所述原始补丁代码对应的中间语言代码中,获取补丁代码中的代码操作所针对的变量。
通过上述的步骤S210至步骤S240,可以在原始补丁代码对应的中间语言代码中获取补丁代码中的代码操作所针对的变量,然后基于生成的第一中间语言和第二中间语言进行后续的分析,从而使得本示例性实施例所提供的方法可以适应各种源代码形式的补丁代码的风险分析,进而提高本示例性实施例所提供的方法的通用性。
当然,在直接下发的是添加了源代码形式的补丁代码后的源代码时,也可以不生成第一中间语言代码和第二中间语言代码,而直接将添加了源代码形式的补丁代码后的源代码和未添加源代码形式的补丁代码进行对比,从而根据二者之间的差异确定出源代码形式的补丁代码,获取源代码形式的补丁代码中的代码操作所针对的变量。后续也可以直接基于对应的源代码实现后续的风险分析,本示例性实施方式对此不做特殊限定。在本公开一种实例实施方式中,补丁代码中的代码操作可以理解为补丁代码中使用安全加固型代码针对变量所进行的安全加固操作。具体的,补丁代码中的代码操作可以包括使用安全加固型代码,针对补丁代码对应的待修复代码中的一个或多个变量所进行的安全加固操作。
示例性的,获取补丁代码中的代码操作所针对的变量包括:获取补丁代码中的安全加固型操作代码所针对的变量。
本公开中,安全加固型操作代码包括任何的能解决已发布的软件存在的安全问题的代码操作。为了消除代码的安全问题,补丁会新增一些安全加固型代码以修复原来的代码。安全加固型操作代码包括但不限于安全检查类型的代码操作(如边界检查操作、权限检查操作)、指针置空类型的代码操作、初始化类型的代码操作以及锁定或解锁类型的代码操作等等。其中,安全加固型操作代码的类型可以根据需求进行自定义,本示例性实施方式对此不做特殊限定。
示例性的,获取补丁代码中的安全加固型操作代码所针对的变量可以包括:根据至少一种安全加固型操作代码对应的安全加固规则,获取补丁代码中的安全加固型操作代码所针对的变量。其中,至少一种安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码、权限检查操作代码中的一个或多个。当然,如前所述,至少一种安全加固型操作代码还可以根据需求进行自定义扩展。
举例而言,可以根据至少一种安全加固型操作代码所对应的安全加固规则,确定补丁代码中的安全加固型操作代码,然后获取安全加固型操作代码所针对的变量。
在一种示例性的实施方式中,边界检查类型的安全加固型操作代码对应的安全加固规则可以包括:操作代码使用了条件语句,例如if语句,且使用了比较指令,如大于、等于、小于、大于或等于、小于或等于指令,并且操作的数据类型为整数类型,例如int(整型变量)或unsigned int(无符号整型变量),且该条件语句对应的某个判断条件分支会导致错误处理(如返回错误代码)。换言之,当补丁代码中的某个操作代码使用了条件语句,且使用了比较指令,且操作的数据类型为整数类型,且该条件语句对应的某个判断分支会导致错误处理时,则可以确定该操作代码为边界检查类型的安全加固型操作代码。
在本公开的一种示例性实施方式中,指针置空类型的安全加固型操作代码对应的安全加固规则可以包括:将NULL分配给指针的操作。其中,NULL是在计算中具有保留的值,用于指示指针不引用有效对象。程序通常使用空指针来表示条件,例如未知长度列表的结尾或未执行某些操作。换言之,当补丁代码中的某个操作代码将NULL分配给指针时,则该操作代码为指针置空类型的安全加固型操作代码。
在本公开的一种示例性实施方式中,初始化类型的安全加固型操作代码对应的安全加固规则可以包括:为变量分配数值0的存储指令、以0作为值参数的初始化函数(如memset函数)的调用等进行代码初始化的操作。换言之,当补丁代码中的某个操作代码进行的是初始化操作时,则可以将该操作代码确定为初始化类型的安全加固型操作代码。
在本公开的一种示例性实施方式中,权限检查类型的安全加固型操作代码对应的安全加固规则可以包括:条件语句中包含权限检查函数,如ns_capable()函数、afs_permission()函数等,或条件语句的判断对象是针对权限检查函数的返回值的安全检查。换言之,当补丁代码中的某个条件语句中包含权限检查函数或某个条件语句的判断对象时针对权限检查函数的返回值的安全检查,则可以将该操作代码确定为权限检查类型的安全加固型操作代码。
示例性的,获取补丁代码中的安全加固型操作代码所针对的变量,可以包括:在安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码中的一个或多个时,获取各安全加固型操作代码所涉及的各变量;在所述安全加固型操作代码包括权限检查操作代码时,获取权限检查操作代码中的权限函数所针对的各非固定参数变量。
举例而言,在安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码中的一个或多个时,可以通过提取安全加固型操作代码所涉及的变量来获取安全加固型操作代码所针对的变量;在安全加固型操作代码包括权限检查操作代码时,可以基于权限函数获取权限检查类型的安全加固型操作代码所针对的变量,例如,基于上述的ns_capable()函数、afs_permission()函数等权限函数获取权限检查类型的安全加固型操作代码所针对的变量。具体的,在权限函数中使用的非固定参数,如文件、索引节点或对象等,可以认为是权限检查类型的安全加固型操作代码所针对的变量,SID(SecurityIdentifier,安全标识符)可以将这些参数变量标识为权限检查类型的安全加固型操作代码所针对的变量。
需要说明的是,本公开示例性实施例中,基于步骤S110中获取的补丁代码中的代码操作所针对的变量,可以利用变量本身代替输入、根据符号执行的思想实现补丁代码的风险的自动化分析,提高了补丁代码的风险的分析效率。
符号执行(symbolic execution)指的是通过程序分析的方法,确定哪些输入向量会对应导致程序的执行结果向量的方法。在计算机程序中,符号包括函数名和变量名。符号执行的本质是,不给定变量(比如入参)特定的值,而是用变量本身来替代,达到模拟输入的效果,即模拟每个路径来产生每一个执行的可能性,将执行语句的结果整合成若干条数学表达式。
获取补丁代码中的代码操作所针对的变量后,在步骤S120中,在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码。本公开中,待修复代码可以包括补丁代码所要修复的代码,即原来的存在漏洞的代码。具体的,待修复代码可以是补丁代码所要修复的源代码,也可以是补丁代码所要修复的源代码对应的中间语言代码,例如,上述的LLVM IR形式的中间语言代码。
举例而言,由于添加了补丁代码的代码中也存在补丁代码所要修复的代码,所以可以在添加了补丁代码的源代码中除去补丁代码的其它代码部分,确定出风险操作代码,也可以在添加了补丁代码的源代码对应的中间语言代码中除去补丁代码的中间语言代码的其它中间语言代码部分,确定出风险操作代码。当然,也可以直接在未添加补丁代码的源代码中,确定出风险操作代码,还可以在未添加补丁代码的源代码对应的中间语言代码中,确定出风险操作代码。本示例性实施方式对此不做特殊限定。
示例性的,步骤S120中的代码操作可以理解为:在补丁代码对应的待修复代码中,利用步骤S110中获取的变量进行的预设操作。步骤S120的具体实施方式可以是,在补丁代码对应的待修复代码中,将利用步骤S110中获取的变量进行预设操作的代码确定为风险操作代码。在本公开的一种示例性实施例中,在步骤S120中,在上述的安全加固型操作代码包括边界检查操作代码时,可以在补丁代码对应的待修复代码中,确定使用边界检查操作代码所针对的变量作为访问下标进行内存访问的代码操作和使用边界检查操作代码所针对的变量作为读取函数或写入函数的输入参数的代码操作为风险操作代码。
举例而言,在安全加固型操作代码包括边界检查操作代码时,预设操作可以包括使用边界检查操作代码所针对的变量作为访问下标进行内存访问的操作和使用边界检查操作代码所针对的变量作为读取函数或写入函数的输入参数的操作。具体的,可以在补丁代码对应的待修复代码中,确定使用边界检查操作代码所针对的变量作为访问下标访问数组或程序缓冲区的代码操作为风险操作代码,也可以在补丁代码对应的待修复代码中,确定使用边界检查操作代码所针对的变量作为读取函数或写入函数(例如memcpy()函数)的输入参数的代码操作为风险操作代码。这是因为此类操作代码可能存在越界访问的问题,所以可以将该类型的操作代码确定为风险操作代码。
在本公开的一种示例性实施例中,在步骤S120中,在安全加固型操作代码为指针置空操作代码时,在补丁代码对应的待修复代码中,确定针对指针置空操作代码所针对的变量的指针取消引用的代码操作为风险操作代码。
举例而言,在安全加固型操作代码为指针置空操作代码时,预设操作可以包括针对指针置空操作代码所针对的变量的指针取消引用的操作。具体的,在步骤S110中,例如,获取的指针置空操作代码所针对的变量为a,在补丁代码对应的待修复代码中,针对变量a的指针可能存在双重释放或者释放后使用的安全问题,所以,可以确定针对变量a的指针取消引用的代码操作为风险操作代码。
指针双重释放指的是同一个指针被连续两次或更多次释放,指针被释放时,实际是调用操作系统相关内存管理函数,释放之前申请的内存,以便其他函数(或程序)使用,如果再次释放该内存,就会产生严重的错误。
在本公开的一种示例性实施例中,在步骤S120中,在安全加固型操作代码为初始化操作代码时,在获取的初始化操作代码所针对的变量中确定出在补丁代码对应的待修复代码中未被初始化的变量,在补丁代码对应的待修复代码中,确定针对未被初始化的变量进行的代码操作为风险操作代码。
举例而言,在安全加固型操作代码为初始化操作代码时,预设操作可以包括针对上述的未被初始化的变量进行的操作。其中,针对上述的未被初始化的变量进行的操作可以包括指针取消引用操作、函数调用操作、内存访问操作以及二进制运算等操作。
例如,在步骤S110中,安全加固型操作代码包括初始化操作代码时,获取的初始化操作代码所针对的变量可以为a、b、c、d,也就是说,在补丁代码中,针对变量a、b、c、d进行了初始化操作。在确定风险操作代码时,先在补丁代码对应的待修复代码中,检查是否针对a、b、c、d进行了初始化操作,如检查到只针对变量a、b、c进行了初始化操作,而未对变量d进行初始化操作,则在补丁代码对应的待修复代码中,确定针对变量d进行的代码操作为风险操作代码。其中,针对变量d进行的代码操作可以包括具有指针取消引用操作、函数调用操作、内存访问操作以及二进制运算等功能的代码操作。换言之,如果一个变量在添加补丁代码前没有被初始化过,但是在添加了补丁代码后被初始化,那么这个变量有可能是一个有安全问题的变量,针对该变量进行的代码操作也有可能存在安全问题,因此,可以将其确定为风险操作代码。
在本公开的一种示例性实施例中,在步骤S120中,在安全加固型操作代码为权限检查操作代码时,针对权限检查操作代码中的权限函数所针对的非固定参数变量,在补丁代码对应的待修复代码中,确定采用预设结构类型的所述非固定参数变量所涉及的代码操作为风险操作代码。
本公开中,预设结构类型包括但不限于kuid_t、inode(索引节点)、文件、或相应的指针类型的结构类型中的一个或多个。
举例而言,对于获取的权限检查操作代码所针对的变量,即非固定参数变量,在补丁代码对应的待修复代码中,如果这些非固定参数变量在某些代码操作中采用了如kuid_t、inode、文件或相应的指针等结构类型,则确定这些代码操作为风险操作代码。即,在安全加固型操作代码为权限检查操作代码时,预设操作可以包括:在补丁代码对应的待修复代码中,针对权限检查操作代码中的权限函数所针对的非固定参数变量,利用预设结构类型的该非固定参数变量所涉及的操作。
需要说明的是,如果在补丁代码所要修复的源代码中确定出风险操作代码,则风险操作代码也为源代码的形式,如果在补丁代码所需要修复的源代码对应的中间语言代码中确定出风险操作代码,则风险操作代码为中间语言代码的形式。
示例性的,在步骤S120中,在补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码可以包括:在补丁代码对应的待修复代码中,确定与所述变量存在变量转换关系的目标变量;在补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出第一风险操作代码,根据针对所述目标变量的代码操作确定出第二风险操作代码;合并第一风险操作代码和第二风险操作代码,以确定出目标风险操作代码。
其中,变量转换关系可以包括变量之间的等式转换关系,目标变量可以包括与安全加固型操作代码所针对的变量存在等式转换关系的变量。例如,安全加固型操作代码所涉及的变量为a,在待修复代码中,存在代码操作“int16 b=a+5”,则可以确定变量b为与变量a存在变量转换关系的目标变量。
在补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出第一风险操作代码,和上述的在补丁代码对应的待修复代码中,确定出风险操作代码的具体实施方式完全相同,此处不再进行赘述。
在补丁代码对应的待修复代码中,根据针对所述目标变量的代码操作确定出第二风险操作代码的具体实施方式也和上述的在补丁代码对应的待修复代码中,确定出风险操作代码的相关部分的具体实施方式相同,将上述的各安全加固型操作代码所针对的变量替换为其对应的目标变量即可,此处不再进行赘述。
以“在安全加固型操作代码为边界检查操作代码时”为例,确定第二风险操作代码的具体实施方式可以是:在补丁代码对应的待修复代码中,确定使用目标变量作为访问下标进行内存访问的代码操作和使用目标变量作为读取函数或写入函数的输入参数的代码操作为第二风险操作代码。
继续参考图1,在步骤S130中,根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件。
示例性的,步骤S130的实施方式可以是:根据安全加固型操作代码和风险操作代码,获取针对所述变量的目标约束条件。
本公开中,如前所述,安全加固型操作代码可以包括多种类型,如上述的边界检查操作代码、指针置空操作代码、初始化操作代码、权限检查操作代码等,且每种安全加固型操作代码可以对应多个变量。如对变量a、b进行边界检查、对变量a、c进行初始化操作等。因此,在步骤S130中,可以针对每种安全加固型操作代码所针对的每个变量执行下述过程,以获取目标约束条件:根据安全加固型操作代码、安全加固型操作代码所针对的变量和所述变量所对应的所述风险操作代码,生成所述变量对应的第一代码切片集合;根据所述第一代码切片集合,确定出针对所述变量的目标约束条件。
举例而言,第一代码切片集合可以包括第一三元组切片集合。每个变量对应的第一三元组切片集合中包括一个或多个三元组切片,每个三元组切片可以表示为<sop,val,vop>,其中,sop表示安全加固型操作代码,val表示该安全加固型操作代码所针对的变量,vop表示该变量对应的风险操作代码。
每种安全加固型操作代码针对的每个变量,可能对应有多个风险操作代码。以边界检查操作代码为例,假设边界检查操作代码所针对的变量包括e,也就是说上述的sop为对变量e进行边界检查的操作代码,val为变量e,变量e在待修复代码中作为访问下标进行了8次内存访问,那么,这8次访问就对应有8个风险操作代码,边界检查操作代码所针对的变量e也就对应有8个三元组切片。所以说,每种安全加固型操作代码所针对的每个变量可以对应一个三元组切片集合。每个三元组切片集合中包括一个或多个三元组切片。且对于变量e而言,其对应的8个三元组切片中的各三元组切片中的sop和val相同,仅风险操作代码各不相同。
需要说明的是,相同的变量可能对应有多个第一代码切片集合,如对变量a、b进行边界检查操作、对变量a、c进行初始化操作。那么,对于变量a而言,就生成一个边界检查操作代码类型的变量a对应的第一代码切片集合和一个初始化操作代码类型的变量a对应的第一代码切片集合。
生成第一代码切片集合后,可以根据第一代码切片集合,确定出第一代码切片集合中的安全加固型操作代码所针对的变量的目标约束条件。
在本公开实施例的实施方式中,步骤S130中的各变量的目标约束条件可以包括第一目标约束条件和第二目标约束条件。示例性的,图3示意性示出了根据本公开的一个实施例的获取目标约束条件的方法的流程示意图。参考图3,获取目标约束条件的方法可以包括步骤S310至步骤S320。其中:
在步骤S310中,获取第一代码切片集合中的安全加固型操作代码针对所述变量所引入的约束条件,以得到针对所述变量的第一目标约束条件。
本公开中,针对每种安全加固型操作代码所针对的每个变量,可以根据其对应的第一切片集合,获取安全加固型操作代码针对该变量所引入的约束条件,将该约束条件作为该变量的第一目标约束条件。
以边界检查操作代码类型的安全加固型操作代码为例,当边界检查操作代码为语句“if(i>=max_edge){return ERROR;//out of bound}”时,可以获取该边界检查操作代码针对变量i引入的约束条件为“i<max_edge”,则约束条件“i<max_edge”为第一目标约束条件。
在步骤S320中,在所述补丁代码对应的待修复代码中,获取第一代码切片集合中的安全加固型操作代码所针对的变量和风险操作代码所针对的变量之间的变量转换路径,以得到针对所述变量的第二目标约束条件。
本公开中,变量转换路径可以包括安全加固型操作代码所针对的变量和其对应的风险操作代码所针对的变量之间的等式转换关系,还可以包括在补丁代码对应的待修复代码中,针对第一切片集合中的安全加固型操作代码所针对的变量或风险操作代码所针对的变量的不等式约束条件。
以边界检查操作代码类型的安全加固型操作代码对变量i进行了边界检查为例,若在补丁代码对应的待修复代码中,存在代码操作“int8 j=i+1”,也就是说变量j和i之间存在一定的转换关系,即,如前所述,变量j为与变量i存在变量转换关系的目标变量,如果在补丁代码对应的待修复代码中,某个代码操作使用变量j作为下标进行了内存访问,那么该代码操作也确定为风险操作代码。换言之,安全加固型操作代码可能对变量i进行了对应的安全加固操作,而确定出的风险操作代码所针对的变量可能是变量j,但变量i和变量j之间具有转换关系,则变量i和j之间的转换关系可以作为第二目标约束条件。
此外,如果在补丁代码对应的待修复代码中,针对安全加固型操作代码所针对的变量有不等式约束条件,例如i>100,则其也可以作为第二目标约束条件。同样的,如果在补丁代码对应待修复代码中,针对风险操作代码所针对的变量有不等式约束条件,例如j<50,则其也可以作为第二目标约束条件。
确定第一目标约束条件和第二目标约束条件后,可以合并第一目标约束条件和第二目标约束条件,从而得到目标约束条件。
通过上述的步骤S310至步骤S320,可以根据补丁代码和风险操作代码,自动的获取到针对步骤S110中所获取的变量的目标约束条件。从而可以根据获取的目标约束条件和下述的步骤S140中获取的预设约束条件,实现对补丁程序的风险的自动分析,提高补丁程序的风险分析的准确性和效率。
接下来,继续参考图1,在步骤S140中,获取所述补丁代码中的代码操作对应的预设约束条件。
在示例性的实施方式中,获取补丁代码中的代码操作对应的预设约束条件可以包括:获取安全加固型操作代码对应的预设约束条件。
本公开中,预设约束条件可以包括预设的导致安全加固型操作代码所针对的安全问题出现的求解条件。
以边界检查操作代码类型的安全加固型操作代码为例,其对应的预设约束条件可以是出现越界访问时的求解条件。示例性的,可以定义数组下标大于数组长度为边界检查操作代码类型的安全加固型操作代码所对应的约束约束条件。例如,假设确定出的风险操作代码为“arr[j]=arr[j]+1”,则可以将预设约束条件配置为“j>=len(arr)”。即数组下标大于数组长度时,就会导致越界访问类型的安全问题。
需要说明的是,预设约束条件可以根据用户的经验和需求进行自定义配置,例如,在本示例性实施例中,是将数组下标大于数组长度作为边界检查操作代码类型的安全加固型操作代码对应的预设约束条件,表明在数组下标大于数组长度时,会出现越界访问的问题,当然也可以将其他的出现越界访问的求解条件作为预设约束条件。本示例性实施方式对此不做特殊限定。
在步骤S150中,利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。
在本公开示例性的实施方式中,可以利用目标约束条件和预设约束条件生成所述变量的第一约束条件集,然后根据第一约束条件集的求解结果分析补丁代码的风险。
图4示意性示出了根据本公开的一个实施例的分析补丁代码的风险的方法的流程示意图。参考图4,该方法可以包括步骤S410至步骤S430。其中:
在步骤S410中,针对每种安全加固型操作代码所针对的每个变量,合并第一目标约束条件、第二目标约束条件和预设约束条件,以生成该变量的第一约束条件集。
在本公开示例性的实施方式中,如前所述,安全加固型操作代码可以包括多种类型,如上述的边界检查操作代码、指针置空操作代码、初始化操作代码、权限检查操作代码等,且每种安全加固型操作代码可以对应多个变量。那么,针对每种安全加固型操作代码所针对的每个变量,可以合并该变量对应的第一目标约束条件,第二目标约束条件和预设约束条件,从而生成该变量对应的第一约束条件集。
示例性的,可以根据安全加固型操作代码的类型,针对每种安全加固型操作代码所针对的每个变量,合并第一目标约束条件、第二目标约束条件和预设约束条件,以生成该变量的第一约束条件集。换言之,由于不同的安全加固型操作代码可能针对同一个变量进行了不同类型的安全加固操作,在生成第一约束条件集时,针对某个变量,需要根据相同类型的安全加固型操作代码,合并第一目标约束条件、第二目标约束条件和预设约束条件,以生成变量的第一约束条件集。也就是说,同一个变量,可能会对应多个不同的第一约束条件集。
例如,在补丁代码中对变量a、b进行边界检查操作、对变量a、c进行初始化操作。那么,在步骤S410中会对应的生成边界检查操作代码类型的变量a对应的第一约束条件集A1、边界检查操作代码类型的变量b对应的第一约束条件集B、初始化操作代码类型的变量a对应的第一约束条件集A2、初始化操作代码类型的变量c对应的第一约束条件集C。即,会生成4个第一约束条件集。其中,变量a对应有2个第一约束条件集A1和A2,A1和A2是不同的第一约束条件集。
在步骤S420中,对每种安全加固型操作代码所针对的每个变量的第一约束条件集进行求解。
本公开中,可以使用采用SMT(Satisfiability Modulo Theory,可满足性模理论)求解器Z3对每种安全加固型操作代码所针对的每个变量的第一约束条件集进行求解。当然,也可以使用其他的方式或者其他求解器对第一约束条件集进行求解,本示例性实施方式对此不做特殊限定。
在步骤S430中,根据每种安全加固型操作代码所针对的每个变量的第一约束条件集的求解结果,分析补丁代码的风险。
在示例性的实施方式中,在至少一种安全加固型操作代码所针对的至少一个变量的第一约束条件集无解时,确定补丁代码的风险等级为第一级风险;在各安全加固型操作代码所针对的各变量的所述第一约束条件集均有解时,确定所述补丁代码的风险等级为第二级风险;其中,所述第一级风险高于所述第二级风险。
继续以在补丁代码中对变量a、b进行边界检查、对变量a、c进行初始化操作为例,当上述的第一约束条件集A1、A2、B、C中至少有一个无解时,确定补丁代码的风险等级为第一级风险,当上述的第一约束条件集A1、A2、B、C都有解时,确定该补丁代码的风险等级为第二级风险。
本公开中,在至少一种安全加固型操作代码所针对的至少一个变量的第一约束条件集无解时,表明添加了补丁代码后,对于待修复代码中的至少一个变量不可能产生不安全的解,也就是说该补丁代码至少修复了一个漏洞,那这个补丁代码就是一个可以尽快发布的补丁代码,对应的其可以被确定为一个高风险的补丁代码。从而提醒运维人员可以考虑优先发布高风险的补丁代码,以尽快修复该补丁代码能够修复的漏洞。
在各安全加固型操作代码所针对的各变量的第一约束条件集均有解时,表明添加了补丁代码后,仍然会产生不安全的解,也就是说该补丁代码可能并没有解决其需要解决的漏洞,那么,该补丁代码就可以被确定为一个低风险的补丁代码。
对于低风险的补丁代码,运维人员可以对其再进行其它的验证,例如人工检查其是否确实属于低风险的补丁,从而避免本方法出现判断失误的问题。但尽管如此,本示例性实施例提供的方法已经在很大程度上降低了人工分析的成本、提高了补丁代码风险确定的效率。
在本公开的另一种示例性实施例中,还可以在各安全加固型操作代码所针对的各变量对应的各第一约束条件集中无解的个数大于第一预设阈值时,确定补丁代码的风险为第一级风险。其中,第一预设阈值大于0,其可以根据用户需求进行自定义配置。也可以根据不同的第一预设阈值,对第一级风险的补丁代码进行风险等级的再次划分。例如,当各第一约束条件集中无解的个数大于5时,确定为第一级风险中的第一风险等级,当各第一约束条件集中无解的约束条件集的个数大于0且小于或等于5时,确定为第一级风险中的第二风险等级。其中,第一风险等级高于第二风险等级。
在本公开的又一种示例性实施例中,在确定补丁代码的风险等级为第二级风险时,还可以根据各第一约束条件集的解区间的大小对第二级风险的补丁代码进行风险等级的再次划分。例如,解区间越小,说明其存在的不安全的解越少,那么,这个补丁代码也就越重要,对应的风险等级也就越高。当解区间小于其对应的预设范围的第一约束条件集的个数大于第二预设阈值时,确定为第二级风险中的第一风险等级,当解区间小于其对应的预设范围的第一约束条件集的个数小于第二预设阈值时,确定该补丁代码为第二级风险中的第二风险等级。其中,第一风险等级高于第二风险等级。
为了进一步提高本示例性实施例所提供的补丁程序的风险确定方法的准确性,针对每种安全加固型操作代码所针对的每个变量,在本公开示例性的实施方式中,还可以根据第一约束条件集中的各约束条件生成第二约束条件集,然后根据第一约束条件集的求解结果和第二约束条件集的求解结果,分析补丁代码的风险。
图5示意性示出了根据本公开的一个实施例的针对每种安全加固型操作代码所针对的每个变量,生成第二约束条件集的方法的流程示意图。参考图5,该方法可以包括步骤S510至步骤S530。其中:
在步骤S510中,生成第一目标约束条件的反约束条件。
示例性的,得到第一目标约束条件后,还可以生成第一目标约束条件的反约束条件,将其作为第二约束条件集中的约束条件之一。
继续以上述的得到的第一目标约束条件“i<max_edge”为例,可以对其进行取反,生成其对应的反约束条件“i>=max_edge”。
在步骤S520中,生成预设约束条件的反约束条件。
示例性的,在上述的步骤S140中获取到预设约束条件后,可以生成预设约束条件的反约束条件,然后,将其作为第二约束条件集中的约束条件之一。
继续以上述的确定出的风险代码为“arr[j]=arr[j]+1”预设约束条件为“j>=len(arr)”例,可以生成反约束条件“j<len(arr)”。
在步骤S530中,合并第一目标约束条件的反约束条件、预设约束条件的反约束条件和第二目标约束条件,以生成第二约束条件集。
通过上述的步骤S510至步骤S530,可以生成第二约束条件集。生成第二约束条件集后,可以先根据第一约束条件集和第二约束条件集确定约束条件集对,然后,根据约束条件集对的求解结果分析补丁代码的风险。这样,可以使得本实施例性实施例所提供的补丁程序的风险确定方法的约束条件更加严格,进而可以进一步提高补丁代码的风险确定的准确性。
示例性的,图6示出本公开一示例性实施例中的确定约束条件集对的方法的流程示意图。参考图6,确定约束条件集对的方法可以包括步骤S610至步骤S630。其中:
在步骤S610中,针对每种安全加固型操作代码所针对的每个变量,根据所述变量对应的第一代码切片集合中的安全加固型操作代码所针对的变量和所述变量对应的所述风险操作代码,生成所述变量对应的第二代码切片集合。
在本公开示例性的实施方式中,对于每种安全加固型操作代码所针对的每个变量而言,其对应的第二代码切片集合中可以包括其对应的第一代码切片集合中的安全加固型操作代码所针对的变量和第一代码切片集合中的该变量所对应的风险操作代码。
举例而言,第二代码切片集合可以包括第二三元组切片集合,第二三元组切片集合可以为未添加补丁代码的原始代码对应的三元组切片集合,而未添加补丁代码的原始代码中没有相关的安全加固型操作代码,所以第二三元组切片集合可以表示为“<null,val′,v′op>”,其中,val′表示第二三元组切片集合中的安全加固型操作代码所针对的变量,v′op表示第二三元组切片集合中的变量对应的风险操作代码。
在步骤S620中,基于相同的安全加固型操作代码所针对的变量和所述变量对应的风险操作代码,将各所述变量对应的各所述第一代码切片集合和各所述第二代码切片集合进行匹配。
在本公开示例性的实施方式中,第一代码切片集合和第二代码集合之间的匹配关系,可以根据安全加固型操作代码所针对的变量和所述变量对应的风险操作代码确定,在安全加固型操作代码所针对的变量和所述变量对应的风险操作代码都完全相同时,则第一三元组切片集合和第二三元组切片集合相匹配。
举例而言,第一代码切片集合可以是slicepatched=<sop,val,vop>,第二代码切片集合可以是sliceunpatched=<null,val′,v′op>,对于sliceunpatched=<null,val′,v′op>,slicepatched=<sop,val,vop>,应满足:
<sliceunpatched,slicepatched>,val′=val,v′op=vop
在步骤S630中,根据各所述第一代码切片集合和各所述第二代码切片集合之间的匹配关系,将各所述变量的各所述第一约束条件集和各所述变量的各所述第二约束条件集进行匹配,以生成各所述变量对应的各约束条件集对。
示例性的,当第一代码切片集合和第二代码切片集合相匹配时,那么,第一代码切片集合中的变量对应的第一约束条件集和第二代码切片集合中的变量对应的第二约束条件集也相匹配,从而可以生成各变量的约束条件集对。
生成各所述变量的约束条件集对后,可以根据约束条件集对中的第一约束条件集和第二约束条件集的求解结果,分析补丁代码的风险。
示例性的,图7示意性示出了根据本公开的一个实施例的根据约束条件集对的求解结果分析补丁代码的风险的方法的流程示意图。参考图7,该方法可以包括步骤S710至步骤S740。其中:
在步骤S710中,对各约束条件集对中的第一约束条件集和第二约束条件集求解。
在示例性的实施方式中,针对每种安全加固型操作代码所针对的每个变量所对应的约束条件集对,分别求解约束条件集对中的第一约束条件集和第二约束条件集。同样的,如前所述,可以采用SMT(Satisfiability Modulo Theory,可满足性模理论)求解器Z3对约束条件集对中的第一约束条件集和第二约束条件集进行求解。
在步骤S720中,判断各约束条件集对中是否存在至少一个约束条件集对无解,若是,转至步骤S730,若否,则转至步骤S740。
在步骤S730中,确定补丁代码的风险等级为第一级风险。
示例性的,在至少一种安全加固型操作代码所针对的至少一个变量的约束条件集对中的第一约束条件集和第二约束条件集均无解时,即至少一个约束条件集对无解时,表明该补丁代码确实修复了至少一个问题,因此,可以在步骤S730中确定补丁代码的风险等级为第一级风险。
在步骤S740中,确定补丁代码的风险等级为第二级风险。
在示例性的实施方式中,在各安全加固型操作代码所针对的各变量对应的各约束条件集对中的至少一个约束条件集均有解时,确定补丁代码的风险等级为第二级风险。其中,第一级风险高于第二级风险。
举例而言,假设安全加固型操作代码所针对的变量包括a、b、c、d、e,其中,a对应的第一约束条件集和第二约束条件集分别为a1和a2,b对应的第一约束条件集和第二约束条件集分别为b1和b2,c对应的第一约束条件集和第二约束条件集分别为c1和c2,d对应的第一约束条件集和第二约束条件集分别为d1和d2,e对应的第一约束条件集和第二约束条件集分别为e1和e2。在a1和a2、b1和b2、c1和c2、d1和d2、e1和e2中的至少一对中的两个约束条件集都无解时,则可以确定补丁代码的风险等级为第一级风险;在a1和a2、b1和b2、c1和c2、d1和d2、e1和e2中的每个约束条件集对中都至少有一个条件集有解时,则确定补丁代码的风险等级为第二级风险。
在本公开示例性的实施方式中,第一约束条件集可以对应添加了补丁代码后的代码中的变量对应的约束条件集,第二约束条件集可以对应未添加补丁代码的原始代码中的变量对应的约束条件集。
以安全加固型操作代码为“if(i>=max_edge){return ERROR;//out ofbound}”、第一切片集合中的安全加固型操作代码所针对的变量和风险操作代码所针对的变量之间的变量转换路径为“j=i+1”、风险操作代码为“arr[j]=arr[j]+1”、预设约束条件为“j>=len(arr)”为例,最终得到的添加了补丁代码后的代码中的变量对应的约束条件集和未添加补丁代码的原始代码中的变量对应的约束条件集可以如表1所示。表1中的约束条件1可以对应上述的第一目标约束条件、约束条件2可以对应上述的第二目标约束条件、约束条件3可以对应上述的预设约束条件。在表1中,约束条件3对应的是边界检查操作代码类型的安全加固型操作代码对应的越界访问问题出现的求解条件。
然后,可以使用约束求解器对表1中的约束条件集进行求解,在表1中的两个约束条件集同时无解时,表明添加了补丁代码后的代码的约束条件集永远不会违反约束条件3的安全约束(即一定不会出现越界访问),未添加补丁代码的原始代码一定会违反条件3的安全约束(即一定会越界访问)。这表明,添加了补丁代码后,该补丁代码确实修复了一个安全问题(即越界访问的问题)。
表1
约束条件 添加了补丁代码的约束条件集 原始代码的约束条件集
约束条件1 i<max_edge i>=max_edge
约束条件2 j=i+1 j=i+1
约束条件3 j>=len(arr) j<len(arr)
如果对于某种类型的安全加固型操作代码所针对的某个变量而言,第一约束条件集和第二约束条件集均无解,则表明,对于该变量而言,添加了补丁的代码永远无法求解出违背安全的解,而未添加补丁的代码永远无法求解出符合安全的解,则可以表明该补丁代码确实修复了一个安全问题,则可以将其确定为高风险的补丁代码,从而可以提醒用户可以优先发布该补丁代码,以尽快修复该安全问题。
通过本示例性实施例所提供的补丁程序的风险确定方法,利用符号执行的思想,可以根据获取的补丁代码中的代码操作所针对的变量,实现补丁程序的风险的自动化分析,提高工作效率。同时,在本公开中,通过补丁代码和风险操作代码确定出的目标约束条件、以及预先定义的预设约束条件,可以直接基于补丁代码中的约束条件进行补丁代码的风险分析,提高分析结果的可靠性和准确性。进一步的,通过获取多种约束条件,也进一步提高了分析结果的准确性。
此外,在本公开中,仅需要对相关代码进行静态分析即可,因此不需要将补丁代码的风险分析扩展到整个项目代码中。
图8示出本公开一示例性实施例中的另一种补丁程序的风险确定方法的流程示意图。该方法可以步骤S810至步骤S882。
在步骤S810中,解析补丁代码文件,以确定出添加补丁代码后的文件和未添加补丁代码的文件。
示例性的,如前所述,由于补丁代码文件有很多发布形式,对于安全修复人员下发的补丁代码文件,补丁管理人员有时并不能直接得知其接收到的安全修复人员下发的补丁代码文件中进行了哪些修复,即,无法直接得知补丁代码文件中哪部分是补丁代码本身,哪部分是补丁代码所要修复的代码。因此,可以对补丁代码文件进行解析,以确定出添加了补丁代码后的文件和未添加补丁代码的文件(即补丁代码所要修复的代码)。
在步骤S820中,分别生成添加补丁代码后的文件对应的第一中间语言代码和未添加补丁代码的文件对应的第二中间语言代码。
在示例性的实施方式中,第一中间语言代码和第二中间语言代码可以是任何形式的中间语言代码类型,只要第一中间语言代码和第二中间语言代码对应的中间语言代码类型相同即可。例如,如前所述,可以利用LLVM-IR生成器生成添加补丁代码后的文件对应的第一中间语言代码和未添加补丁代码的文件对应的第二中间语言代码。
利用中间语言代码可以使本示例性实施方式提供的补丁程序的风险确定方法适配多种源代码形式的补丁代码,从而提高本示例性实施方式的可扩展性和可用性。
在步骤S830中,根据第一中间语言代码对补丁代码进行切片提取,以得到补丁代码文件中的代码操作所针对的变量的第一代码切片集和第二代码切片集。
如前所述,对于安全修复人员下发的补丁代码文件,补丁管理人员有时并不能直接得知其接收到的安全修复人员下发的补丁代码文件中进行了哪些修复,即,无法直接得知补丁代码文件中哪部分是补丁代码本身,哪部分是补丁代码所要修复的代码。
示例性的,在步骤S830中,可以先将第一中间语言代码和第二中间语言代码进行对比,确定第一中间语言代码和第二中间语言代码之间的差异为补丁代码(即补丁代码本身)。
确定出补丁代码后,可以通过执行下述过程,以得到第一代码切片集:从补丁代码中获取安全加固型操作代码;确定安全加固型操作代码所针对的变量;在补丁代码对应的待修复代码(即补丁代码所要修复的代码)中,根据针对所述变量的代码操作确定出风险操作代码;根据安全加固型操作代码、安全加固型操作代码所针对的变量、和所述风险操作代码,生成所述第一代码切片集。
具体的,可以根据至少一种安全加固型操作代码对应的安全加固规则,从补丁代码中获取安全加固型操作代码。确定安全加固型操作代码所针对的变量和上述的步骤S110中获取补丁代码中的安全加固型操作代码所针对的变量的具体实施方式完全相同,在补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险代码操作和上述的步骤120的具体实施方式完全相同,此处不再进行赘述。
示例性的,第一代码切片集中的每个切片可以表示为<sop,val,vop>,其中,sop表示安全加固型操作代码,val表示该安全加固型操作代码所针对的变量,vop表示该变量对应的风险操作代码。由于同一个sop可能会对应多个vop,因此,针对每个安全加固型操作代码所针对的变量可以得到第一代码切片集。
在示例性的实施方式中,可以根据第一代码切片集确定第二代码切片集。具体的的,将第一代码切片集中的安全加固型操作代码配置为空(即null),保留第一代码切片集中的安全加固型操作代码所针对的变量和该变量对应的风险操作代码,从而生成第一代码切片集。
在步骤S840中,将第一代码切片集和第二代码切片集进行匹配。
在示例性的实施方式中,第一代码切片集可以是添加了补丁代码的文件对应的代码切片集,第二代码切片集可以是未添加补丁代码的文件对应的代码切片集。可以基于相同的安全加固型操作代码所针对的变量和相同的风险操作代码,将第一代码切片集合第二代码切片集进行匹配。
举例而言,第一代码切片集合可以是slicepatched=<sop,val,vop>,第二代码切片集合可以是sliceunpatched=<null,val′,v′op>,即对于sliceunpatched=<null,val′,v′op>,slicepatched=<sop,val,vop>,应满足:
<sliceunpatched,slicepatched>,val′=val,v′op=vop
在步骤S850中,根据第一代码切片集,获取补丁代码中的代码操作所针对的变量的目标约束条件。
示例性的,步骤S850的具体实施方式和上述的步骤S130的具体实施方式相同,此处不再进行赘述。
在步骤S860中,获取预设约束条件。
示例性的,预设约束条件和上述的步骤S140中的预设约束条件相同,此处不再进行赘述。
在步骤S870中,根据目标约束条件和预设约束条件生成约束条件集,对约束条件集进行求解。
在示例性的实施方式中,约束条件集包括第一约束条件集和第二约束条件集。其中,合并预设约束条件和目标约束条件以生成第一约束条件集。合并预设约束条件的反约束条件和目标约束条件中的第一目标约束条件集的反约束条件、以及目标约束条件中的第二目标约束条件,以生成第二约束条件集。
示例性的,可以使用SMT(Satisfiability Modulo Theory,可满足性模理论)求解器Z3对第一约束条件集和第二约束条件集进行求解。
在步骤S880中,判断约束条件集是否不可解,若约束条件集不可解,则转至步骤S881,否则,转至步骤S882。
示例性的,判断约束条件集是否可解的具体实施方式可以是,根据第一切片集和第二切片集的匹配关系,将对应的第一约束条件集和第二约束条件集进行匹配,以生成约束条件集对。判断是否存在至少一个约束条件集对中的第一约束条件集和第二约束条件集都不可解。如果存在,则转至步骤S881;如果不存在,则转至步骤S882中。
在步骤S881中,确定补丁代码的风险等级为第一级风险。
在步骤S882中,确定补丁代码的风险等级为第二级风险。
在示例性的实施方式中,第一级风险高于第二级风险。
举例而言,当互相匹配的第一约束集和第二约束条件集均不可解时,则可以认为该补丁代码文件确实修复了一个安全问题。换言之,添加了补丁代码的文件永远不会违反对应的预设约束条件的安全约束;未添加补丁代码的文件一定会违反对应的预设约束条件的安全约束。即,添加了补丁代码的文件确实修复了一个漏洞,则可以认为该补丁代码为高风险的补丁代码。在进行漏洞修复时,可以考虑优先将高风险的补丁代码下发至客户端。
图9示出了可以应用本公开实施例的一种补丁程序的风险确定方法及装置的补丁管理系统的框图。如图9所示,该系统900可以包括补丁文件获取模块910、风险确定模块920、补丁发布模块930。其中:
补丁文件获取模块910用于根据补丁程序的统一资源定位符获取补丁程序对应的补丁文件。
在本公开示例性的实施方式中,可以同时根据多个补丁程序的统一资源定位符获取多个补丁程序对应的补丁文件。
风险确定模块920用于根据上述示例性实施例所提供的补丁程序的风险确定方法,确定各补丁程序对应的补丁文件的风险。
补丁代码发布模块930用于根据确定的补丁文件的风险,确定补丁文件的发布顺序。
在本公开示例性的实施方式中,第一级风险的补丁代码的发布顺序可以优先第二级风险的补丁代码的发布顺序。
图10示出本公开一示例性实施例中的补丁下发管理系统的框图。参考图10,该补丁下发管理系统1000可以包括补丁信息接收子系统1010、补丁文件获取子系统1020、补丁风险分析子系统1030、补丁下发管理子系统1040。其中:
补丁信息接收子系统1010用于接收至少一个补丁信息;补丁文件获取子系统1020用于根据接收的至少一个补丁信息,获取待分析的补丁文件;补丁风险分析子系统1030可以用于根据上述的补丁程序的风险确定方法或下述的补丁风险确定装置,对待分析的补丁文件进行风险分析;补丁下发管理子系统1040用于根据分析的补丁文件的风险等级,确定补丁文件的下发顺序。
具体的,补丁文件获取子系统1020可以根据接收的补丁信息中的补丁文件的统一资源定位符获取待分析的补丁文件。获取到待分析的补丁文件后,补丁风险分析子系统1030可以根据上述的补丁程序的风险分析方法对补丁文件进行风险分析,以将第一级风险的补丁和第二级风险的补丁分别识别出来,其中,第一级风险的补丁可以是高风险的补丁,第二级风险的补丁可以是低风险的补丁。在补丁下发管理子系统1040中,对于第一级风险的补丁(即,高风险的补丁),可以考虑优先下发至客户端,将其配置为优先下发;对于第二级风险的补丁(即,低风险的补丁),可以考虑延迟下发至客户端,将其配置为滞后下发。
举例而言,对于高风险的补丁由于其确实修复了至少一个漏洞,所以补丁下发管理子系统1040,可以将高风险的补丁的下发顺序配置为第一顺序。如上述的优先下发;对于低风险的补丁,由于不确定其是否确实修复了漏洞,所以可以人工进行进一步确认后再考虑是否下发至客户端,因此,补丁下发管理子系统1040,可以将低风险的补丁的下发顺序配置为第二顺序,如上述的滞后下发。其中,第一顺序优先于第二顺序,即第一顺序的补丁优先于第二顺序的补丁下发至客户端。
通过上述的补丁下发管理系统1000,可以同时对多个补丁文件进行风险分析和下发管理,提高了补丁文件下发管理的效率。
进一步的,本示例性实施方式中,还提供了一种补丁程序的风险确定装置,该补丁程序的风险确定装置可以应用于一服务器或终端设备。参考图11所示,该补丁程序的风险确定装置1100可以包括变量获取模块1110、风险代码确定模块1120、目标约束条件获取模块1130、预设约束条件获取模块1140、风险分析模块1150。其中:
变量获取模块1110,被配置为获取补丁代码中的代码操作所针对的变量;风险代码确定模块1120,被配置为在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码;目标约束条件获取模块1130,被配置为根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件;预设约束条件获取模块1140,被配置为获取所述补丁代码中的代码操作对应的预设约束条件;风险分析模块1150,被配置为利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。
在本公开的一种示例性实施例中,所述变量获取模块1110通过下述方法获取补丁代码中的代码操作所针对的变量:
生成添加了原始补丁代码的源代码的第一中间语言代码;
生成未添加所述原始补丁代码的源代码的第二中间语言代码;
根据所述第一中间语言代码和所述第二中间语言代码之间的差异,确定所述原始补丁代码对应的中间语言代码;
在所述原始补丁代码对应的中间语言代码中,获取补丁代码中的代码操作所针对的变量。
在本公开的一种示例性实施例中,所述变量获取模块1110通过下述方法获取补丁代码中的代码操作所针对的变量:
获取所述补丁代码中的安全加固型操作代码所针对的变量;
所述获取补丁代码中的安全加固型操作代码所针对的变量,包括;
根据至少一种安全加固型操作代码对应的安全加固规则,获取补丁代码中的安全加固型操作代码所针对的变量;
所述至少一种安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码、权限检查操作代码中的一个或多个。
在本公开的一种示例性实施例中,所述变量获取模块1110通过下述方法获取补丁代码中的代码操作所针对的变量:
在所述安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码中的一个或多个时,获取各所述安全加固型操作代码所涉及的各变量;
在所述安全加固型操作代码包括权限检查操作代码时,获取所述权限检查操作代码中的权限函数所针对的各非固定参数变量。
在本公开的一种示例性实施例中,所述风险代码确定模块1120通过下述方法在所述代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码:
在所述安全加固型操作代码包括边界检查操作代码时,在所述补丁代码对应的待修复代码中,确定使用所述变量作为访问下标进行内存访问的代码操作和使用所述变量作为读取函数或写入函数的输入参数的代码操作为风险操作代码;
在所述安全加固型操作代码为指针置空操作代码时,在所述补丁代码对应的待修复代码中,确定针对所述变量的指针取消引用的代码操作为风险操作代码;
在所述安全加固型操作代码为初始化操作代码时,在所述变量中确定出在所述补丁代码对应的待修复代码中未被初始化的变量,在所述补丁代码对应的待修复代码中,确定针对所述未被初始化的变量进行的代码操作为风险操作代码;
在所述安全加固型操作代码为权限检查操作代码时,针对权限检查操作代码中的权限函数所针对的非固定参数变量,在所述补丁代码对应的待修复代码中,确定采用预设结构类型的所述非固定参数变量所涉及的代码操作为风险操作代码。
在本公开的一种示例性实施例中,所述目标约束条件获取模块1130通过下述方法根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件:
针对每种安全加固型操作代码所针对的每个变量执行下述过程:
根据所述安全加固型操作代码、所述安全加固型操作代码所针对的变量和所述变量所对应的所述风险操作代码,生成所述变量对应的第一代码切片集合;
根据所述第一代码切片集合,确定出针对所述变量的目标约束条件。
在本公开的一种示例性实施例中,所述目标约束条件获取模块1130包括第一目标约束条件获取单元和第二目标约束条件获取单元,其中:
所述第一目标约束条件获取单元用于获取所述第一代码切片集合中的安全加固型操作代码针对所述变量所引入的约束条件,以得到针对所述变量的第一目标约束条件;
所述第二目标约束条件获取单元用于在所述补丁代码对应的待修复代码中,获取所述第一代码切片集合中的所述安全加固型操作代码所针对的变量和所述风险操作代码所针对的变量之间的变量转换路径,以得到针对所述变量的第二目标约束条件。
在本公开的一种示例性实施例中,所述风险分析模块1150通过下述方法生成所述变量的约束条件集:
针对每种安全加固型操作代码所针对的每个变量,合并所述第一目标约束条件、所述第二目标约束条件和所述预设约束条件,以生成所述变量的第一约束条件集。
在本公开的一种示例性实施例中,所述风险分析模块1150通过下述方法根据所述约束条件集的求解结果分析所述补丁代码的风险:
在至少一种安全加固型操作代码所针对的至少一个变量的所述第一约束条件集无解时,确定所述补丁代码的风险等级为第一级风险;
在各安全加固型操作代码所针对的各变量的所述第一约束条件集均有解时,确定所述补丁代码的风险等级为第二级风险;
其中,所述第一级风险高于所述第二级风险。
在本公开的一种示例性实施例中,所述装置还包括第二约束条件集生成模块,所述第二约束条件集生成模块用于:
针对所述每种安全加固型操作代码所针对的变量,合并所述第一约束条件的反约束条件、所述预设约束条件的反约束条件和所述第二目标约束条件,以生成所述变量的第二约束条件集。
在本公开的一种示例性实施例中,所述风险分析模块1150还可以通过下述方法根据所述约束条件集的求解结果分析所述补丁代码的风险:
针对每种安全加固型操作代码所针对的每个变量,根据所述变量对应的第一代码切片集合中的安全加固型操作代码所针对的变量和所述变量对应的所述风险操作代码,生成所述变量对应的第二代码切片集合;
基于相同的安全加固型操作代码所针对的变量和所述变量对应的风险操作代码,将各所述变量对应的各所述第一代码切片集合和各所述第二代码切片集合进行匹配;
根据各所述第一代码切片集合和各所述第二代码切片集合之间的匹配关系,将各所述变量的各所述第一约束条件集和各所述变量的各所述第二约束条件集进行匹配,以生成各所述变量对应的各约束条件集对;
在至少一种安全加固型操作代码所针对的至少一个变量的所述约束条件集对中的第一约束条件集和第二约束条件集均无解时,确定所述补丁代码的风险等级为第一级风险;
在各安全加固型操作代码所针对的各所述变量对应的各约束条件集对中的至少一个约束条件集均有解时,确定所述补丁代码的风险等级为第二级风险;
其中,所述第一级风险高于所述第二级风险。
在本公开的一种示例性实施例中,所述预设约束条件获取模块1140中的预设约束条件包括预设的导致所述安全加固型操作代码所针对的安全问题出现的求解条件。
图12示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图。
需要说明的是,图12示出的电子设备的计算机系统1200仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图12所示,计算机系统1200包括中央处理单元(CPU)1201,其可以根据存储在只读存储器(ROM)1202中的程序或者从存储部分1208加载到随机访问存储器(RAM)1203中的程序而执行各种适当的动作和处理。在RAM 1203中,还存储有系统操作所需的各种程序和数据。CPU 1201、ROM 1202以及RAM 1203通过总线1204彼此相连。输入/输出(I/O)接口1205也连接至总线1204。
以下部件连接至I/O接口1205:包括键盘、鼠标等的输入部分1206;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1207;包括硬盘等的存储部分1208;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1209。通信部分1209经由诸如因特网的网络执行通信处理。驱动器1210也根据需要连接至I/O接口1205。可拆卸介质1211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1210上,以便于从其上读出的计算机程序根据需要被安装入存储部分1208。
特别地,根据本公开的实施例,下文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1209从网络上被下载和安装,和/或从可拆卸介质1211被安装。在该计算机程序被中央处理单元(CPU)1201执行时,执行本申请的方法和装置中限定的各种功能。
作为另一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现如下述实施例中所述的方法。例如,所述的电子设备可以实现如图3所示的各个步骤等。
需要说明的是,本公开所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
此外,本公开在一个示例性实施例中,还提供一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述的各种可选实现方式中提供的方法。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。

Claims (15)

1.一种补丁程序的风险确定方法,其特征在于,包括:
获取补丁代码中的代码操作所针对的变量;
在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码;
根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件;
获取所述补丁代码中的代码操作对应的预设约束条件;
利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。
2.根据权利要求1所述的补丁程序的风险确定方法,其特征在于,所述获取补丁代码中的代码操作所针对的变量,包括:
生成添加了原始补丁代码的源代码的第一中间语言代码;
生成未添加所述原始补丁代码的源代码的第二中间语言代码;
根据所述第一中间语言代码和所述第二中间语言代码之间的差异,确定所述原始补丁代码对应的中间语言代码;
在所述原始补丁代码对应的中间语言代码中,获取补丁代码中的代码操作所针对的变量。
3.根据权利要求1所述的补丁程序的风险确定方法,其特征在于,所述获取补丁代码中的代码操作所针对的变量,包括:
获取所述补丁代码中的安全加固型操作代码所针对的变量;
所述获取所述补丁代码中的安全加固型操作代码所针对的变量,包括:
根据至少一种安全加固型操作代码对应的安全加固规则,获取补丁代码中的安全加固型操作代码所针对的变量;
其中,所述至少一种安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码、权限检查操作代码中的一个或多个。
4.根据权利要求3所述的补丁程序的风险确定方法,其特征在于,所述获取补丁代码中的安全加固型操作代码所针对的变量,包括:
在所述安全加固型操作代码包括边界检查操作代码、指针置空操作代码、初始化操作代码中的一个或多个时,获取各所述安全加固型操作代码所涉及的各变量;
在所述安全加固型操作代码包括权限检查操作代码时,获取所述权限检查操作代码中的权限函数所针对的各非固定参数变量。
5.根据权利要求3所述的补丁程序的风险确定方法,其特征在于,所述在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码,包括:
在所述安全加固型操作代码包括边界检查操作代码时,在所述补丁代码对应的待修复代码中,确定使用所述变量作为访问下标进行内存访问的代码操作和使用所述变量作为读取函数或写入函数的输入参数的代码操作为风险操作代码;
在所述安全加固型操作代码为指针置空操作时,在所述补丁代码对应的待修复代码中,确定针对所述变量的指针取消引用的代码操作为风险操作代码;
在所述安全加固型操作代码为初始化操作代码时,在所述变量中确定出在所述补丁代码对应的待修复代码中未被初始化的变量,在所述补丁代码对应的待修复代码中,确定针对所述未被初始化的变量进行的代码操作为风险操作代码;
在所述安全加固型操作代码为权限检查操作代码时,针对权限检查操作代码中的权限函数所针对的非固定参数变量,在所述补丁代码对应的待修复代码中,确定采用预设结构类型的所述非固定参数变量所涉及的代码操作为风险操作代码。
6.根据权利要求3所述的补丁程序的风险确定方法,其特征在于,所述根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件,包括:
针对每种安全加固型操作代码所针对的每个变量执行下述过程:
根据所述安全加固型操作代码、所述安全加固型操作代码所针对的变量和所述变量所对应的所述风险操作代码,生成所述变量对应的第一代码切片集合;
根据所述第一代码切片集合,确定出针对所述变量的目标约束条件。
7.根据权利要求6所述的补丁程序的风险确定方法,其特征在于,所述根据所述第一代码切片集合,确定出针对所述变量的目标约束条件,包括:
获取所述第一代码切片集合中的安全加固型操作代码针对所述变量所引入的约束条件,以得到针对所述变量的第一目标约束条件;
在所述补丁代码对应的待修复代码中,获取所述第一代码切片集合中的所述安全加固型操作代码所针对的变量和所述风险操作代码所针对的变量之间的变量转换路径,以得到针对所述变量的第二目标约束条件。
8.根据权利要求7所述的补丁程序的风险确定方法,其特征在于,所述利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集包括:
针对每种安全加固型操作代码所针对的每个变量,合并所述第一目标约束条件、所述第二目标约束条件和所述预设约束条件,以生成所述变量的第一约束条件集。
9.根据权利要求8所述的补丁程序的风险确定方法,其特征在于,所述根据所述约束条件集的求解结果分析所述补丁代码的风险包括:
在至少一种安全加固型操作代码所针对的至少一个变量的所述第一约束条件集无解时,确定所述补丁代码的风险等级为第一级风险;
在各安全加固型操作代码所针对的各变量的所述第一约束条件集均有解时,确定所述补丁代码的风险等级为第二级风险;
其中,所述第一级风险高于所述第二级风险。
10.根据权利要求8所述的补丁程序的风险确定方法,其特征在于,所述利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,还包括:
针对所述每种安全加固型操作代码所针对的变量,合并所述第一目标约束条件的反约束条件、所述预设约束条件的反约束条件和所述第二目标约束条件,以生成所述变量的第二约束条件集。
11.根据权利要求10所述的补丁程序的风险确定方法,其特征在于,所述根据所述约束条件集的求解结果分析所述补丁代码的风险包括:
针对每种安全加固型操作代码所针对的每个变量,根据所述变量对应的第一代码切片集合中的安全加固型操作代码所针对的变量和所述变量对应的所述风险操作代码,生成所述变量对应的第二代码切片集合;
基于相同的安全加固型操作代码所针对的变量和所述变量对应的风险操作代码,将各所述变量对应的各所述第一代码切片集合和各所述第二代码切片集合进行匹配;
根据各所述第一代码切片集合和各所述第二代码切片集合之间的匹配关系,将各所述变量的各所述第一约束条件集和各所述变量的各所述第二约束条件集进行匹配,以生成各所述变量对应的各约束条件集对;
在至少一种安全加固型操作代码所针对的至少一个变量的所述约束条件集对中的第一约束条件集和第二约束条件集均无解时,确定所述补丁代码的风险等级为第一级风险;
在各安全加固型操作代码所针对的各所述变量对应的各约束条件集对中的至少一个约束条件集均有解时,确定所述补丁代码的风险等级为第二级风险;
其中,所述第一级风险高于所述第二级风险。
12.根据权利要求3至11中任一项所述的补丁程序的风险确定方法,其特征在于,所述预设约束条件包括预设的导致所述安全加固型操作代码所针对的安全问题出现的求解条件。
13.一种补丁程序的风险确定装置,其特征在于,包括:
变量获取模块,被配置为获取补丁代码中操作代码所针对的变量;
风险代码确定模块,被配置为在所述补丁代码对应的待修复代码中,根据针对所述变量的代码操作确定出风险操作代码;
目标约束条件获取模块,被配置为根据所述补丁代码和所述风险操作代码,获取针对所述变量的目标约束条件;
预设约束条件获取模块,被配置为获取所述补丁代码中的代码操作对应的预设约束条件;
风险分析模块,被配置为利用所述目标约束条件和所述预设约束条件生成所述变量的约束条件集,根据所述约束条件集的求解结果分析所述补丁代码的风险。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至12中任一项所述的补丁程序的风险确定方法。
15.一种电子设备,其特征在于,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1至12中任一项所述的补丁程序的风险确定方法。
CN202110245317.1A 2021-03-05 2021-03-05 补丁程序的风险确定方法及装置、存储介质、电子设备 Pending CN115033882A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110245317.1A CN115033882A (zh) 2021-03-05 2021-03-05 补丁程序的风险确定方法及装置、存储介质、电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110245317.1A CN115033882A (zh) 2021-03-05 2021-03-05 补丁程序的风险确定方法及装置、存储介质、电子设备

Publications (1)

Publication Number Publication Date
CN115033882A true CN115033882A (zh) 2022-09-09

Family

ID=83118040

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110245317.1A Pending CN115033882A (zh) 2021-03-05 2021-03-05 补丁程序的风险确定方法及装置、存储介质、电子设备

Country Status (1)

Country Link
CN (1) CN115033882A (zh)

Similar Documents

Publication Publication Date Title
US20200019494A1 (en) Method and apparatus for performing test by using test case
US11157250B2 (en) Inductive equivalence in machine-based instruction editing
US10002069B2 (en) Automated testing of application program interface
US10068093B2 (en) Machine-checkable code-annotations for static application security testing
US9081892B2 (en) Software verification
US20190361788A1 (en) Interactive analysis of a security specification
CN106529283A (zh) 一种面向软件定义网络的控制器安全性定量分析方法
US9378115B2 (en) Base line for code analysis
WO2017015955A1 (en) Application testing
CN112988578A (zh) 一种自动化测试方法和装置
CN115033882A (zh) 补丁程序的风险确定方法及装置、存储介质、电子设备
CN107358032B (zh) 一种产品的升级方法、装置及产品升级系统
CN115657981A (zh) 验证环境中的打印信息的打印等级的设置方法及验证方法
CN115062312A (zh) 智能合约漏洞检测方法、装置、设备和存储介质
CN112084278B (zh) 一种地图数据转换定制产品的检证方法及装置
CN114416596A (zh) 一种测试应用的方法、装置、计算机设备及存储介质
KR101665962B1 (ko) 모델링 코드 검증 방법, 이를 수행하는 모델링 코드 검증 장치 및 이를 저장하는 기록매체
CN112380541A (zh) 智能合约的漏洞的检测方法、装置及计算机设备
US8352918B2 (en) Method and system for verifying properties of a computer program
CN111639028A (zh) 一种对账规则脚本测试方法、装置、引擎及存储介质
CN113419944B (zh) 模糊测试的初始化方法、装置及存储介质
Honda et al. Range analyzer: An automatic tool for arithmetic overflow detection in model-based development
Khan Towards practical and formal security risk analysis of IoT (Internet of Things) applications
Gargantini et al. AURORA: automatic robustness coverage analysis tool
Shi et al. Code optimizations using formally verified properties

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination