CN117077148B - 程序的安全分析方法、系统、计算机设备及存储介质 - Google Patents

程序的安全分析方法、系统、计算机设备及存储介质 Download PDF

Info

Publication number
CN117077148B
CN117077148B CN202311308165.0A CN202311308165A CN117077148B CN 117077148 B CN117077148 B CN 117077148B CN 202311308165 A CN202311308165 A CN 202311308165A CN 117077148 B CN117077148 B CN 117077148B
Authority
CN
China
Prior art keywords
description
vulnerability
item
entity
replacement
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.)
Active
Application number
CN202311308165.0A
Other languages
English (en)
Other versions
CN117077148A (zh
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.)
Jiumu Beijing Technology Co ltd
Original Assignee
Jiumu Beijing Technology 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 Jiumu Beijing Technology Co ltd filed Critical Jiumu Beijing Technology Co ltd
Priority to CN202311308165.0A priority Critical patent/CN117077148B/zh
Publication of CN117077148A publication Critical patent/CN117077148A/zh
Application granted granted Critical
Publication of CN117077148B publication Critical patent/CN117077148B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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
    • 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/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis
    • 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 Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Stored Programmes (AREA)

Abstract

本发明实施例提供了一种程序的安全分析方法、系统、计算机设备及存储介质,涉及数据处理技术领域,其中,该方法包括:获取待分析程序涉及的程序实体和漏洞的描述数据,描述数据包括待分析程序使用的程序实体的实体描述语句或实体描述语句模板,描述数据包括待分析程序存在的漏洞的漏洞描述语句或漏洞描述语句模板;根据实体描述语句构造实体数据,根据漏洞描述语句构造漏洞数据,或者,根据实体描述语句模板生成实体描述语句,并构造实体数据,根据漏洞描述语句模板生成漏洞描述语句,并构造漏洞数据;接收分析器发来的获取数据的请求;根据请求从实体数据中获取对应的实体数据从漏洞数据中获取对应的漏洞数据,返回给分析器进行安全分析。

Description

程序的安全分析方法、系统、计算机设备及存储介质
技术领域
本发明涉及数据处理技术领域,特别涉及一种程序的安全分析方法、系统、计算机设备及存储介质。
背景技术
程序实体(简称实体)是指程序使用的数据或内容,包括变量、函数、对象、类、模块(module)、包(package)和命名空间(namespace)等。在程序分析和验证领域,一个被分析或被验证的程序经常会用到在它外部定义的程序实体,如何精确而简洁地描述它们,是该领域必须要解决的一个挑战。此外,程序实体被该程序的编程语言所定义,编程语言没有描述实体安全特征的方法,如何把这些安全特征简洁而精确地描述出来也是必须要解决的问题。
目前,一种广泛应用的方法是直接用编写被分析程序的语言(简称原语言)编写有关实体的替代代码。譬如对print库函数,可以把它的替代代码写成空语句,这样,程序分析或验证工具(简称分析器)在处理它时,就可以简单地对它做空语句处理,从而让分析或验证进行下去而不影响对所关注特征的处理。但是,该方法使用被分析程序的原语言只能描述原语言内部的实体,不能描述实体的安全特征以及实体与外部环境之间的关系,使得影响程序分析或验证的准确度。
发明内容
有鉴于此,本发明实施例提供了一种程序的安全分析方法,以解决现有技术中程序分析的准确度低的技术问题。该方法包括:
获取待分析程序涉及的程序实体和漏洞的描述数据,其中,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句,所述实体描述语句是根据程序实体的实体描述语句模板生成的,所述实体描述语句模板是根据程序实体的各个第一语义要素项按照语句的语义规则形成的描述语句,在所述实体描述语句模板中用预设符号标记各个所述第一语义要素项形成各个第一替换项,所述实体描述语句模板中的各个所述第一替换项允许替换为对应第一语义要素项的内容以生成所述实体描述语句,对所述第一语义要素项中的内容项的描述包括至少一个第一子描述语句,每个第一子描述语句用于描述一个安全特征或一个语义特征或一个允许被外部程序调用的回调函数;所述漏洞描述语句是根据漏洞的漏洞描述语句模板生成的,所述漏洞描述语句模板是根据漏洞的各个第二语义要素项按照语句的语义规则形成的描述语句,在所述漏洞描述语句模板用预设符号标记各个所述第二语义要素项形成各个第二替换项,所述漏洞描述语句模板中的各个所述第二替换项允许替换为对应第二语义要素项的内容以生成所述漏洞描述语句,对所述第二语义要素项中的内容项的描述包括至少一个第二子描述语句,每个第二子描述语句用于描述一个漏洞特征;或者,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板;
在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句时,根据所述实体描述语句构造实体数据,根据所述漏洞描述语句构造漏洞数据;在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板时,根据所述实体描述语句模板生成所述实体描述语句,并根据所述实体描述语句构造实体数据,根据所述漏洞描述语句模板生成所述漏洞描述语句,并根据所述漏洞描述语句构造漏洞数据;
接收分析器发来的获取数据的请求;
根据所述请求从所述实体数据中获取对应的实体数据,和/或,根据所述请求从所述漏洞数据中获取对应的漏洞数据,并将获取的实体数据和/或获取的漏洞数据返回给所述分析器进行安全分析。
本发明实施例还提供了一种程序的安全分析系统,以解决现有技术中程序分析的准确度低的技术问题。该系统包括:
文档获取单元,用于获取待分析程序涉及的程序实体和漏洞的描述数据,其中,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句,所述实体描述语句是根据程序实体的实体描述语句模板生成的,所述实体描述语句模板是根据程序实体的各个第一语义要素项按照语句的语义规则形成的描述语句,在所述实体描述语句模板中用预设符号标记各个所述第一语义要素项形成各个第一替换项,所述实体描述语句模板中的各个所述第一替换项允许替换为对应第一语义要素项的内容以生成所述实体描述语句,对所述第一语义要素项中的内容项的描述包括至少一个第一子描述语句,每个第一子描述语句用于描述一个安全特征或一个语义特征或一个允许被外部程序调用的回调函数;所述漏洞描述语句是根据漏洞的漏洞描述语句模板生成的,所述漏洞描述语句模板是根据漏洞的各个第二语义要素项按照语句的语义规则形成的描述语句,在所述漏洞描述语句模板用预设符号标记各个所述第二语义要素项形成各个第二替换项,所述漏洞描述语句模板中的各个所述第二替换项允许替换为对应第二语义要素项的内容以生成所述漏洞描述语句,对所述第二语义要素项中的内容项的描述包括至少一个第二子描述语句,每个第二子描述语句用于描述一个漏洞特征;或者,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板;
数据构造单元,用于在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句时,根据所述实体描述语句构造实体数据,根据所述漏洞描述语句构造漏洞数据;在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板时,根据所述实体描述语句模板生成所述实体描述语句,并根据所述实体描述语句构造实体数据,根据所述漏洞描述语句模板生成所述漏洞描述语句,并根据所述漏洞描述语句构造漏洞数据;
请求接收单元,用于接收分析器发来的获取数据的请求;
安全分析单元,用于根据所述请求从所述实体数据中获取对应的实体数据,和/或,根据所述请求从所述漏洞数据中获取对应的漏洞数据,并将获取的实体数据和/或获取的漏洞数据返回给所述分析器进行安全分析。
本发明实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任意的程序的安全分析方法,以解决现有技术中程序分析的准确度低的技术问题。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述任意的程序的安全分析方法的计算机程序,以解决现有技术中程序分析的准确度低的技术问题。
与现有技术相比,本说明书实施例采用的上述至少一个技术方案能够达到的有益效果至少包括:提出了描述数据包括待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句,实体描述语句是根据程序实体的实体描述语句模板生成的,实体描述语句模板是根据程序实体的各个第一语义要素项按照语句的语义规则形成的描述语句,在实体描述语句模板中用预设符号标记各个第一语义要素项形成各个第一替换项,实体描述语句模板中的各个第一替换项允许替换为对应第一语义要素项的内容以生成实体描述语句,对第一语义要素项中的内容项的描述包括至少一个第一子描述语句,每个第一子描述语句用于描述一个安全特征或一个语义特征或一个允许被外部程序调用的回调函数;漏洞描述语句是根据漏洞的漏洞描述语句模板生成的,漏洞描述语句模板时根据漏洞的各个第二语义要素项按照语句的语义规则形成的描述语句,在漏洞描述语句模板用预设符号标记各个第二语义要素项形成各个第二替换项,漏洞描述语句模板中的各个第二替换项允许替换为对应第二语义要素项的内容以生成漏洞描述语句,对所述第二语义要素项中的内容项的描述包括至少一个第二子描述语句,每个第二子描述语句用于描述一个漏洞特征;或者,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板,实现的程序实体的实体描述语句包括了程序实体的第一语义要素项、安全特征、语义特征以及回调函数(体现了程序实体与外部环境(程序)之间的关系)等信息的描述,使得可以更全面、准确地描述待分析程序使用的程序实体;同时,实现的漏洞描述语句包括了漏洞的第二语义要素项、漏洞特征等信息的描述,使得可以更全面、准确地描述待分析程序的漏洞;进而基于更全面、准确地实体描述语句和漏洞描述语句分别构造实体数据和漏洞数据,有利于得到准确的实体数据和漏洞数据,进而基于准确的实体数据和/或漏洞数据对待分析程序进行安全分析(或验证),有利于提高安全分析的准确性;此外,通过采用实体描述语句和漏洞描述语句的形式描述程序实体和漏洞,实现了采用与待分析程序原语言相独立、且逻辑简洁严谨的符号体系方式来描述程序实体和漏洞,有利于降低描述文档的篇幅、数据量,进而有利于提高安全分析的效率,便于维护和调试。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本发明实施例提供的一种程序的安全分析方法的流程图;
图2是本发明实施例提供的一种实施上述程序的安全分析方法的流程示意图;
图3是本发明实施例提供的一种计算机设备的结构框图;
图4是本发明实施例提供的一种程序的安全分析系统的结构框图。
具体实施方式
下面结合附图对本申请实施例进行详细描述。
以下通过特定的具体实例说明本申请的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本申请的其他优点与功效。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。本申请还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本申请的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在本发明实施例中,提供了一种程序的安全分析方法,如图1所示,该方法包括:
步骤S101:获取待分析程序涉及的程序实体和漏洞的描述数据,其中,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句,所述实体描述语句是根据程序实体的实体描述语句模板生成的,所述实体描述语句模板是根据程序实体的各个第一语义要素项按照语句的语义规则形成的描述语句,在所述实体描述语句模板中用预设符号标记各个所述第一语义要素项形成各个第一替换项,所述实体描述语句模板中的各个所述第一替换项允许替换为对应第一语义要素项的内容以生成所述实体描述语句,对所述第一语义要素项中的内容项的描述包括至少一个第一子描述语句,每个第一子描述语句用于描述一个安全特征或一个语义特征或一个允许被外部程序调用的回调函数;所述漏洞描述语句是根据漏洞的漏洞描述语句模板生成的,所述漏洞描述语句模板是根据漏洞的各个第二语义要素项按照语句的语义规则形成的描述语句,在所述漏洞描述语句模板用预设符号标记各个所述第二语义要素项形成各个第二替换项,所述漏洞描述语句模板中的各个所述第二替换项允许替换为对应第二语义要素项的内容以生成所述漏洞描述语句,对所述第二语义要素项中的内容项的描述包括至少一个第二子描述语句,每个第二子描述语句用于描述一个漏洞特征;或者,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板;
步骤S102:在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句时,根据所述实体描述语句构造实体数据,根据所述漏洞描述语句构造漏洞数据;在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板时,根据所述实体描述语句模板生成所述实体描述语句,并根据所述实体描述语句构造实体数据,根据所述漏洞描述语句模板生成所述漏洞描述语句,并根据所述漏洞描述语句构造漏洞数据;
步骤S103:接收分析器发来的获取数据的请求;
步骤S104:根据所述请求从所述实体数据中获取对应的实体数据,和/或,根据所述请求从所述漏洞数据中获取对应的漏洞数据,并将获取的实体数据和/或获取的漏洞数据返回给所述分析器进行安全分析。
由图1所示的流程可知,在本发明实施例中,实现的程序实体的实体描述语句包括了程序实体的第一语义要素项、安全特征、语义特征以及回调函数(体现了程序实体与外部环境(程序)之间的关系)等信息的描述,使得可以更全面、准确地描述待分析程序使用的程序实体;同时,实现的漏洞描述语句包括了漏洞的第二语义要素项、漏洞特征等信息的描述,使得可以更全面、准确地描述待分析程序的漏洞;进而基于更全面、准确地实体描述语句和漏洞描述语句分别构造实体数据和漏洞数据,有利于得到准确的实体数据和漏洞数据,进而基于准确的实体数据和/或漏洞数据对待分析程序进行安全分析(或验证),有利于提高安全分析的准确性;此外,通过采用实体描述语句和漏洞描述语句的形式描述程序实体和漏洞,实现了采用与待分析程序原语言相独立、且逻辑简洁严谨的符号体系方式来描述程序实体和漏洞,有利于降低描述文档的篇幅、数据量,进而有利于提高安全分析的效率,便于维护和调试。
具体实施时,上述描述数据可以是文档或其他数据体现形式的数据。该描述数据可以存储在描述库中,该描述库包括多个程序实体的实体描述语句或实体描述语句模板,包括多个漏洞的漏洞描述语句或漏洞描述语句模板,在需要构造不同软件程序的实体数据时,均可以从该描述库获取不同软件程序各自所使用软件实体对应的实体描述语句或实体描述语句模板,以构造实体数据;同理,在需要构造不同软件程序的漏洞数据时,均可以从该描述库获取不同软件程序各自所存在的漏洞对应的漏洞描述语句或漏洞描述语句模板,以构造漏洞数据。
具体实施时,上述实体描述语句、漏洞描述语句、第一子描述语句、第二子描述语句是指能够被运行系统所识别的语句。
具体实施时,程序实体(即指待分析程序所使用的程序实体)包括变量、函数、对象、类、模块(module)、包(package)和命名空间(namespace)等,以下分别以不同的程序实体为例,来介绍不同的程序实体的实体描述语句(在不同程序实体的实体描述语句中,第一语义要素项中的编程语言项对应的第一替换项统一用<prefix>表示,第一语义要素项中的名称项对应的第一替换项统一用<name>表示,第一语义要素项中的标识项对应的第一替换项统一用<id>表示)。例如,
当程序实体为变量时,变量的实体描述语句模板可以表示如下:
<prefix>Variable(<name>,<id>)<VarSpecs>;
其中,<>表示尖括号,所述预设符号为尖括号(具体实施时,预设符号可以为尖括号、方括号等与描述语句模板中已存的符号不重复的符号);<prefix>为变量的所述第一语义要素项中编程语言项对应的第一替换项,用于指定(或允许替换为)变量所用的编程语言;<name>为变量的所述第一语义要素项中名称项对应的第一替换项,用于指定变量的名字;<id>为变量的所述第一语义要素项中标识项对应的第一替换项,用于指定变量的唯一标识符;<VarSpecs>为变量的所述第一语义要素项中内容项对应的第一替换项,用于指定变量的至少一个变量规约,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合(在根据实体描述语句模板生成实体描述语句的过程中,各个第一子描述语句中的替换项允许替换为对应特征的内容);
该第一子描述语句用于描述变量的别名:alias<Alias>,其中,<Alias>为变量的别名对应的替换项,允许替换为变量的别名内;
该第一子描述语句用于描述变量是一个回调函数:callback {<FunctionDescription>},其中,<FunctionDescription>为回调函数对应的替换项,允许替换为回调函数的描述语句内容;
该第一子描述语句用于描述变量的值是另外一个id为<IdRef>的对象:referTo<IdRef>,其中,<IdRef>为另外一个id对应的替换项,允许替换为另外一个id的内容;
该第一子描述语句用于描述变量是一个有多个污染标签的污染源:sources<tags>,其中,<tags>是多个污染标签对应的替换项,允许替换为多个污染标签的内容;
该第一子描述语句用于描述变量是一个污染坑:sinkSpec {<SinkSpec>},其中,<SinkSpec>是描述污染坑规约对应的替换项,允许替换为污染坑规约的描述语句内容:
该描述语句用于描述污染坑规约的id,用以区分同一个变量的多个污染坑规约:id(<Id>),其中,<Id>是污染坑规约的id对应的替换项,允许替换为污染坑规约的id内容;
该描述语句用于描述与该污染坑规约关联的一个或多个缺陷的id:idissues(<IssueIDs>),其中,<IssueIDs>是与该污染坑规约关联的一个或多个缺陷的id对应的替换项,允许替换为一个或多个缺陷的id内容;
该描述语句用于描述该污染坑规约成立的条件:where<Language>{<Condition>},其中,<Language>是指定书写<Condition>函数的编程语言对应的替换项,允许替换为指定书写<Condition>函数的编程语言;<Condition>是描述一个返回布尔值的函数对应的替换项,允许替换为返回布尔值的函数的函数体,当返回值为真时,该污染坑规约成立,该变量是一个污染坑;否则,该污染坑规约不成立,该变量不是一个污染坑;
该第一子描述语句用于描述变量的数值类型:type<T>,其中,<T>是变量的数值类型对应的替换项,允许替换为变量的数值类型内容;
该第一子描述语句用于描述变量的值:value<V>,其中,<V>是变量的值对应的替换项,允许替换为变量的值。
A、具体实施时,变量的实体描述语句模板的具体内容可以表示如下:
A1、变量的实体描述语句模板:
<prefix>Variable(<name>,<id>)<VarSpecs>;
其内容说明如下:
尖括号<>:表示该部分文本需要根据具体情况填充内容;
实体描述语句模板中除了尖括号之外的其余部分不可改变;
A1.1、<prefix>(即上述编程语言项对应的第一替换项)指定变量所适用的编程语言,为空表示适用于所有编程语言,可选的语言包括但不限于以下符号:js/javascript,py/python,php,ruby,c,cpp,java,go,scala,kt/kotlin;
A1.2、<name>(即上述名称项对应的第一替换项)指定变量的名字,是双引号括起来的字符串;
A1.3、<id>(即上述标识项对应的第一替换项)指定变量的唯一标识符,是双引号括起来的字符串;当该部分省略时,<name>后面的逗号也一并省略;<id>的内容包括但不限于以下内容:
(1)“<name>.id”;
(2)“<NamePrefix>.<name>.id”,其中,<NamePrefix>是<name>所在的全名称的前缀,包括但不限于命名空间名称、包名称和模块名称;
(3)随机生成的唯一UUID标识符,其长度包括但不限于128、256或512位;
A1.4、<VarSpecs>(即上述内容项对应的第一替换项)指定该变量的一个或多个变量规约(即安全特征,语义特征或允许被外部程序调用的回调函数);
A2、用于描述每个变量规约的第一子描述语句(在第一子描述语句中尖括号括起来的为安全特征项或允许被外部程序调用的回调函数项,该尖括号也允许填充对应安全特征项或回调函数项的内容)如下,上述内容项的内容包括但不限于以下任意一项或任意组合:
A2.1、alias<Alias>:描述该变量的别名(即语义特征),<Alias>是双括号括起来的字符串;
A2.2、callback {<FunctionDescription>}:描述该变量是一个回调函数,对回调函数的描述方法同步骤B3;
A2.3、referTo<IdRef>:描述该变量的值是另外一个id为<IdRef>的对象;
A2.4、source<tag>:描述该变量是一个污染源(与污染源相关的特征即安全特征),即污染路径起点,标签<tag>的值包括但不限于一个污染源的标签字符串和一个特定的污染标签类型;
A2.5、sources<tags>:描述该变量是一个污染源,有多个污染标签;
A2.6、sinkSpec {<SinkSpec>}:描述该变量是一个污染坑,即污染路径终点,其污染坑规约<SinkSpec>包含但不限于如下子句:
A2.6.1、id(<Id>):描述污染坑规约的id,用以区分同一个变量的多个污染坑规约,包括但不限于字符串;
A2.6.2、issues(<IssueIDs>):描述与该污染坑规约关联的一个或多个缺陷的id,该污染坑规约是导致这些缺陷的原因;
A2.6.3、where<Language>{<Condition>}:描述该污染坑规约成立的条件;<Language>用于指定书写<Condition>函数(即回调函数)的编程语言,内容同步骤A1.1,为空时表示该语言由处理指令指定,详见步骤G2;<Condition>是一个返回布尔值的函数,当返回值为真时,该规范成立,该变量是一个污染坑;否则,该规范不成立,该变量不是一个污染坑;<Condition>函数的参数包含但不限于以下内容:
(1)一个参数<tags>:该参数是所述变量的污染标签;
(2)三个参数<tags>,<args>,<node>:<tags>是所述变量的污染标签;<args>是包含所述参数变量的函数的所有实参值;<node>是对所述函数调用的语法树节点;
A2.7、static<true | false>:描述该变量是个类变量还是对象成员变量;
竖线 |:表示在提供的选项中选择一个;
当选项为true时,该变量为类变量;
当选项为false时,该变量为对象成员变量;
A2.8、type<T>:描述该变量的数值类型,<T>包含但不限于如下内容:
bigint:大整型,数字达到或超过15位的整数;
boolean:布尔类型;
float:浮点类型;
integer:整数类型;
number:数字类型;
string:字符串类型;
undefined:undefined类型;
null:null类型;
void:void类型;
Symbol:符号类型,该类型的值具有唯一性,任何两两取值互不相等;
Object:对象类型;
unknown:未知类型;
integer<8|16|32|64|128>:特定位数有符号整数类型;
unsigned<8|16|32|64|128>:特定位数无符号整数类型;
float<32|64|128|256>:特定位数浮点类型;
Array:数组类型;
A2.9、value<V>:描述该变量的值,<V>包含但不限于如下内容:
AnyBoolean:代表任意一个布尔值;
AnyNumber:代表任意一个整数或浮点数的值;
AnyString:代表任意一个字符串;
AnyObject:代表任意一个对象;
AnyValue:代表任意一个值;
Undefined:该变量的值是Undefined,代表该变量没有被定义;
Null:该变量的值是Null;
AnyInteger:代表任意一个有符号整数值;
AnyUnsignedInteger:代表任意一个无符号整数值;
AnyInteger<8|16|32|64|128>:代表任意一个特定位数有符号整数值;
AnyUnsigned<8|16|32|64|128>:代表任意一个特定位数无符号整数值;
AnyFloat:代表任意一个浮点值;
AnyFloat<32|64|128|256>:代表任意一个特定位数浮点值。
例如,当程序实体为函数时,函数的实体描述语句模板可以表示如下:
当程序实体为函数时,函数分为入口函数和普通函数,
入口函数的实体描述语句模板如下:
<prefix>EntryFunction(<name>,<id>){<FunctionDescription>};
普通函数的实体描述语句模板如下:
<prefix>Function(<name>,<id>) {<FunctionDescription>};
其中,<prefix>为函数的所述第一语义要素项中编程语言项对应的第一替换项,用于指定(或允许替换为)函数所用的编程语言;<name>为函数的所述第一语义要素项中名称项对应的第一替换项,用于指定函数的名字;<id>为函数的所述第一语义要素项中标识项对应的第一替换项,用于指定函数的唯一标识符;<FunctionDescription>为函数的所述第一语义要素项中内容项对应的第一替换项,用于指定函数的至少一个内容特征,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合;
该第一子描述语句用于指定所描述函数的参数:<ArgN>;
该第一子描述语句用于描述参数的规约:<VarSpecs>;
该第一子描述语句用于指定该函数的返回值:returnValue<V>,其中,<V>是函数的返回值对应的替换项,允许替换为函数的返回值;
该第一子描述语句用于描述函数的函数体代码和编写函数体的编程语言:body<Language>{<Code>},其中,<Language>是书写<Code>的编程语言对应的替换项,允许替换为指定书写<Code>的编程语言;<Code>是实现该函数的函数体代码对应的替换项,允许替换为该函数的函数体代码;
该第一子描述语句用于描述函数有污染清除或者污染添加作用:cleanse(<ArgN>)<TagChanges>,其中,<ArgN>是指定的函数的某个参数、返回值或对象对应的替换项,允许替换为指定的函数的参数、返回值或对象,<TagChanges>是污染标签的增减对应的替换项,允许替换为指定污染标签的增减内容;
该第一子描述语句用于描述函数把污染标签从源参数<ArgM>传递到目标参数<ArgN>:relay(<ArgM>,<ArgN>)<TagChanges><WhereClause>,其中,<WhereClause>是该污染传递成立的条件对应的替换项,允许替换为指定的该污染传递成立的条件内容,<ArgM>是源参数对应的替换项,允许替换为源参数内容,<ArgN>是目标参数对应的替换项,允许替换为目标参数内容;
该第一子描述语句用于描述函数把污染标签从源参数<ArgM>传递到目标对象<ArgO>的目标属性<ArgF>:relay(<ArgM>,<ArgO>,<ArgF>)<TagChanges><WhereClause>,其中,目标对象<ArgO>的目标属性<ArgF>记为<ArgO>.<ArgF>,<ArgO>是目标对象对应的替换项,允许替换为目标对象的内容,<ArgF>是目标属性对应的替换项,允许替换为目标属性的内容;
该第一子描述语句用于描述对函数的调用会引发的安全风险:warnAlways(<IssueIDs>),其中,分析器需要基于安全风险发出告警,并将告警和<IssueIDs>里面指定的缺陷id关联起来。
B、具体实施时,函数的实体描述语句模板的具体内容可以表示如下:
B1、函数分为入口函数和普通函数;入口函数是指在被分析程序中定义、被程序外部环境调用的函数,譬如C里面的main函数、事件响应函数等;除了入口函数之外的其他函数都是普通函数;
B2、入口函数的实体描述语句模板的内容如下:
<prefix>EntryFunction(<name>,<id>) {<FunctionDescription>};
普通函数的实体描述语句模板的内容如下:
<prefix>Function(<name>,<id>) {<FunctionDescription>}
其中,<prefix>(即上述函数的编程语言项对应的第一替换项)指定函数所适用的编程语言,内容同步骤A1.1;
<name>(即上述函数的名称项对应的第一替换项)指定函数的名字,是双引号括起来的字符串;
<id>(即上述函数的标识项对应的第一替换项)指定函数的唯一标识符,内容同步骤A1.3;
<FunctionDescription>(即上述函数的内容项对应的第一替换项)是对该函数的详细描述,由一个或多个函数内容(即上述内容特征)的第一子描述语句组成;
B3、函数内容的描述语句包括描述函数的参数、返回值、函数体和污染特征等内容特征的第一子描述语句如下,上述函数的内容项对应的第一替换项可以包括但不限于以下任意一项或任意组合:
B3.1、<ArgN><VarSpecs>:描述函数的参数,具体内容如下:
B3.1.1、<ArgN>指定所描述的参数,有三种指定方法:
B3.1.1.3、Arg<name>:指定名字是<name>的参数,<name>是双引号括起来的字符串;
B3.1.2、<VarSpecs>描述该参数的规约,描述方法同步骤A1.2;
B3.2、returnValue<V>:指定该函数的返回值,<V>的描述方法同步骤A2.9,为空表示无返回值;
B3.3、body<Language>{<Code>}:描述该函数的函数体代码和编写该函数体的编程语言;<Language>用于指定书写<Code>的编程语言,内容同步骤A1.1;为空代表该语言由步骤G2中的指令规定;<Code>是实现该函数的代码,具体内容不限;
B3.4、cleanse(<ArgN>)<TagChanges>:描述该函数有污染清除或者污染添加作用;<ArgN>指定该函数的某个参数、返回值或对象,内容同B3.1.1,<TagChanges>指定污染标签的增减,内容如下:
B3.4.1、{ +<tag>, …, -<tag>, … }:描述一个或多个污染标签的增减,+<tag>表示增加污染标签<tag>,-<tag>表示清除污染标签<tag>;<TagChanges>为空表示清除所有污染标签;
B3.5、relay(<ArgM>,<ArgN>)<TagChanges><WhereClause>:描述该函数把污染标签从源参数<ArgM>传递到目标参数<ArgN>;
B3.5.1、<ArgM>和<ArgN>的取值含义如下:
为Return时,表示函数返回值;
为字符串时,表示对象的一个具体属性;
为<ArgM>[<ArgN>]形式时,表示函数参数<ArgM>的<ArgN>参数;
为argIndex符号时表示一个参数索引变量,其约束条件由后面的<WhereClause>指定,其它取值描述同步骤B3.1.1;
B3.5.2、<TagChanges>指定传递过程中引起的污染标签的增减,为空时表示没有污染标签的增减,其它内容同步骤B3.4;
B3.5.3、<WhereClause>指定该污染传递成立的条件,为空代表无条件的污染传递,其它形式包括但不限于以下内容:
B3.5.3.1、where {<Condition>}:<Condition>是一个返回布尔值的函数,为真表示污染传递成立;否则不成立;该函数的参数是一个参数索引和调用该函数的实参数组;
B3.5.3.2、whereIndex {<Condition>}:<Condition>是一个返回布尔值的函数,为真表示污染传递成立;否则不成立;该函数的参数是一个参数索引;
B3.5.3.3、whereNode {<Condition>}:<Condition>是一个返回布尔值的函数,为真表示污染传递成立;否则不成立;该函数的参数是调用该函数的语法树节点;
B3.5.3.4、whereTags {<Condition>}:<Condition>是一个返回布尔值的函数,为真表示污染传递成立;否则不成立;该函数的参数是污染标签值;
B3.6、relay(<ArgM>,<ArgO>,<ArgF>)<TagChanges><WhereClause>:描述该函数把污染标签从源参数<ArgM>传递到<ArgO>目标对象的<ArgF>目标属性,<ArgO>目标对象的<ArgF>目标属性记为<ArgO>.<ArgF>;<TagChanges>和<WhereClause>的内容同步骤B3.5;
B3.7、warnAlways(<IssueIDs>):描述对该函数的调用会引发的安全风险,分析器需要发出告警,并把该告警和<IssueIDs>里面指定的缺陷id关联起来,对<IssueIDs>的描述同步骤B2.6.2。
具体实施时,当程序实体为对象(对象和类统称为对象)时,对象的实体描述语句模板如下:
<prefix>Object(<name>,<id>) {<ObjectDescription>};
其中,<prefix>是对象的所述第一语义要素项中编程语言项对应的第一替换项,用于指定该对象所适用的编程语言;
<name>是对象的所述第一语义要素项中名称项对应的第一替换项,用于指定该对象的名字;
<id>是对象的所述第一语义要素项中标识项对应的第一替换项,用于指定函数的唯一标识符;
<ObjectDescription>是对象的所述第一语义要素项中内容项对应的第一替换项,用于描述该对象的一个或多个对象内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:
该第一子描述语句用于描述对象的别名:alias<Alias>,其中,<Alias>为对象的别名对应的替换项,允许替换为对应的别名内容;
该第一子描述语句用于描述该对象的一个非回调函数成员变量:field(<name>,<id>)<VarSpecs>,其中,<name>是该成员变量的名字对应的替换项,允许替换为该成员变量的名字内容;<id>是该成员变量的唯一标识符对应的替换项,允许替换为该成员变量的唯一标识符;<VarSpecs>是该成员变量的变量规约对应的替换项,允许替换为该成员变量的变量规约内容;
该第一子描述语句用于描述该对象的一个回调函数成员变量:callback(<name>,<id>) {<FunctionDescription>},其中,<FunctionDescription>是该回调函数的描述对应的替换项,允许替换为该回调函数的描述语句内容;
该第一子描述语句用于描述该对象的一个成员方法:method(<name>,<id>) {<FunctionDescription>},其中,<FunctionDescription>是该成员方法的描述对应的替换项,允许替换为该成员方法的描述语句内容;
该第一子描述语句用于描述该对象的构造函数:new<Language>{<Code>};
该第一子描述语句用于描述该对象名作为函数调用时的污染标签增减情况:cleanse(<ArgN>)<TagChanges>;
该第一子描述语句用于描述该对象名作为函数调用时把污染标签从源参数<ArgM>传递到目标参数<ArgN>:relay(<ArgM>,<ArgN>)<TagChanges><WhereClause>;
该第一子描述语句用于描述该对象名作为函数调用时把污染标签从源参数<ArgM>传递到目标对象<ArgO>的目标属性<ArgF>:relay(<ArgM>,<ArgO>,<ArgF>)<TagChanges><WhereClause>;
该第一子描述语句用于描述该对象名作为函数调用时需要告警,warnAlways(<IssueIDs>);
该第一子描述语句用于描述该对象是否有名字可变的动态属性:dynamicField<V>。
C、例如,实体为对象(对象和类统称为对象)时,对象的实体描述语句模板的具体内容可以表示如下:
C1、对象的实体描述语句的内容如下:
<prefix>Object(<name>,<id>) {<ObjectDescription>};
其中,<prefix>(即对象的第一语义要素项中的编程语言项)指定该对象所适用的编程语言,内容同步骤A1.1;
<name>(即对象的第一语义要素项中的名称项)指定该对象的名字,是双引号括起来的字符串;
<id>(即对象的第一语义要素项中的标识项)指定函数的唯一标识符,内容同步骤A1.3;
<ObjectDescription>(即对象的第一语义要素项中的内容项)是对该对象的描述,由一个或多个描述对象内容(如对象的成员变量和成员方法)的第一子描述语句组成;
C2、上述内容项可以包括如下描述对象的成员变量和成员方法的第一子描述语句的任意一项或任意组合:
C2.1、alias<Alias>:描述该对象的别名,是双括号括起来的字符串;
C2.2、field(<name>,<id>)<VarSpecs>:描述该对象的一个非回调函数成员变量,<name>是该成员变量的名字,是双括号括起来的字符串;<id>是该成员变量的唯一标识符,内容包括但不限于名字字符串和UUID标识符;<VarSpecs>是该成员变量的变量规约,描述方法同步骤A1.2;
C2.3、callback(<name>,<id>) {<FunctionDescription>}:描述该对象的一个回调函数成员变量,<name>和<id>内容同步骤C2.2;<FunctionDescription>是对该回调函数的描述,方法同步骤B3;
C2.4、method(<name>,<id>) {<FunctionDescription>}:描述该对象的一个成员方法,<name>和<id>内容规定同步骤C2.2;<FunctionDescription>是对该成员方法的描述,方法同步骤B3;
C2.5、new<Language>{<Code>}:描述该对象的构造函数,对<Language>和<Code>的规定同步骤B3.3;
C2.6、cleanse(<ArgN>)<TagChanges>:描述该对象名作为函数调用时的污染标签增减情况,方法同步骤B3.4;
C2.7、relay(<ArgM>,<ArgN>)<TagChanges><WhereClause>:描述该对象名作为函数调用时的污染标签传递特征,内容同步骤B3.5;
C2.8、relay(<ArgM>,<ArgO>,<ArgF>)<TagChanges><WhereClause>:描述该对象名作为函数调用时的污染标签传递特征,内容同步骤B3.6;
C2.9、warnAlways(<IssueIDs>):描述该对象名作为函数调用时需要告警,内容同步骤B3.7;
C2.10、dynamicField<V>:描述该对象是否有名字可变的动态属性,以及它们的取值<V>,<V>的描述方法同步骤A2.9。
具体实施时,当程序实体为命名空间时,命名空间的实体描述语句模板如下:
<prefix>Namesapce(<name>,<id>) {<NamespaceDescription>};
其中,<prefix>是命名空间的所述第一语义要素项中编程语言项对应的第一替换项,用于指定命名空间所用的编程语言;<name>是命名空间的所述第一语义要素项中名称项对应的第一替换项,用于指定命名空间的名字;<id>是命名空间的所述第一语义要素项中标识项对应的第一替换项,用于指定命名空间的唯一标识符;
<NamespaceDescription>是命名空间的所述第一语义要素项中内容项对应的第一替换项,用于描述该命名空间的一个或多个内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:程序实体为变量的实体描述语句模板,程序实体为函数的实体描述语句模板,程序实体为对象的实体描述语句模板,以及嵌套的命名空间的实体描述语句模板;
当程序实体为包时,包的实体描述语句模板如下:
<prefix>Package(<name>,<id>) {<PackageDescription>};
其中,<prefix>是包的所述第一语义要素项中编程语言项对应的第一替换项,用于指定该包所用的编程语言;<name>是包的所述第一语义要素项中名称项对应的第一替换项,用于指定该包的名字;<id>是包的所述第一语义要素项中标识项对应的第一替换项,用于指定包的唯一标识符;
<PackageDescription>是包的所述第一语义要素项中内容项对应的第一替换项,用于描述该包的一个或多个包内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:程序实体为变量的实体描述语句模板,程序实体为函数的实体描述语句模板,程序实体为对象的实体描述语句模板;
当程序实体为模块时,模块的实体描述语句模板如下:
<prefix>Module(<name>,<id>) {<ModuleDescription>};
其中,<prefix>是模块的第一语义要素项中编程语言项对应的第一替换项,用于指定该模块所用的编程语言;<name>是模块的所述第一语义要素项中名称项对应的第一替换项,用于指定该模块的名字;<id>是模块的第一语义要素项中编标识项对应的第一替换项,用于指定模块的唯一标识符;
<ModuleDescription>是模块的第一语义要素项中的内容项对应的第一替换项,用于描述该模块的一个或多个模块内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:程序实体为变量的实体描述语句模板,程序实体为函数的实体描述语句模板,程序实体为对象的实体描述语句模板;
该第一子描述语句描述模块的缓存方式:cached<true | false>,其中,参数为true时,该模块只装载一次并被缓存,后续引用相同副本;描述参数为false时,该模块不被缓存。
D、例如,实体为命名空间、包或模块时,命名空间、包或模块的实体描述语句模板的具体内容可以表示如下:
D1、命名空间的实体描述语句模板的内容可以表示如下:
<prefix>Namesapce(<name>,<id>) {<NamespaceDescription>};
其中,<prefix>(即命名空间的第一语义要素项中的编程语言项)、<name>(即命名空间的第一语义要素项中的名称项)和<id>(即命名空间的第一语义要素项中的标识项)的描述方法同步骤B1;
<NamespaceDescription>(即命名空间的第一语义要素项中的内容项)是对该命名空间的描述,所述的命名空间是一个层次结构的作用域,里面的内容包括但不限于变量、函数、对象和类;变量的描述方法同步骤A,函数的描述方法同步骤B,对象和类的描述方法同步骤C,以及嵌套的命名空间的实体描述语句模板,描述方法同步骤D1;
D2、包的实体描述语句模板的内容可以表示如下:
<prefix>Package(<name>,<id>) {<PackageDescription>};
其中,<prefix>(即包的第一语义要素项中的编程语言项)、<name>(即包的第一语义要素项中的名称项)和<id>(即包的第一语义要素项中的标识项)的描述方法同步骤B1;
<PackageDescription>(即包的第一语义要素项中的内容项)是对该包的描述,所述的包是完成特定功能并组织在一个文件目录下的程序集合;程序里的变量的描述方法同步骤A,函数的描述方法同步骤B,对象和类的描述方法同步骤C;
D3、模块的实体描述语句模板,具体内容如下:
D3.1、模块的实体描述语句模板的内容可以表示如下:
<prefix>Module(<name>,<id>) {<ModuleDescription>};
其中,<prefix>(即模块的第一语义要素项中的编程语言项)、<name>(即模块的第一语义要素项中的名称项)和<id>(即模块的第一语义要素项中的编标识项)的描述方法同步骤B1;
<ModuleDescription>(即模块的第一语义要素项中的内容项)是对该模块的描述,所述的模块是完成特定功能并存在相互调用关系的程序集合;程序里的变量的描述方法同步骤A,函数的描述方法同步骤B,对象和类的描述方法同步骤C;
D3.2、cached<true | false>:该第一子描述语句描述模块的缓存方式,其中,参数为true时表示该模块只装载一次并被缓存,后续引用相同副本;否则,该模块不被缓存。
具体实施时,漏洞(这里将安全漏洞和程序缺陷统一称为漏洞)描述语句模板可以如下:
issue(<id>) {<IssueDescription>};
<id>为漏洞类型的所述第二语义要素项中标识项对应的第二替换项,用于指定(或允许替换为)漏洞的唯一标识符;<IssueDescription>为漏洞类型的所述第二语义要素项中内容项对应的第二替换项,用于指定漏洞类型的至少一个漏洞特征,所述内容项对应的第二替换项包括以下第二子描述语句的任意一项或任意组合:
该第二子描述语句用于描述漏洞的多个别名:alias(<Aliases>),其中,<Aliases>是漏洞的多个别名对应的替换项,允许替换为漏洞的多个别名内容;
该第二子描述语句用于描述漏洞所属类别:category(<C>),其中,<C>是漏洞所属类别对应的替换项,允许替换为漏洞所属类别内容;
该第二子描述语句用于描述漏洞所属子类别:subCategory(<SC>),其中,<SC>是漏洞所属子类别对应的替换项,允许替换为漏洞所属子类别内容;
该第二子描述语句用于描述漏洞所属场景:context(<CX>),其中,<CX>是漏洞所属场景对应的替换项,允许替换为漏洞所属场景内容;
该第二子描述语句用于描述漏洞的名称:name(<N>),其中,<N>是漏洞的名称对应的替换项,允许替换为漏洞的名称内容;
该第二子描述语句用于描述用户自定义的一个或多个ID:userId(<Ids>),其中,用户自定义的一个或多个ID用于和漏洞关联起来,<Ids>是用户自定义的一个或多个ID对应的替换项,允许替换为用户自定义的一个或多个ID内容;
该第二子描述语句用于描述漏洞的严重性:severity(<S>),其中,<S>是漏洞的严重性对应的替换项,允许替换为漏洞的严重性内容;
该第二子描述语句用于描述漏洞的可攻击性:exploitability(<E>),其中,<E>是漏洞的可攻击性对应的替换项,允许替换为漏洞的可攻击性内容;
该第二子描述语句用于描述对漏洞的描述文字:description(<Desc>),其中,<Desc>是漏洞的描述文字对应的替换项,允许替换为对漏洞的描述文字内容;
该第二子描述语句用于描述漏洞的描述文字由id为<DescID>的漏洞描述体提供:descriptionID(<DescID>),其中,<DescID>是漏洞描述体的id对应的替换项,允许替换为对漏洞描述体的id内容;
该第二子描述语句用于描述和漏洞相关联的一个或多个用双引号括起来的CWE编号字符串:cwes(<WX>),其中,<WX>是和漏洞相关联的一个或多个用双引号括起来的CWE编号字符串对应的替换项,允许替换为和漏洞相关联的一个或多个用双引号括起来的CWE编号字符串内容;
该第二子描述语句用于描述和该漏洞相关联的一个或多个用双引号括起来的CVE编号字符串:cves(<VX>),其中,<VX>是和漏洞相关联的一个或多个用双引号括起来的CVE编号字符串对应的替换项,允许替换为和漏洞相关联的一个或多个用双引号括起来的CVE编号字符串内容。
E、具体实施时,漏洞涉及漏洞类型和漏洞实例,针对待分析程序中存在的漏洞类型的漏洞描述语句模板(或漏洞定义语句模板),具体内容如下:
E1、漏洞定义语句模板的内容如下:
issue(<id>) {<IssueDescription>};
其中,<id>(即漏洞类型的第二语义要素项中标识项对应的第二替换项)用于指定漏洞的唯一标识符,是双引号括起来的字符串;所述唯一标识符包括但不限于对该漏洞的描述性字符串和自动生成的UUID;
<IssueDescription>(即漏洞类型的第二语义要素项中内容项对应的第二替换项)是对所述漏洞的特征描述,由一个或多个描述漏洞特征的第二子描述语句组成;
E2、漏洞类型的第二语义要素项中内容项对应的第二替换项可以包括如下描述漏洞特征的第二子描述语句的任意一项或任意组合:
E2.1、alias(<Aliases>):该漏洞的多个别名,每一个用双引号扩起来;
E2.2category(<C>):该漏洞所属类别;
E2.3、subCategory(<SC>):该漏洞所属子类别;
E2.4、context(<CX>):该漏洞所属场景;
E2.5、name(<N>):该漏洞的名称;
E2.6、userId(<Ids>):用户自定义的一个或多个ID,用于和该漏洞关联起来每一个用双引号括起来;
E2.7、severity(<S>):该漏洞的严重性,包括但不限于以下符号:LOW, LESS,MEDIUM, MORE, HIGH;
E2.8、exploitability(<E>):该漏洞的可攻击性,能够被攻击到的难易程度,包括但不限于以下符号: HARD, TOUGH, MEDIUM, FAIR, EASY;
E2.9、description(<Desc>):对该漏洞的描述文字,描述文字<Desc>是用双引号括起来的字符串;
E2.10、descriptionID(<DescID>):该漏洞的描述文字由id为<DescID>的漏洞描述体提供;<DescID>是双引号扩括起来的字符串;
E2.11、cwes(<WX>):和该漏洞相关联的一个或多个用双引号括起来的CWE编号字符串;
E2.12、cves(<VX>):和该漏洞相关联的一个或多个用双引号括起来的CVE编号字符串。
F、具体实施时,漏洞描述体的定义语句模板或描述语句模板定义了一个漏洞描述体,可以用来描述程序中存在的多个漏洞实例,其内容可以表示如下:
issueDescription(<id>)<IssueContent>
其中,<id>(即漏洞描述体的第二语义要素项中标识项对应的第二替换项)是描述漏洞描述体的唯一标识符,是双引号括起来的字符串;所述唯一标识符包括但不限于描述性字符串和自动生成的UUID;
<IssueContent>(即漏洞描述体的第二语义要素项中内容项对应的第二替换项)是描述漏洞描述体内容的,是双引号括起来的字符串。
具体实施时,为了进一步准确的描述、处理程序实体,所述描述数据还可以包括处理指令的指示描述语句模板,所述指示描述语句模板用于生成指示用来书写所述实体描述语句中函数体的编程语言的描述语句,当所述实体描述语句中用来指示书写所述实体描述语句中函数体的编程语言的参数为空时,通过以下指定编程语言指令的描述语句模板确定书写所述实体描述语句中函数所使用的编程语言:
language<Langauge>;
其中,<Langauge>是书写所述实体描述语句中函数体所使用的编程语言对应的替换项,允许替换为指定书写所述实体描述语句中函数体所使用的编程语言;或者;
通过所述分析器决定书写所述实体描述语句中函数体所使用的编程语言。
具体实施时,为了提高基于实体描述语句构造实体数据的准确性、有效性,所述描述文档还可以包括语义规则要求的描述语句,所述语义规则要求的描述语句用于描述不同编程语言的语义规则要求,根据所述实体描述语句构造实体数据,包括:
根据所述第一语义要素项中编程语言项的内容,确定出所述实体描述语句中指定的程序实体所用的编程语言;
基于所述语义规则要求的描述语句,选择确定出的编程语言的语义规则要求的描述语句;
根据选择的语义规则要求的描述语句,判断所述实体描述语句中所述第一语义要素项的内容是否合法;
若是,则根据所述实体描述语句对所述第一语义要素项填充内容,构造实体数据。
具体实施时,为了提高漏洞报告的效率、时效,所述描述文档还可以包括漏洞报告优先级的描述语句,所述漏洞报告优先级的描述语句用于描述报告不同漏洞的优先级顺序。
G、具体实施时,上述描述文档还可以包括处理指令、语义规则要求的合法性规则和漏洞报告优先级等相关规定的描述,例如,
G1、处理指令的指示描述语句模板用于生成指示处理系统如何处理上述实体描述语句的指示描述语句,具体内容可以表示如下:
G1.1、步骤A2.6.3中<Condition>,步骤B3.3和步骤C2.5中的<Code>用<Language>参数来指定书写函数的编程语言,该参数为空时,编程语言由下述方法确定:
G1.1.1、指定编程语言的指令的描述语句模板,其内容为:
language<Langauge>
其中,<Langauge>是书写所述实体描述语句中函数体所使用的编程语言对应的替换项,允许替换为指定书写所述实体描述语句中函数体所使用的编程语言,内容同步骤A1.1;
G1.1.2、分析器自行决定书写所述实体描述语句中函数体所使用的编程语言;
G2、合法性规则描述上述步骤中所述的语句和指令的合法性,所描述的实体特征应当符合步骤A1.1中所指定编程语言的语义规则要求,否则被判定为非法;譬如,对于C程序中整数变量errno的描述,不能指定其类型为字符串;
G3、漏洞报告优先级等其它相关规定
G3.1、漏洞报告优先级
当实体描述语句中warnAlways和其它漏洞关联语句同时出现时,譬如sinkSpec,前者关联的漏洞的报告优先级总是最低,即优先报告其它语句关联的漏洞,不报告与warnAlways相关联的漏洞,除非其它语句的条件不成立。另外,还可以基于漏洞类型定义不同漏洞的报告优先级顺序。
具体实施时,如图2所示,在实施上述程序的安全分析方法的过程(即图2的虚线框内所示的内容)中可以包括以下步骤:
1、描述文档(即上述描述数据)输入和解析
读入、识别和检查描述文档中的实体描述语句和漏洞描述语句(以描述数据包括实体描述语句和漏洞描述语句为例),对不符合语义规则要求的错误语句给出提示;在检查没有错误之后,根据实体描述语句构造实体数据,根据漏洞描述语句构造漏洞数据;
2、实体数据的构造
该过程是基于输入的实体描述语句,输出实体数据(即程序实体),它根据实体描述语句的内容构造不同的实体,具体步骤可以如下:
2.1、当实体描述语句是根据步骤A所述变量的实体描述语句模板生成的实体描述语句,则创建一个抽象变量,其数据包括但不局限于步骤A所描述内容:变量名和别名、变量类型、变量值、如果该变量是个回调函数其回调函数特性、污染源及其标签、污染坑及其标签和规约、是否为静态变量;创建该变量后,把它放入实体数据库中;
2.2、当实体描述语句是根据步骤B所述函数的实体描述语句模板生成的实体描述语句,则创建一个函数,其数据包括但不局限于步骤B所描述内容:函数名、函数参数、函数返回值或函数体代码、污染传播方式、污染清除方式,如果函数有步骤B3.3所述行为,该模块会解释其中代码,把结果作为函数返回值;创建该函数后,把它放入实体数据库中;
该构建函数的过程按下述方式处理函数的污染特征:
2.2.1、污染清除
当函数的实体描述语句包含步骤B3.4所述第一子描述语句时,则将指定的参数中的污染标签按照该步骤中所述方式删除或者添加;
2.2.2、污染传递
当函数的实体描述语句包含步骤B3.5或步骤B3.6所述第一子描述语句时,则将指定的参数中的污染标签按照该步骤中所述方式赋值到指定的目标参数中;
2.3、当实体描述语句是根据步骤C所述对象的实体描述语句模板生成的实体描述语句,则创建一个对象,其数据包括但不局限于步骤C所描述内容:
2.3.1、对象成员:
2.3.1.1、成员变量
当对象的实体描述语句包含步骤C2.2所述第一子描述语句时,则按照步骤2.1所述方法创建一个新的变量,并把它加到新创建的抽象对象中,形成一个成员变量;
2.3.1.2、回调函数成员变量
当对象的实体描述语句包含步骤C2.3所述第一子描述语句时,则按照步骤2.2所述方法创建一个新的函数,并把它的名称作为成员变量加到新创建的抽象对象中,形成一个回调函数成员变量;
2.3.1.3、动态成员变量
当对象的实体描述语句包含步骤C2.10所述第一子描述语句时,则按照步骤2.1所述方法创建一个新的无名变量;标志新创建的抽象对象有动态变量成员,标志方法包括但不限于:
2.3.1.4、成员方法
当对象的实体描述语句包含步骤C2.4所述第一子描述语句时,则按照步骤2.2所述方法创建一个新的函数,并把该函数加到新创建的抽象对象中,形成一个成员函数;
2.3.1.5、构造函数
当对象的实体描述语句包含步骤C2.5所述第一子描述语句时,则按照步骤2.2所述方法创建一个新的函数,并把该函数作为新创建的抽象对象的构造函数加到该对象中;
2.3.2、污染特性:
2.3.2.1、污染清除
当对象的实体描述语句包含步骤C2.6所述第一子描述语句时,则按照步骤2.2.1所述方法清除或者添加污染标签;
2.3.2.2、污染传递
当对象的实体描述语句包含步骤C2.7或步骤C2.8所述第一子描述语句时,则按照步骤2.2.2所述方法在指定的参数实体间传递污染标签;
2.3.3、告警特性:
2.3.3.1、调用告警
当对象的实体描述语句包含步骤C2.9所述第一子描述语句时,则创建一个告警实例;当分析器请求该对象名作为函数调用时,则复制该告警实例并把它返回给分析器;
2.4、当实体描述语句是根据不同步骤D1所述命名空间的实体描述语句模板生成的实体描述语句,则创建一个命名空间,其数据包括但不局限于变量、函数、对象和类、命名空间;变量的创建方法同步骤2.1,函数的创建方法同步骤2.2,对象和类的创建方法同步骤2.3,命名空间的创建方法同本步骤递归进行:
2.5、当实体描述语句是根据步骤D2所述包的实体描述语句模板生成的实体描述语句,则创建一个包,其数据包括但不局限于变量、函数、对象和类;变量的创建方法同步骤2.1,函数的创建方法同步骤2.2,对象和类的创建方法同步骤2.3;
2.6、当实体描述语句是根据步骤D3所述模块的实体描述语句模板生成的实体描述语句,则创建一个模块,其数据包括但不局限于变量、函数、对象和类;变量的创建方法同步骤2.1,函数的创建方法同步骤2.2,对象和类的创建方法同步骤2.3;
3、漏洞数据(即漏洞)构造
该过程基于输入的漏洞定义(或描述)语句,根据漏洞定义(或描述)语句的内容创建不同的漏洞类型,其内容包括但不限于步骤E2所述:别名、类型、子类型、场景、名称、用户标识符、严重性、可攻击性和描述;创建该漏洞类型后,把它放入漏洞数据库中;
4、实体和漏洞访问API
该过程接收分析器对实体数据或漏洞数据的请求,根据请求在相应数据库中获取对应的实体数据或漏洞数据,返回给分析器。
具体实施时,以C语言里面的errno全局变量,介绍上述程序的安全分析方法对变量的描述和处理方法:
errno全局变量的实体描述语句(即根据变量的实体描述语句模板生成的实体描述语句)如下:
cVariable(“errno”, “errno.id”) value AnyInteger;
处理系统(如运行上述程序的安全分析方法的系统)读入和解析该变量的实体描述语句后,创建一个变量,变量名为errno,ID为errno.id,值是AnyInteger,代表任意一个整数值;并把它放入实体数据库;当分析器遇到待分析的程序中引用errno变量时,发请求给处理系统的实体和漏洞访问API,根据请求在实体数据库查询到该变量,把它的值返送给分析器。
具体实施时,以JavaScript语言里面的eval函数为例,介绍上述程序的安全分析方法对函数的描述和处理方法:
eval函数的实体描述语句(即根据函数的实体描述语句模板生成的实体描述语句)如下:
jsFunction(“eval”) {
Arg1 type string sinkSpec {
where { tags ->
Tags.contains(“XSS”)
}
Issues(“Code Injection XSS.id”)
}
warnAlways(“Dynamic Code Execution.id”)
body “kt” { args: Arguments? ->
log.trace(“eval arguments: ” + args?.joinToString()
}
};
处理系统读入和解析该函数的实体描述语句后,创建一个函数,函数名为eval,默认ID为eval.id,并根据函数内容描述语句的内容按照步骤2.2来创建其它函数内容,包括:
(1)根据Arg1子句,创建一个抽象参数作为该函数的第一个参数,该参数的污染特性是:如果传入的第一个参数带有XSS污染标签,则该参数是个污染坑,创建一个漏洞实例,漏洞ID是Code Injection XSS.id,把它包含在返回给分析器的结果中;否则;该参数不是污染坑,不创建漏洞实例;
(2)根据 warnAlways子句,当代码中见到对该函数的调用,就报告一个漏洞,该漏洞是Dynamic Code Execution(动态代码执行);根据warnAlways的报告优先级规定,当步骤2.1中的where条件成立时,其报告优先级最低,不必报告该漏洞;
(3)根据body子句,该函数的函数体是kotlin语言所写,它把该函数被调用时的所有参数记录在日志中;
创建好该函数之后,把它放入实体数据库;当分析器遇到待分析的程序中调用eval函数时,发请求给处理系统的实体和漏洞访问API,根据请求在实体数据库查询到该函数,根据上述内容执行该抽象函数,并根据函数的第一个参数的污染标签是否含有XSS来决定是否创建一个Code Injection XSS.id漏洞实例并返回给分析器。
具体实施时,以JavaScript语言里面的URL对象和URLSearchParams对象为例,介绍上述程序的安全分析方法中对象的描述和处理方法:
URL对象的实体描述语句(即根据对象的实体描述语句模板生成的实体描述语句)如下(只显示部分内容):
jsObject("URL", "URL.id") {
method("createObjectURL") {
Arg1 type JsType.Object sinkSpec {
where { tags ->
!tags.contains("VALIDATED_INJECTION")
}
issues("SecJS_Injection")
}
}
field("searchParams") referTo "URLSearchParams"
relay(Arg1, Self)
relay(Arg2, Self)
relay(Self, "searchParams")
};
URLSearchParams对象的实体描述语句(即根据对象的实体描述语句模板生成的实体描述语句)如下(只显示部分内容):
jsObject("URLSearchParams", "URLSearchParams.id") {
method("get") {
returnValue(AnyString)
relay(Self, Return)
}
};
处理系统读入和解析第一个实体描述语句后,创建一个对象,对象名为URL,ID为URL.id,并按照步骤2.3所述方法来创建其内容,包括:
(1)成员方法createObjectURL,根据method("createObjectURL")子句创建;当该方法的第一个参数的污点标签不包含VALIDATED_INJECTION时是一个污染坑,并和漏洞SecJS_Injection关联起来;
(2)成员变量searchParams,根据field("searchParams") referTo "URLSearchParams"子句创建;该成员变量的值是一个URLSearchParams对象;
(3)污染传递特性由三个relay子句创建,分别表示第一个参数的污染标签传递到该对象本身,第二个参数的污染标签传递到该对象本身,该对象本身的污染标签传递到成员变量searchParams;
创建好该对象之后,把它放入实体数据库;当分析器遇到待分析的程序调用URL函数来创建URL对象时,发请求给处理系统的实体和漏洞访问API,根据请求在实体数据库查询到该对象,复制一个新的URL对象,并根据创建对象的第一个参数的污染标签是否含有VALIDATED_INJECTION来决定是否创建一个SecJS_Injection漏洞实例,并把污染第一和第二个参数的的污染标签传递给该对象,最后把它返回给分析器;
处理系统读入和解析第二个实体描述语句后,创建一个对象,对象名为URLSearchParams,ID为URLSearchParams.id,并按照步骤2.3所述方法来创建其内容,包括:
(1)成员方法get,根据method("get")子句创建;该方法的返回值是AnyString,代表任意字符串;污染传递特性由relay子句创建,把该对象的污染标签传递给该方法的返回值;
创建好该对象之后,把它放入实体数据库;当分析器遇到待分析的程序调用URLSearchParams对象的get函数时,发请求给处理系统的实体和漏洞访问API,根据请求在实体数据库查询到该对象及其函数,根据调用对象的污染标签来决定该函数返回值的污染标签,最后把返回值返回给分析器。
在本实施例中,提供了一种计算机设备,如图3所示,包括存储器301、处理器302及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任意的程序的安全分析方法。
具体的,该计算机设备可以是计算机终端、服务器或者类似的运算装置。
在本实施例中,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述任意的程序的安全分析方法的计算机程序。
具体的,计算机可读存储介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机可读存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读存储介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
基于同一发明构思,本发明实施例中还提供了一种程序的安全分析系统,如下面的实施例所述。由于程序的安全分析系统解决问题的原理与程序的安全分析方法相似,因此程序的安全分析系统的实施可以参见程序的安全分析方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图4是本发明实施例的程序的安全分析系统的一种结构框图,如图3所示,包括:
文档获取单元,用于获取待分析程序涉及的程序实体和漏洞的描述数据,其中,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句,所述实体描述语句是根据程序实体的实体描述语句模板生成的,所述实体描述语句模板是根据程序实体的各个第一语义要素项按照语句的语义规则形成的描述语句,在所述实体描述语句模板中用预设符号标记各个所述第一语义要素项形成各个第一替换项,所述实体描述语句模板中的各个所述第一替换项允许替换为对应第一语义要素项的内容以生成所述实体描述语句,对所述第一语义要素项中的内容项的描述包括至少一个第一子描述语句,每个第一子描述语句用于描述一个安全特征或一个语义特征或一个允许被外部程序调用的回调函数;所述漏洞描述语句是根据漏洞的漏洞描述语句模板生成的,所述漏洞描述语句模板是根据漏洞的各个第二语义要素项按照语句的语义规则形成的描述语句,在所述漏洞描述语句模板用预设符号标记各个所述第二语义要素项形成各个第二替换项,所述漏洞描述语句模板中的各个所述第二替换项允许替换为对应第二语义要素项的内容以生成所述漏洞描述语句,对所述第二语义要素项中的内容项的描述包括至少一个第二子描述语句,每个第二子描述语句用于描述一个漏洞特征;或者,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板;
数据构造单元,用于在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句时,根据所述实体描述语句构造实体数据,根据所述漏洞描述语句构造漏洞数据;在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板时,根据所述实体描述语句模板生成所述实体描述语句,并根据所述实体描述语句构造实体数据,根据所述漏洞描述语句模板生成所述漏洞描述语句,并根据所述漏洞描述语句构造漏洞数据;
请求接收单元,用于接收分析器发来的获取数据的请求;
安全分析单元,用于根据所述请求从所述实体数据中获取对应的实体数据,和/或,根据所述请求从所述漏洞数据中获取对应的漏洞数据,并将获取的实体数据和/或获取的漏洞数据返回给所述分析器进行安全分析。
本发明实施例实现了如下技术效果:实现的程序实体的实体描述语句包括了程序实体的第一语义要素项、安全特征、语义特征以及回调函数(体现了程序实体与外部环境(程序)之间的关系)等信息的描述,使得可以更全面、准确地描述待分析程序使用的程序实体;同时,实现的漏洞描述语句包括了漏洞的第二语义要素项、漏洞特征等信息的描述,使得可以更全面、准确地描述待分析程序的漏洞;进而基于更全面、准确地实体描述语句和漏洞描述语句分别构造实体数据和漏洞数据,有利于得到准确的实体数据和漏洞数据,进而基于准确的实体数据和/或漏洞数据对待分析程序进行安全分析(或验证),有利于提高安全分析的准确性;此外,通过采用实体描述语句和漏洞描述语句的形式描述程序实体和漏洞,实现了采用与待分析程序原语言相独立、且逻辑简洁严谨的符号体系方式来描述程序实体和漏洞,有利于降低描述文档的篇幅、数据量,进而有利于提高安全分析的效率,便于维护和调试。
显然,本领域的技术人员应该明白,上述的本发明实施例的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明实施例不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种程序的安全分析方法,其特征在于,包括:
获取待分析程序涉及的程序实体和漏洞的描述数据,其中,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句,所述实体描述语句是根据程序实体的实体描述语句模板生成的,所述实体描述语句模板是根据程序实体的各个第一语义要素项按照语句的语义规则形成的描述语句,在所述实体描述语句模板中用预设符号标记各个所述第一语义要素项形成各个第一替换项,所述实体描述语句模板中的各个所述第一替换项允许替换为对应第一语义要素项的内容以生成所述实体描述语句,对所述第一语义要素项中的内容项的描述包括至少一个第一子描述语句,每个第一子描述语句用于描述一个安全特征或一个语义特征或一个允许被外部程序调用的回调函数;所述漏洞描述语句是根据漏洞的漏洞描述语句模板生成的,所述漏洞描述语句模板是根据漏洞的各个第二语义要素项按照语句的语义规则形成的描述语句,在所述漏洞描述语句模板用预设符号标记各个所述第二语义要素项形成各个第二替换项,所述漏洞描述语句模板中的各个所述第二替换项允许替换为对应第二语义要素项的内容以生成所述漏洞描述语句,对所述第二语义要素项中的内容项的描述包括至少一个第二子描述语句,每个第二子描述语句用于描述一个漏洞特征;或者,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板;
在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句时,根据所述实体描述语句构造实体数据,根据所述漏洞描述语句构造漏洞数据;在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板时,根据所述实体描述语句模板生成所述实体描述语句,并根据所述实体描述语句构造实体数据,根据所述漏洞描述语句模板生成所述漏洞描述语句,并根据所述漏洞描述语句构造漏洞数据;
接收分析器发来的获取数据的请求;
根据所述请求从所述实体数据中获取对应的实体数据,和/或,根据所述请求从所述漏洞数据中获取对应的漏洞数据,并将获取的实体数据和/或获取的漏洞数据返回给所述分析器进行安全分析。
2.如权利要求1所述的程序的安全分析方法,其特征在于,所述描述数据还包括语义规则要求的描述语句,所述语义规则要求的描述语句用于描述不同编程语言的语义规则要求,根据所述实体描述语句构造实体数据,包括:
根据所述第一语义要素项中编程语言项的内容,确定出所述实体描述语句中指定的程序实体所用的编程语言;
基于所述语义规则要求的描述语句,选择确定出的编程语言的语义规则要求的描述语句;
根据选择的语义规则要求的描述语句,判断所述实体描述语句中所述第一语义要素项的内容是否合法;
若是,则根据所述实体描述语句对所述第一语义要素项填充内容,构造实体数据。
3.如权利要求1至2中任一项所述的程序的安全分析方法,其特征在于,当程序实体为变量时,变量的实体描述语句模板如下:
<prefix>Variable(<name>, <id>) <VarSpecs>;
其中,<>表示尖括号,所述预设符号为尖括号;<prefix>为变量的所述第一语义要素项中编程语言项对应的第一替换项,用于指定变量所用的编程语言;<name>为变量的所述第一语义要素项中名称项对应的第一替换项,用于指定变量的名字;<id>为变量的所述第一语义要素项中标识项对应的第一替换项,用于指定变量的唯一标识符;<VarSpecs>为变量的所述第一语义要素项中内容项对应的第一替换项,用于指定变量的至少一个变量规约,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合;
该第一子描述语句用于描述变量的别名:alias <Alias>,其中,<Alias>为变量的别名对应的替换项,允许替换为变量的别名内容;
该第一子描述语句用于描述变量是一个回调函数:callback { <FunctionDescription>},其中,<FunctionDescription>为回调函数对应的替换项,允许替换为回调函数的描述语句内容;
该第一子描述语句用于描述变量的值是另外一个id为<IdRef>的对象:referTo <IdRef>,其中,<IdRef>为另外一个id对应的替换项,允许替换为另外一个id的内容;
该第一子描述语句用于描述变量是一个有多个污染标签的污染源:sources <tags>,其中,<tags>是多个污染标签对应的替换项,允许替换为多个污染标签的内容;
该第一子描述语句用于描述变量是一个污染坑:sinkSpec { <SinkSpec> },其中,<SinkSpec>是描述污染坑规约对应的替换项,允许替换为污染坑规约的描述语句内容:
该第一子描述语句用于描述污染坑规约的id,用以区分同一个变量的多个污染坑规约:id(<Id>),其中,<Id>是污染坑规约的id对应的替换项,允许替换为污染坑规约的id内容;
该第一子描述语句用于描述与该污染坑规约关联的一个或多个缺陷的id:idissues(<IssueIDs>),其中,<IssueIDs>是与该污染坑规约关联的一个或多个缺陷的id对应的替换项,允许替换为一个或多个缺陷的id内容;
该第一子描述语句用于描述该污染坑规约成立的条件:where <Language> { <Condition> },其中,<Language>是指定书写<Condition>函数的编程语言对应的替换项,允许替换为指定书写<Condition>函数的编程语言;<Condition>是描述一个返回布尔值的函数对应的替换项,允许替换为返回布尔值的函数的函数体,当返回值为真时,该污染坑规约成立,该变量是一个污染坑;否则,该污染坑规约不成立,该变量不是一个污染坑;
该第一子描述语句用于描述变量的数值类型:type <T>,其中,<T>是变量的数值类型对应的替换项,允许替换为变量的数值类型内容;
该第一子描述语句用于描述变量的值:value <V>,其中,<V>是变量的值对应的替换项,允许替换为变量的值。
4.如权利要求1至2中任一项所述的程序的安全分析方法,其特征在于,当程序实体为函数时,函数分为入口函数和普通函数,
入口函数的实体描述语句模板如下:
<prefix>EntryFunction(<name>,<id>){ <FunctionDescription> };
普通函数的实体描述语句模板如下:
<prefix>Function(<name>, <id>) { <FunctionDescription> };
其中,<prefix>为所述第一语义要素项中函数的编程语言项对应的第一替换项,用于指定函数所用的编程语言;<name>为所述第一语义要素项中函数的名称项对应的第一替换项,用于指定函数的名字;<id>为所述第一语义要素项中函数的标识项对应的第一替换项,用于指定函数的唯一标识符;<FunctionDescription>为所述第一语义要素项中函数的内容项对应的第一替换项,用于指定函数的至少一个内容特征,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合;
该第一子描述语句用于指定所描述函数的参数:<ArgN>;
该第一子描述语句用于描述参数的规约:<VarSpecs>;
该第一子描述语句用于指定该函数的返回值:returnValue <V>,其中,<V>是函数的返回值对应的替换项,允许替换为函数的返回值;
该第一子描述语句用于描述函数的函数体代码和编写函数体的编程语言:body <Language> { <Code> },其中,<Language>是书写<Code>的编程语言对应的替换项,允许替换为指定书写<Code>的编程语言;<Code>是实现该函数的函数体代码对应的替换项,允许替换为该函数的函数体代码;
该第一子描述语句用于描述函数有污染清除或者污染添加作用:cleanse(<ArgN>) <TagChanges>,其中,<ArgN>是指定的函数的参数、返回值或对象对应的替换项,允许替换为指定的函数的参数、返回值或对象,<TagChanges>是指定污染标签的增减对应的替换项,允许替换为污染标签的增减内容;
该第一子描述语句用于描述函数把污染标签从源参数<ArgM>传递到目标参数<ArgN>:relay(<ArgM>, <ArgN>) <TagChanges> <WhereClause>,其中,<WhereClause>是污染传递成立的条件对应的替换项,允许替换为指定的该污染传递成立的条件内容,<ArgM>是源参数对应的替换项,允许替换为源参数内容,<ArgN>是目标参数对应的替换项,允许替换为目标参数内容;
该第一子描述语句用于描述函数把污染标签从源参数<ArgM>传递到目标对象<ArgO>的目标属性<ArgF>:relay(<ArgM>, <ArgO>, <ArgF>) <TagChanges> <WhereClause>,其中,目标对象<ArgO>的目标属性<ArgF>记为<ArgO>.<ArgF>,<ArgO>是目标对象对应的替换项,允许替换为目标对象的内容,<ArgF>是目标属性对应的替换项,允许替换为目标属性的内容;
该第一子描述语句用于描述对函数的调用会引发的安全风险:warnAlways(<IssueIDs>),其中,分析器需要基于安全风险发出告警,并将告警和<IssueIDs>里面指定的缺陷id关联起来。
5.如权利要求1至2中任一项所述的程序的安全分析方法,其特征在于,
当程序实体为对象时,对象的实体描述语句模板如下:
<prefix>Object(<name>, <id>) { <ObjectDescription> };
其中,<prefix>是对象的所述第一语义要素项中编程语言项对应的第一替换项,用于指定该对象所适用的编程语言;
<name>是对象的所述第一语义要素项中名称项对应的第一替换项,用于指定该对象的名字;
<id>是对象的所述第一语义要素项中标识项对应的第一替换项,用于指定函数的唯一标识符;
<ObjectDescription>是对象的所述第一语义要素项中内容项对应的第一替换项,用于描述该对象的一个或多个对象内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:
该第一子描述语句用于描述对象的别名:alias <Alias>,其中,<Alias>为对象的别名对应的替换项,允许替换为对应的别名内容;
该第一子描述语句用于描述该对象的一个非回调函数成员变量:field(<name>, <id>) <VarSpecs>,其中,<name>是该成员变量的名字对应的替换项,允许替换为该成员变量的名字内容;<id>是该成员变量的唯一标识符对应的替换项,允许替换为该成员变量的唯一标识符;<VarSpecs>是该成员变量的变量规约对应的替换项,允许替换为该成员变量的变量规约内容;
该第一子描述语句用于描述该对象的一个回调函数成员变量:callback(<name>, <id>) { <FunctionDescription> },其中,<FunctionDescription>是该回调函数的描述对应的替换项,允许替换为该回调函数的描述语句内容;
该第一子描述语句用于描述该对象的一个成员方法:method(<name>, <id>) { <FunctionDescription> },其中,<FunctionDescription>是该成员方法的描述对应的替换项,允许替换为该成员方法的描述语句内容;
该第一子描述语句用于描述该对象的构造函数:new <Language> { <Code> };
该第一子描述语句用于描述该对象名作为函数调用时的污染标签增减情况:cleanse(<ArgN>) <TagChanges>;
该第一子描述语句用于描述该对象名作为函数调用时把污染标签从源参数<ArgM>传递到目标参数<ArgN>:relay(<ArgM>, <ArgN>) <TagChanges> <WhereClause>;
该第一子描述语句用于描述该对象名作为函数调用时把污染标签从源参数<ArgM>传递到目标对象<ArgO>的目标属性<ArgF>:relay(<ArgM>,<ArgO>,<ArgF>) <TagChanges> <WhereClause>;
该第一子描述语句用于描述该对象名作为函数调用时需要告警,warnAlways(<IssueIDs>);
该第一子描述语句用于描述该对象是否有名字可变的动态属性:dynamicField <V>。
6.如权利要求1至2中任一项所述的程序的安全分析方法,其特征在于,
当程序实体为命名空间时,命名空间的实体描述语句模板如下:
<prefix>Namesapce(<name>, <id>) { <NamespaceDescription> };
其中,<prefix>是命名空间的所述第一语义要素项中编程语言项对应的第一替换项,用于指定命名空间所用的编程语言;<name>是命名空间的所述第一语义要素项中名称项对应的第一替换项,用于指定命名空间的名字;<id>是命名空间的所述第一语义要素项中标识项对应的第一替换项,用于指定命名空间的唯一标识符;
<NamespaceDescription>是命名空间的所述第一语义要素项中内容项对应的第一替换项,用于描述该命名空间的一个或多个内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:程序实体为变量的实体描述语句模板,程序实体为函数的实体描述语句模板,程序实体为对象的实体描述语句模板,以及嵌套的命名空间的实体描述语句模板;
当程序实体为包时,包的实体描述语句模板如下:
<prefix>Package(<name>, <id>) { <PackageDescription> };
其中,<prefix>是包的所述第一语义要素项中编程语言项对应的第一替换项,用于指定该包所用的编程语言;<name>是包的所述第一语义要素项中名称项对应的第一替换项,用于指定该包的名字;<id>是包的所述第一语义要素项中标识项对应的第一替换项,用于指定包的唯一标识符;
<PackageDescription>是包的所述第一语义要素项中内容项对应的第一替换项,用于描述该包的一个或多个包内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:程序实体为变量的实体描述语句模板,程序实体为函数的实体描述语句模板,程序实体为对象的实体描述语句模板;
当程序实体为模块时,模块的实体描述语句模板如下:
<prefix>Module(<name>, <id>) { <ModuleDescription> };
其中,<prefix>是模块的第一语义要素项中编程语言项对应的第一替换项,用于指定该模块所用的编程语言;<name>是模块的所述第一语义要素项中名称项对应的第一替换项,用于指定该模块的名字;<id>是模块的第一语义要素项中编标识项对应的第一替换项,用于指定模块的唯一标识符;
<ModuleDescription>是模块的第一语义要素项中的内容项对应的第一替换项,用于描述该模块的一个或多个模块内容,所述内容项对应的第一替换项包括以下第一子描述语句的任意一项或任意组合:程序实体为变量的实体描述语句模板,程序实体为函数的实体描述语句模板,程序实体为对象的实体描述语句模板;
该第一子描述语句描述模块的缓存方式:cached <true | false>,其中,参数为true时,该模块只装载一次并被缓存,后续引用相同副本;描述参数为false时,该模块不被缓存。
7.如权利要求1至2中任一项所述的程序的安全分析方法,其特征在于,针对漏洞类型,漏洞类型的漏洞描述语句模板如下:
issue(<id>) { <IssueDescription> };
其中,<id>为漏洞类型的所述第二语义要素项中标识项对应的第二替换项,用于指定漏洞的唯一标识符;<IssueDescription>为漏洞类型的所述第二语义要素项中内容项对应的第二替换项,用于指定漏洞类型的至少一个漏洞特征,所述内容项对应的第二替换项包括以下第二子描述语句的任意一项或任意组合:
该第二子描述语句用于描述漏洞的多个别名:alias(<Aliases>),其中,<Aliases>是漏洞的多个别名对应的替换项,允许替换为漏洞的多个别名内容;
该第二子描述语句用于描述漏洞所属类别:category(<C>),其中,<C>是漏洞所属类别对应的替换项,允许替换为漏洞所属类别内容;
该第二子描述语句用于描述漏洞所属子类别:subCategory(<SC>),其中,<SC>是漏洞所属子类别对应的替换项,允许替换为漏洞所属子类别内容;
该第二子描述语句用于描述漏洞所属场景:context(<CX>),其中,<CX>是漏洞所属场景对应的替换项,允许替换为漏洞所属场景内容;
该第二子描述语句用于描述漏洞的名称:name(<N>),其中,<N>是漏洞的名称对应的替换项,允许替换为漏洞的名称内容;
该第二子描述语句用于描述用户自定义的一个或多个ID:userId(<Ids>),其中,用户自定义的一个或多个ID用于和漏洞关联起来,<Ids>是用户自定义的一个或多个ID对应的替换项,允许替换为用户自定义的一个或多个ID内容;
该第二子描述语句用于描述漏洞的严重性:severity(<S>),其中,<S>是漏洞的严重性对应的替换项,允许替换为漏洞的严重性内容;
该第二子描述语句用于描述漏洞的可攻击性:exploitability(<E>),其中,<E>是漏洞的可攻击性对应的替换项,允许替换为漏洞的可攻击性内容;
该第二子描述语句用于描述对漏洞的描述文字:description(<Desc>),其中,<Desc>是漏洞的描述文字对应的替换项,允许替换为对漏洞的描述文字内容;
该第二子描述语句用于描述漏洞的描述文字由id为<DescID>的漏洞描述体提供:descriptionID(<DescID>),其中,<DescID>是漏洞描述体的id对应的替换项,允许替换为对漏洞描述体的id内容;
该第二子描述语句用于描述和漏洞相关联的一个或多个用双引号括起来的CWE编号字符串:cwes(<WX>),其中,<WX>是和漏洞相关联的一个或多个用双引号括起来的CWE编号字符串对应的替换项,允许替换为和漏洞相关联的一个或多个用双引号括起来的CWE编号字符串内容;
该第二子描述语句用于描述和该漏洞相关联的一个或多个用双引号括起来的CVE编号字符串:cves(<VX>),其中,<VX>是和漏洞相关联的一个或多个用双引号括起来的CVE编号字符串对应的替换项,允许替换为和漏洞相关联的一个或多个用双引号括起来的CVE编号字符串内容。
8.一种程序的安全分析系统,其特征在于,包括:
文档获取单元,用于获取待分析程序涉及的程序实体和漏洞的描述数据,其中,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句,所述实体描述语句是根据程序实体的实体描述语句模板生成的,所述实体描述语句模板是根据程序实体的各个第一语义要素项按照语句的语义规则形成的描述语句,在所述实体描述语句模板中用预设符号标记各个所述第一语义要素项形成各个第一替换项,所述实体描述语句模板中的各个所述第一替换项允许替换为对应第一语义要素项的内容以生成所述实体描述语句,对所述第一语义要素项中的内容项的描述包括至少一个第一子描述语句,每个第一子描述语句用于描述一个安全特征或一个语义特征或一个允许被外部程序调用的回调函数;所述漏洞描述语句是根据漏洞的漏洞描述语句模板生成的,所述漏洞描述语句模板是根据漏洞的各个第二语义要素项按照语句的语义规则形成的描述语句,在所述漏洞描述语句模板用预设符号标记各个所述第二语义要素项形成各个第二替换项,所述漏洞描述语句模板中的各个所述第二替换项允许替换为对应第二语义要素项的内容以生成所述漏洞描述语句,对所述第二语义要素项中的内容项的描述包括至少一个第二子描述语句,每个第二子描述语句用于描述一个漏洞特征;或者,所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板;
数据构造单元,用于在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句和所述待分析程序中存在的不同漏洞的漏洞描述语句时,根据所述实体描述语句构造实体数据,根据所述漏洞描述语句构造漏洞数据;在所述描述数据包括所述待分析程序使用的不同程序实体的实体描述语句模板和所述待分析程序中存在的不同漏洞的漏洞描述语句模板时,根据所述实体描述语句模板生成所述实体描述语句,并根据所述实体描述语句构造实体数据,根据所述漏洞描述语句模板生成所述漏洞描述语句,并根据所述漏洞描述语句构造漏洞数据;
请求接收单元,用于接收分析器发来的获取数据的请求;
安全分析单元,用于根据所述请求从所述实体数据中获取对应的实体数据,和/或,根据所述请求从所述漏洞数据中获取对应的漏洞数据,并将获取的实体数据和/或获取的漏洞数据返回给所述分析器进行安全分析。
9.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述的程序的安全分析方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有执行权利要求1至7中任一项所述的程序的安全分析方法的计算机程序。
CN202311308165.0A 2023-10-11 2023-10-11 程序的安全分析方法、系统、计算机设备及存储介质 Active CN117077148B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311308165.0A CN117077148B (zh) 2023-10-11 2023-10-11 程序的安全分析方法、系统、计算机设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311308165.0A CN117077148B (zh) 2023-10-11 2023-10-11 程序的安全分析方法、系统、计算机设备及存储介质

Publications (2)

Publication Number Publication Date
CN117077148A CN117077148A (zh) 2023-11-17
CN117077148B true CN117077148B (zh) 2024-01-23

Family

ID=88717274

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311308165.0A Active CN117077148B (zh) 2023-10-11 2023-10-11 程序的安全分析方法、系统、计算机设备及存储介质

Country Status (1)

Country Link
CN (1) CN117077148B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106709356A (zh) * 2016-12-07 2017-05-24 西安电子科技大学 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法
CN110377516A (zh) * 2019-07-17 2019-10-25 拉扎斯网络科技(上海)有限公司 测试方法、装置、电子设备及计算机可读存储介质
CN115964716A (zh) * 2022-12-23 2023-04-14 天翼安全科技有限公司 一种漏洞数据的分析方法、装置、电子设备及存储介质
CN116089262A (zh) * 2022-11-23 2023-05-09 北京东方通科技股份有限公司 一种基于代码动态分析的代码安全扫描系统及方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2892471C (en) * 2013-01-11 2023-02-21 Db Networks, Inc. Systems and methods for detecting and mitigating threats to a structured data storage system

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106709356A (zh) * 2016-12-07 2017-05-24 西安电子科技大学 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法
CN110377516A (zh) * 2019-07-17 2019-10-25 拉扎斯网络科技(上海)有限公司 测试方法、装置、电子设备及计算机可读存储介质
CN116089262A (zh) * 2022-11-23 2023-05-09 北京东方通科技股份有限公司 一种基于代码动态分析的代码安全扫描系统及方法
CN115964716A (zh) * 2022-12-23 2023-04-14 天翼安全科技有限公司 一种漏洞数据的分析方法、装置、电子设备及存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Brahmastra: Driving Apps to Test the Security of Third-Party Components;Ravi Bhoraskar等;《USENIX Association》;第1021-1036页 *
污点传递理论在Webshell检测中的应用 -- PHP篇;阿里安全响应中心;《https://mp.weixin.qq.com/s/MFmSliCQaaVEQ0E66vN5Xg》;第1-18页 *

Also Published As

Publication number Publication date
CN117077148A (zh) 2023-11-17

Similar Documents

Publication Publication Date Title
US6732095B1 (en) Method and apparatus for mapping between XML and relational representations
US6915304B2 (en) System and method for converting an XML data structure into a relational database
US7210096B2 (en) Methods and apparatus for constructing semantic models for document authoring
RU2328032C2 (ru) Система и способ проверки правильности документов xml и выдачи сообщения о нарушениях схемы
KR20190129877A (ko) 구조화된 사용자 데이터 파일에서의 사용자 콘텐츠의 난독화
US20140123303A1 (en) Dynamic data masking
US6834382B2 (en) Message parser and formatter
CN110007920B (zh) 一种获取代码依赖关系的方法、装置及电子设备
CN107015839B (zh) 一种实现前端事件代理的方法及装置
US7130862B2 (en) Methods, systems and computer program prodcuts for validation of XML instance documents using Java classloaders
US20140173559A1 (en) Identifying differences between source codes of different versions of a software when each source code is organized using incorporated files
KR20060070420A (ko) 문서를 나타내기 위한 파일 포맷, 방법 및 컴퓨터 프로그램제품
CN112182637A (zh) 一种安全控制系统、方法、装置及存储介质
CN112559083B (zh) 函数插件执行方法、装置、电子设备及存储介质
CN117077148B (zh) 程序的安全分析方法、系统、计算机设备及存储介质
CN111078773B (zh) 一种数据处理方法及装置
US10782944B2 (en) Optimizing a cache of compiled expressions by removing variability
CN116467047A (zh) 针对容器配置合规性的检测方法、装置、存储介质及终端
CN113312373A (zh) 一种数据结构化查询语句的解析方法及设备
US20070299805A1 (en) System and method of report layout reference processing
Gong et al. OPC UA Information Modeling Method and Xml Definition
CN113408250B (zh) 一种项目文件的处理方法和装置
JP2008269020A (ja) コピー履歴管理型プログラム開発支援装置、プログラム開発支援方法及びプログラム開発支援プログラム
CN115268924B (zh) 一种基于aPaaS平台的公式计算引擎服务方法及系统
CN117008914A (zh) 一种文件格式转换的方法及设备

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
GR01 Patent grant
GR01 Patent grant