通过对持久存储装置中的信息流建模来检测二级安全漏洞

文档序号:1966945 发布日期:2021-12-14 浏览:12次 >En<

阅读说明:本技术 通过对持久存储装置中的信息流建模来检测二级安全漏洞 (Detecting secondary security vulnerabilities by modeling information flow in persistent storage ) 是由 P·克里什南 陆熠 R·R·卡加拉瓦迪 于 2020-01-29 设计创作,主要内容包括:一种方法可以包括确定代码中的源变量从由目标分析指定的源函数接收源值、确定代码中的源语句使用源变量将源值写入到表中的列、针对代码中的接收器语句,获得受源变量影响的受影响变量集合、确定接收器语句将源值读取到包括所述列的标识符的接收器变量中、通过将接收器变量添加到受影响变量集合来生成修改后的受影响变量集合,以及报告接收器语句处的缺陷。(A method may include determining that a source variable in code receives a source value from a source function specified by a target analysis, determining that a source sentence in code uses the source variable to write the source value to a column in a table, for a receiver sentence in the code, obtaining a set of affected variables affected by the source variable, determining that the receiver sentence reads the source value into a receiver variable that includes an identifier of the column, generating a modified set of affected variables by adding the receiver variable to the set of affected variables, and reporting a defect at the receiver sentence.)

通过对持久存储装置中的信息流建模来检测二级安全漏洞

背景技术

当未净化的用户输入流到查询语言语句时,使用数据库查询语言(例如,结构化查询语言或SQL)语句的应用可能变得易受攻击。当恶意用户注入查询语言语句以提取敏感数据、篡改现有数据或导致拒绝服务时,可能会发生一级(First-order)查询语言注入。当恶意用户将负载存入到数据库中并操纵应用以经由查询语言语句从数据库读取负载时,可能会发生二级(Second-order)查询语言注入。由于数据库中的数据通常被认为是安全的,因此使用一级查询语言注入检测机制可能无法检测到这些二级漏洞。

发明内容

提供本发明内容以引入概念的选择,这些概念将在下面的详细描述中进一步描述。本发明内容不旨在识别所要求保护的主题的关键或必要特征,也不旨在用于帮助限制所要求保护的主题的范围。

一般而言,在一个方面,一个或多个实施例涉及一种方法,该方法包括:确定代码中的源变量从由目标分析指定的源函数接收源值、确定代码中的源语句使用源变量将源值写入到表中的列、针对代码中的接收器(sink)语句获得受源变量影响的受影响变量集合、确定接收器语句将源值读取到包括所述列的标识符的接收器变量中、通过将接收器变量添加到受影响变量集合来生成修改后的受影响变量集合、以及报告接收器语句处的缺陷。

一般而言,在一个方面,一个或多个实施例涉及一种系统,该系统包括耦合到计算机处理器的存储器、被配置为存储表和包括源语句和接收器语句的代码的储存库,以及在计算机处理器上执行并使用存储器的代码分析器,该代码分析器被配置为:确定代码中的源变量从由目标分析指定的源函数接收源值、确定源语句使用源变量将源值写入到表中的一列、针对接收器语句获得受源变量影响的受影响变量集合、确定接收器语句将源值读取到包括所述列的标识符的接收器变量中、通过将接收器变量添加到受影响变量集合来生成修改后的受影响变量集合、以及报告接收器语句处的缺陷。

一般而言,在一个方面,一个或多个实施例涉及一种包括指令的非暂态计算机可读介质,所述指令在由计算机处理器执行时执行:确定代码中的源变量从由目标分析指定的源函数接收源值、确定代码中的源语句使用源变量将源值写入到表中的一列、针对代码中的接收器语句获得受源变量影响的受影响变量集合、确定接收器语句将源值读取到包括所述列的标识符的接收器变量中、通过将接收器变量添加到受影响变量集合来生成修改后的受影响变量集合,以及报告接收器语句处的缺陷。

本发明的其它方面将从以下描述和所附权利要求中显而易见。

附图说明

图1A和图1B示出了根据本发明的一个或多个实施例的系统。

图2、图3A、图3B、图3C和图3D示出了根据本发明的一个或多个实施例的流程图。

图4A、图4B和图4C示出了根据本发明的一个或多个实施例的示例。

图5A和图5B示出了根据本发明的一个或多个实施例的计算系统。

具体实施方式

现在将参考附图详细描述本发明的具体实施例。为了一致性,各个附图中的相同元件由相同的标号表示。

在以下对本发明实施例的详细描述中,阐述了各种具体细节,以便提供对本发明更透彻的理解。但是,对本领域普通技术人员将显而易见的是,本发明没有这些具体细节也可以实践。在其它情况下,众所周知的特征没有详细描述,以避免不必要地使描述复杂化。

贯穿整个申请,序数(例如,第一、第二、第三等)可以被用作元素(即,申请中的任何名词)的形容词。序数的使用并不意味着或创建任何特定的元素排序,也不是将任何元素限制到仅单个元素,除非明确地公开,诸如通过使用术语“之前”、“之后”、“单个”及其它此类术语。相反,序数的使用是为了区分元素。作为示例,第一元素不同于第二元素,并且第一元素可以涵盖多于一个元素并且在元素的排序中在第二元素之后(或之前)。

一般而言,本发明的实施例涉及检测代码中的二级安全漏洞。在一个或多个实施例中,跟踪从源变量到接收器变量的数据流,其中流包括对持久性存储装置(例如,数据库中的表)的写入和读取。例如,代码可能嵌入SQL语句。可以相对于目标分析(例如,污染或逃逸分析)来确定关注的流。分析的效率和精度可以基于以下两个因素进行调整:1)流粒度:每个流是否表示两个变量之间或两组变量之间的依赖关系,以及2)每个单元格的值是否被表示,或者单元格值是否被抽象为列的值。

图1A示出了根据本发明的一个或多个实施例的计算机系统(100)。如图1A中所示,计算机系统(100)包括储存库(102)、代码分析器(104)和一个或多个计算机处理器(106)。在一个或多个实施例中,计算机系统(100)采用关于图5A和下面的伴随描述所描述的计算系统(500)的形式,或者采用关于图5B所描述的客户端设备(526)的形式。在一个或多个实施例中,计算机处理器(106)采用关于图5A和下面的伴随描述所描述的计算机处理器(502)的形式。

在一个或多个实施例中,储存库(102)可以是用于存储数据的任何类型的存储单元和/或设备(例如,文件系统、数据库、表的集合或任何其它存储机制)。另外,储存库(102)可以包括多个不同的存储单元和/或设备。多个不同的存储单元和/或设备可以是或可以不是相同的类型或位于相同的物理站点。

在一个或多个实施例中,储存库(102)包括代码(110)、一个或多个表(120)、抽象状态储存库(130)、目标分析(134)和轨迹图(136)。在一个或多个实施例中,代码(110)包括组件(112A,112N)。组件(112A)可以是源代码单元。组件(112A)内定义的编程实体可以由其它组件导入。例如,编程实体可以是文件、包、类、函数等。组件(112A)可以包括以编程语言或中间表示(例如,字节码)编写的语句(114)。例如,语句(114)可以用嵌入查询语言(例如,结构化查询语言或SQL)语句的编程语言编写。每个语句(114)可以对应于代码(110)中的位置(例如,程序点)。例如,位置可以指定组件(112A)中的行号。

在一个或多个实施例中,表(120)包括列(122A,122N)。表(120)可以存储在数据库中。每一列(122A)可以包括一个或多个单元格(124),每个单元格包括值。每一列(122A)可以具有名称、类型、权限和/或各种其它属性。例如,人员表可以包括用户名列,其中用户名列中的每个单元格都被分配特定的值(例如,“Bob”)。每个单元格(124)可以对应于表(120)的一行。例如,用户名列中被分配值“Bob”的单元格可以对应于将值(例如,Bob的密码、Bob的权限等)分配给表(120)的列(122A,122N)的行。

转到图1B,在一个或多个实施例中,语句(150)包括变量(152A,152N)。每个变量(152A)可以是表变量(154)或应用变量(156)。在一个或多个实施例中,表变量(154)访问一个或多个表的内容。表变量(154)可以包括表(120)中的列(122A)的列标识符(158)。列标识符(158)可以被认为是变量,因为列标识符(158)可以用作列(122A)的单元格的值的占位符,类似于用作变量的可能值的占位符的变量。

替代地,表变量(154)可以是对应于表(120)中的单元格(124)之一的单元格标识符(160)。在一个或多个实施例中,单元格标识符(160)包括列标识符(158)和行标识符。行标识符可以对应于表(120)中的行。

在一个或多个实施例中,应用变量(156)可以引用代码(110)中存储值的位置,诸如分配站点。分配站点可以是代码(110)中声明、实例化和/或初始化对象的语句。应用变量(156)可以指简单的分配站点(例如,数字或串值)、可以指复杂的分配站点(例如,包含一个或多个字段的基础对象或结构)、或者可以指复杂分配站点中的字段。分配站点可以在不同的时间点包含不同的值。在一个或多个实施例中,分配站点可以指在执行代码(110)中的函数时分配的计算机系统(100)的存储器(例如,堆存储器)中的位置。

返回到图1A,在一个或多个实施例中,抽象状态储存库(130)将抽象状态(132A,132N)分配给语句(114A,114N)。返回到图1B,在一个或多个实施例中,抽象状态(170)将抽象值(172A,172N)分配给变量(152A,152N)。在一个或多个实施例中,每个抽象值(172A,172N)对应于一组具体值。抽象值(172A)可以对应于在代码(110)的执行期间可以被分配给变量(152A)的一组具体值。因此,抽象值(172A)可以定义对在代码(110)的执行期间可以被分配给变量(152A)的可能的具体值的约束。在一个或多个实施例中,抽象值(172A)可以由正则表达式表示。例如,正则表达式可以表示如由串约束求解器确定的变量(152A)的可能串值。整数的抽象值(172A,172N)的示例包括:任何整数、任何正整数、任何偶数、任何奇数、任何非零整数、一组特定整数等。串的抽象值(172A,172N)的示例包括:任何串、任何非空串、特定串、一组特定串、数字串、非数字串等。

返回到图1A,在一个或多个实施例中,目标分析(134)是要对代码(110)执行的一种分析。在一个或多个实施例中,使用抽象解释来执行目标分析(134)。抽象解释是一种静态分析技术,它过度近似代码(110)的行为,从而使代码分析器(104)能够在不直接执行代码(110)的情况下检查代码(110)在任何可能的执行下是否会表现出有缺陷的(例如,恶意的)行为。在一个或多个实施例中,静态分析对与语句(114A,114N)相关联的抽象状态(132A,132N)进行分析。

返回到图1B,在一个或多个实施例中,目标分析(134)包括源函数(162)、接收器语句(164)和修改器函数(166)。在一个或多个实施例中,源函数(162)可以接收与要对代码(110)执行的分析类型相关的关注的值。例如,当目标分析(134)是污染分析时,源函数(162)可以从外部源接收被污染值。继续这个示例,被污染值可以对应于用户提供的或外部生成的值(例如,可能被攻击者控制的未知值)。源函数(162)可以直接从外部源(例如,经由应用程序接口(API))接收被污染值。替代地,源函数(162)可以经由污染流(例如,经由从外部源传输被污染值的一系列函数调用)接收被污染值。作为另一个示例,当目标分析(134)是逃逸分析时,源函数(162)可以接收敏感数据(例如,在源函数(162)可能具有机密访问特权的情况下)。

在一个或多个实施例中,接收器语句(164)可以相对于目标分析(134)利用源值(例如,以表示安全缺陷的方式)。例如,当代码(110)的分析是污染分析时,接收器语句(164)可以访问计算机系统(100)的安全敏感资源。替代地,接收器语句可以向访问安全敏感资源的另一个接收器语句提供被污染值。作为另一个示例,当代码(110)的分析是逃逸分析时,接收器语句(164)可以允许对敏感数据的非特权(例如,公共)访问,并且因此可以表示机密信息泄漏点。

在一个或多个实施例中,修改器函数(166)可以修改源值以防止潜在的安全缺陷。例如,在污染分析中,修改器函数(166)可以净化被污染数据以使被污染数据无害。类似地,在逃逸分析中,修改器函数(166)可以解密(例如,编辑)敏感数据。

返回到图1A,在一个或多个实施例中,轨迹图(136)通过在一系列语句(114)中使用的一系列变量(152A,152N)表示值(例如,由图1B的源函数(162)提供的源值)的潜在流。例如,轨迹图(136)中的路径可以对应于代码(110)中的缺陷(例如,污染流或逃逸流)。继续这个示例,在安全分析的上下文中,轨迹图(136)中的路径可以指示变量(152A,152N)如何被污染或释放敏感数据。

在一个或多个实施例中,代码分析器(104)以硬件(例如,电路系统)、软件、固件和/或其任何组合来实现。在一个或多个实施例中,代码分析器(104)包括执行代码(110)的静态分析(例如,使用目标分析(134))的功能。代码分析器(104)可以包括使用静态分析报告代码(110)中的缺陷的功能。代码分析器(104)可以包括对代码(110)的不同组件(112A,112N)执行不同类型的静态分析的功能。

在一个或多个实施例中,计算机处理器(106)包括执行代码(110)的功能。在一个或多个实施例中,计算机处理器(106)包括执行代码分析器(104)的功能。

虽然图1A示出了组件的配置,但是在不脱离本发明的范围的情况下可以使用其它配置。例如,各种组件可以被组合,以创建单个组件。作为另一个示例,由单个组件执行的功能可以由两个或更多个组件执行。

图2示出了根据本发明的一个或多个实施例的流程图。该流程图描绘了用于行折叠信息流分析的处理。图2中的一个或多个步骤可以由上面参考图1A讨论的组件(例如,计算机系统(100)的代码分析器(104))来执行。在本发明的一个或多个实施例中,图2中所示的步骤中的一个或多个步骤可以被省略、重复和/或并行执行,或者以与图2中所示的顺序不同的顺序执行。因此,不应该认为本发明的范围限于图2中所示的步骤的特定布置。

最初,在步骤202中,确定源变量从由目标分析指定的源函数接收源值。例如,当目标分析是污染分析时,源变量可以接收被污染值。替代地,当目标分析是逃逸分析时,源变量可以接收机密值。在一个或多个实施例中,源值是包括一个或多个源变量的表达式的结果。表达式可以是用于从表中选择行的条件表达式。

在步骤204中,确定代码中的源语句使用源变量将源值写入到表中的列。例如,源语句可以是SQL插入或更新语句。源值可以被写入到列的单元格中,其中单元格对应于表中的行。

在步骤206中,针对代码中的接收器语句,获得受源变量影响的一个或多个受影响变量集合。在一个或多个实施例中,接收器语句是由目标分析指定的接收器语句。例如,当目标分析是污染分析时,接收器语句可以访问计算机系统的安全敏感资源。替代地,当目标分析是逃逸分析时,接收器语句可以允许非特权访问机密数据。在一个或多个实施例中,目标分析指定接收器语句是修改(例如,插入、更新或删除)表中的列中的数据的数据操纵语句。

在一个或多个实施例中,代码分析器跟踪受影响变量集合对源变量集合的聚合(例如,过度近似)依赖性(例如,而不是精确地跟踪影响特定接收器变量的特定源变量),这牺牲了一些精度来换取更高的计算效率。

在一个或多个实施例中,代码分析器通过对代码执行静态分析(例如,目标分析)来获得受影响变量集合。在一个或多个实施例中,静态分析使用抽象解释技术向接收器语句中使用的变量分配抽象值。例如,代码分析器可以使用约束传播和/或约束满足算法来计算分配给不同变量的抽象值,其中每个抽象值约束可以被分配给对应变量的可能的具体值。

在步骤208中,确定接收器语句将源值读取到包括列的标识符的接收器变量中。例如,接收器变量可以是列标识符,其对应的列已经被写入到该列的源值影响(例如,污染)。可以将源值写入到由列标识符识别的列的单元格,其中该单元格对应于表中的行。

在步骤210中,通过将接收器变量添加到受影响变量集合来生成修改后的受源变量影响的受影响变量集合。继续上面的示例,在处理下面的接收器语句之后,如果变量v已经在受影响变量集合中,那么代码分析器可以将列标识符“credentials.username”添加到受影响变量集合中:INSERT INTO credentials(username)VALUES(v)。继续这个示例,如果变量v被污染,那么列标识符“credentials.username”也被污染。

在一个或多个实施例中,代码分析器可以通过从受影响变量集合中移除接收器变量来修改受源变量影响的受影响变量集合。继续上面的示例,删除语句可以从列中删除源值,从而可以消除列对受影响变量集合的影响。

在步骤212中,报告接收器语句处的缺陷。在一个或多个实施例中,接收器语句处的缺陷是由于源变量对接收器变量的影响。例如,接收器变量可以向安全敏感函数提供从源变量接收到的被污染值。替代地,接收器变量可以向允许非特权访问的函数提供来自源变量的机密值。

代码分析器可以基于源变量对接收器变量的影响来报告缺陷,而不管源变量的特定值如何。例如,如果源变量将被污染值写入到列中的任何单元格,那么整个列可以被视为被污染。

在一个或多个实施例中,当从源变量接收到的源值在被接收器变量接收之前被修改时,防止了缺陷。在一个或多个实施例中,代码分析器报告由于修改器的作用已经防止了缺陷。例如,当目标分析是污染分析时,源值可以在接收器变量接收之前被净化器修改。替代地,当目标分析是逃逸分析时,源值可以在接收器变量接收之前被解密器修改。

图2中描述的行折叠信息流分析是高效的,因此可扩展到大型代码库,原因如下:1)分析侧重于基于源变量的特定信息流,这些源变量从由目标分析指定的源函数接收源值;以及2)分析过度近似了源变量对受影响变量集合的影响(例如,而不是精确地识别受源变量直接影响的每个特定变量),这牺牲了一些精度以换取更高的计算效率。相比之下,下面图3C中描述的依赖分析跟踪变量之间的精确依赖信息,从而实现更高的精度,但代价是更大的计算开销和可扩展性降低。

图3A示出了根据本发明的一个或多个实施例的流程图。该流程图描绘了用于行折叠信息流分析的处理。图3A中的一个或多个步骤可以由上面参考图1A讨论的组件(例如,计算机系统(100)的代码分析器(104))来执行。在本发明的一个或多个实施例中,图3A中所示的一个或多个步骤可以被省略、重复和/或并行执行,或以与图3A中所示的顺序不同的顺序执行。因此,不应认为本发明的范围限于图3A中所示的步骤的特定布置。

最初,在步骤300中,选择代码中的语句。在步骤300的第一次迭代中,代码分析器可以选择代码中的第一条语句在调用代码时执行。在一个或多个实施例中,在步骤300的第一次迭代中,针对第一条语句,获得受一个或多个源变量的集合的影响的一个或多个受影响变量的集合(参见以上步骤206的描述)。在步骤300的后续迭代中,代码分析器可以根据语句在代码中出现的顺序(例如,基于与语句对应的存储器位置)来选择语句。

如果在步骤302中确定该语句是接收器语句(例如,如在目标分析中所指定的),那么执行下面的步骤304。否则,如果在步骤302中确定该语句不是接收器语句,那么执行下面的步骤312。

在步骤304中,使用该语句修改该受影响变量集合(参见以上步骤210的描述)。在一个或多个实施例中,代码分析器将语句的尚不在受影响变量集合中的每个未修改的接收器变量添加到受影响变量集合。接收器变量可以是接收源值的语句的变量。在一个或多个实施例中,当源值在接收器变量读取源值之前被修改(例如,净化或解密)时,不将接收器变量添加到受影响变量集合。例如,当目标分析是污染分析时,被污染源值可以被净化。替代地,当目标分析是逃逸分析时,机密源值可以被解密。

在步骤306中,报告与每个未修改的接收器变量对应的缺陷(参见以上步骤212的描述)。

在步骤308中,将每个未修改的接收器变量添加到源变量集合中。即,每个未修改的接收器变量又可以用作源变量,该源变量可以影响(例如,将源值传输到)在以上步骤300的后续迭代中选择的语句中的变量。在一个或多个实施例中,代码分析器重新配置目标分析以指定接收器语句除了查询语言数据操纵语句(例如,插入或更新语句)之外还可以包括查询数据提取语句(例如,SQL选择语句)。例如,查询语言数据提取语句中的接收器变量可以使用源变量集合中的变量之一(例如,从列中)读取源值。

在步骤310中,一个或多个边被添加到与每个未修改的接收器变量对应的轨迹图。在一个或多个实施例中,每个边连接源变量集合中的变量之一和未修改的接收器变量。在一个或多个实施例中,由于代码分析器跟踪受影响变量集合对源变量集合的聚合依赖性,因此代码分析器在源变量集合中的每个变量与每个未修改的接收器变量之间添加边。在一个或多个实施例中,以上步骤306中报告的缺陷对应于通过轨迹图的路径。例如,路径可以包括连接一系列节点的一系列边,这些节点表示受源值影响(例如,被污染)的一系列受影响变量。报告可以包括与缺陷对应的路径(例如,以使开发人员能够理解源值通过代码的变量和语句的流)。

如果在步骤312中确定代码中存在附加语句,那么再次执行以上步骤300以选择代码中的另一个(例如,下一个)语句。

图3B示出了根据本发明的一个或多个实施例的流程图。该流程图描绘了用于行保留信息流分析的处理。图3B中的一个或多个步骤可以由上面参考图1A讨论的组件(例如,计算机系统(100)的代码分析器(104))来执行。在本发明的一个或多个实施例中,图3B中所示的一个或多个步骤可以被省略、重复和/或并行执行,或者以与图3B中所示的顺序不同的顺序执行。因此,不应该认为本发明的范围限于图3B中所示的步骤的特定布置。

最初,在步骤352中,确定源变量从由目标分析指定的源函数接收源值(参见以上步骤202的描述)。

在步骤354中,确定源语句使用源变量将源值写入到表中的列中的单元格(参见以上步骤204的描述)。

在步骤356中,针对接收器语句,获得受源变量影响的受影响变量集合(参见以上步骤206和步骤208的描述)。接收器语句可以将源值读取到包括单元格的标识符的接收器变量中。例如,单元格的标识符可以包括列标识符和行标识符。

在步骤358中,针对接收器语句,获得向每个受影响变量分配抽象值的抽象状态(参见以上步骤206的描述)。

在步骤360中,通过将接收器变量添加到受影响变量集合中来生成修改后的受源变量影响的受影响变量集合(参见以上步骤210和步骤304的描述)。在一个或多个实施例中,单元格标识符表示已受源值影响的接收器变量。

在步骤362中,使用接收器语句修改抽象状态。在一个或多个实施例中,分配给受影响变量的抽象值基于分配给源变量集合的抽象值。源变量集合可以包括以上步骤352的源变量。例如,代码分析器可以使用由分配给源变量集合的抽象值表示的聚合约束来(例如,使用约束求解器)生成每个受影响变量的抽象值。

在步骤364中,报告接收器语句处的缺陷(参见以上步骤212的描述)。

出于以下原因,图3B中描述的行保留信息流分析是高效的。虽然源变量和受影响变量对应于表的单元格,但是单元格可以是被分配抽象值的抽象单元格,从而限制了单元格的数量和表的整体尺寸。例如,每个语句的每个变量可能对应一个抽象单元格。相对于代码分析器使用的约束求解和抽象解释算法的精度,分配给单元格的抽象值是精确的。

图3C示出了根据本发明的一个或多个实施例的流程图。该流程图描绘了行保留依赖性分析的处理。图3C中的一个或多个步骤可以由上面参考图1A讨论的组件(例如,计算机系统(100)的代码分析器(104))来执行。在本发明的一个或多个实施例中,图3C中所示的一个或多个步骤可以被省略、重复和/或并行执行,或者以与图3C中所示的顺序不同的顺序执行。因此,不应该认为本发明的范围限于图3C中所示的步骤的特定布置。

最初,在步骤370中,针对代码中的语句,获得变量依赖性集合,每个变量依赖性都包括一对变量。每个变量依赖性可以包括自变量和因变量。在一个或多个实施例中,代码分析器针对每个变量依赖性跟踪因变量对相应自变量的精确的、单独的依赖性。相比之下,图2、图3A和图3B中描述的信息流分析跟踪受影响变量集合对源变量集合的聚合依赖性。在一个或多个实施例中,变量依赖性中的变量之一对应于表的列中的单元格。例如,语句可以将变量的值写入到单元格(例如,当语句是数据操纵语句时,在单元格中插入、更新或删除数据)。替代地,语句可以将单元格的值读取到变量中(例如,当语句是数据提取语句时,从单元格中选择数据)。

在步骤372中,针对语句获得向每个变量依赖性中的每个变量分配抽象值的抽象状态(参见以上步骤206的描述)。

在步骤374中,使用该语句修改变量依赖性集合(参见上面步骤210和步骤304的描述)。在一个或多个实施例中,新的变量依赖性被添加到变量依赖性集合中。例如,变量依赖性的因变量可以是使用变量依赖性的自变量的值写入其值的单元格的单元格标识符。替代地,可以从变量依赖性集合中移除变量依赖性(例如,当从单元格中删除值或删除单元格本身时)。

在步骤376中,使用语句修改抽象状态。在一个或多个实施例中,代码分析器基于分配给变量依赖性中的自变量的抽象值为每个变量依赖性中的因变量分配抽象值。例如,分配给自变量的抽象值可以用作对分配给因变量的抽象值的约束。

图3D示出了根据本发明的一个或多个实施例的流程图。该流程图描绘了通过持久存储装置检测安全漏洞的处理。图3D中的一个或多个步骤可以由上面参考图1A讨论的组件(例如,计算机系统(100)的代码分析器(104))来执行。在本发明的一个或多个实施例中,图3D中所示的一个或多个步骤可以被省略、重复和/或并行执行,或者以与图3D中所示的顺序不同的顺序执行。因此,不应该认为本发明的范围限于图3D中所示的步骤的特定布置。

最初,在步骤380中,获得代码的组件。例如,组件可以是代码的方法、类或文件。

如果在步骤382中确定组件的尺寸低于预定阈值,那么执行下面的步骤384。否则,如果在步骤382中确定组件的尺寸不低于预定阈值,那么执行下面的步骤386。

在步骤384中,对组件执行行保留分析。例如,行保留分析可以是上面图3B中描述的行保留信息流分析。替代地,行保留分析可以是上面图3C中描述的行保留依赖性分析。

在一个或多个实施例中,如果在行保留分析的执行期间已经过去预定量的时间,那么代码分析器中止组件的行保留分析。例如,代码分析器可以在中止行保留分析之后切换到对组件的行折叠分析。

在步骤386中,对组件执行行折叠分析。例如,行折叠分析可以是上面图2中描述的行折叠信息流分析。

如果在步骤388中确定代码中存在附加组件,那么再次执行以上步骤380以获得代码中的另一个组件。

以下示例仅用于说明目的,并不旨在限制本发明的范围。图4A、图4B和图4C示出了根据本发明的一个或多个实施例的实施示例。图4A对比了凭证表的行折叠视图和行保留视图。插入之后凭证表的行保留视图(400)(图1A中的(120))示出了用户名(402)、密码(404)和默认应用(408)列(图1A中的(122A,122N))中的一些值被污染,而角色(406)列中的任何值都没有被污染。如果代码分析器(图1A中的(104))在行折叠分析期间将凭证表抽象为单行,那么结果为(被污染、被污染、未被污染、被污染),因为除角色(406)列之外的每一列至少包含一个被污染值。即,行折叠分析采用列的抽象视图,使得当列中的任何单元格包含被污染值时,整个列都被认为是被污染的。

删除之后凭证表的行保留视图(410)示出了删除凭证表中的第二行的结果。第二行已包含默认应用(408)列的唯一被污染值。但是,删除第二行不会改变凭证表的行折叠视图,因为行折叠分析不跟踪特定的单元格值。替代地,如果代码分析器已首先应用行保留分析,并且然后切换到行折叠分析,那么结果将是(被污染、被污染、未被污染、未被污染),因为带有被污染的默认应用(408)值的第二行在应用行折叠分析之前被删除。因此,图4A图示了行保留分析如何可以产生比行折叠分析更精确的结果。此外,与使用纯行折叠分析相比,从行保留分析切换到行折叠分析可以产生更精确的结果。

图4B和图4C图示了在行保留和行折叠信息流分析期间语句的处理。转到图4B,具有净化的凭证表的行保留视图(420)图示了被污染和被净化的值两者。作为图4C的代码片段(450)(图1A中的(110))中第一个INSERT语句的结果,插入了具有净化的凭证表的行保留视图(420)的第一行。第一个INSERT语句插入变量v1、v2、v3和v4的值,这些值分别被分配值Bob、默认值、Manager和hr-applications。变量v1、v3和v4被包含在被污染(例如,源)变量(460)(图1B中的(152A,152N))集合中。

当处理第一个INSERT语句时,代码分析器确定第一受影响变量集合(470)受被污染变量集合(460)影响。即,代码分析器跟踪受影响变量集合对被污染变量集合的依赖性。相比之下,当分析是依赖性分析时,代码分析器跟踪特定因变量(例如,列标识符“credentials.username”)对自变量(例如,变量v1)的依赖性。在这个示例中,污染分析(图1A和图1B中的(134))指定了相关的污染函数和接收器(例如,安全敏感)语句。接收器语句包括所有SQL数据操纵语句和数据提取语句。

在行折叠分析中,由处理第一个INSERT语句产生的第一接收器变量集合(470)包括列标识符“credentials.username”、“credentials.role”和“credentials.default-applications”。相比之下,在行保留分析中,第一接收器变量集合(470)包括与凭证表中插入的单元格对应的单元格标识符(例如,列标识符加行标识符)。代码分析器通过将第一接收器变量集合(470)添加到被污染变量集合(460)来修改被污染变量集合(460),以便跟踪由于从凭证表中提取被污染值而导致的二级SQL注入。

在代码片段(450)的SELECT语句中,凭证表的第一行中的值被读取到变量x1、x2、x3和x4中。在处理SELECT语句时,代码分析器确定第二受影响变量集合(480)(即,SELECT语句的变量x1、x3和x4)受修改后的被污染变量集合的值的影响。例如,修改后的被污染变量集合包括第一接收器变量集合(470)(例如,上述列标识符“credentials.username”、“credentials.role”和“credentials.default-applications”),其值被读取到第二受影响变量集合(480)。代码分析器报告由于从第一个INSERT语句的被污染变量(460)(即,变量v1、v3和v4)流向第二接收器变量集合(480)而导致的在SELECT语句处的缺陷(即,污染流)。缺陷是由于将被污染值插入到表中,然后从表中提取被污染值而产生的二级缺陷。

作为代码片段(450)中的第二个INSERT语句的结果,插入带有净化的凭证表的行保留视图(420)的第二行。第二个INSERT语句在执行插入到凭证表中之前净化变量x4。因此,变量x4的净化反映在第二行中。相比之下,凭证表的行折叠视图(430)缺少关于被净化值的任何信息。

本文公开的实施例可以在计算系统上实现。可以使用移动设备、台式机、服务器、路由器、交换机、嵌入式设备或其它类型的硬件的任意组合。例如,如图5A中所示,计算系统(500)可以包括一个或多个计算机处理器(502)、非持久性存储装置(504)(例如,易失性存储器,诸如随机存取存储器(RAM)、高速缓存存储器),持久性存储装置(506)(例如,硬盘、诸如光盘(CD)驱动器或数字通用盘(DVD)驱动器之类的光驱闪存等)、通信接口(512)(例如,蓝牙接口、红外接口、网络接口、光学接口等)以及许多其它元件和功能。

(一个或多个)计算机处理器(502)可以是用于处理指令的集成电路。例如,(一个或多个)计算机处理器可以是处理器的一个或多个核心或微核心。计算系统(500)还可以包括一个或多个输入设备(510),诸如触摸屏、键盘、鼠标、麦克风、触摸板、电子笔或任何其它类型的输入设备。

通信接口(512)可以包括用于将计算系统(500)连接到网络(未示出)(例如,局域网(LAN)、诸如互联网之类的广域网(WAN)、移动网络或任何其它类型的网络)和/或另一个设备(诸如另一个计算设备)。

另外,计算系统(500)可以包括一个或多个输出设备(508),诸如屏幕(例如,液晶显示器(LCD)、等离子显示器、触摸屏、阴极射线管(CRT)、显示器、投影仪或其它显示设备)、打印机、外部存储装置或任何其它输出设备。输出设备中的一个或多个可以与(一个或多个)输入设备相同或不同。(一个或多个)输入和输出设备可以本地或远程地连接到(一个或多个)计算机处理器(502)、非持久存储装置(504)和持久存储装置(506)。存在许多不同类型的计算系统,并且前述(一个或多个)输入和输出设备可以采取其它形式。

执行本文公开的实施例的、计算机可读程序代码形式的软件指令可以全部或部分地,暂时或永久地,存储在非瞬态计算机可读介质上,诸如CD、DVD、存储设备、软盘、带、闪存存储器、物理存储器,或任何其它计算机可读存储介质。具体而言,软件指令可以与计算机可读程序代码对应,当其被(一个或多个)处理器执行时,被配置为执行本文公开的一个或多个实施例。

图5A中的计算系统(500)可以连接到网络或者是网络的一部分。例如,如图5B中所示,网络(520)可以包括多个节点(例如,节点X(522)、节点Y(524))。每个节点可以与计算系统(诸如图5A中所示的计算系统)对应,或者组合的一组节点可以与图5A中所示的计算系统对应。举例来说,本文公开的实施例可以在连接到其它节点的分布式系统的节点上实现。通过另一个示例,本文公开的实施例可以在具有多个节点的分布式计算系统上实现,其中本文公开的每个部分可以位于分布式计算系统内的不同节点上。另外,前述计算系统(500)的一个或多个元件可以位于远程位置并通过网络连接到其它元件。

虽然在图5B中未示出,但是节点可以与服务器机箱中的刀片对应,该机箱经由底板连接到其它节点。通过另一个示例,节点可以与数据中心中的服务器对应。通过另一个示例,节点可以与具有共享存储器和/或资源的计算机处理器或计算机处理器的微核心对应。

网络(520)中的节点(例如,节点X(522)、节点Y(524))可以被配置为为客户端设备(526)提供服务。例如,节点可以是云计算系统的一部分。节点可以包括以下功能:从客户端设备接收请求(526)并向客户端设备(526)传输响应。客户端设备(526)可以是计算系统(诸如图5A中所示的计算系统)。另外,客户端设备(526)可以包括和/或执行本文公开的一个或多个实施例的全部或一部分。

图5A和5B中描述的计算系统或计算系统组可以包括执行本文公开的各种操作的功能。例如,(一个或多个)计算系统可以在相同或不同系统上的进程之间执行通信。采用某种形式的主动或被动通信的各种机制可以促进同一设备上进程之间的数据交换。代表这些进程间通信的示例包括但不限于文件、信号、套接字、消息队列、管道、信号灯、共享存储器、消息传递和存储器映射文件的实现。下面提供了与这些非限制性示例中的几个相关的进一步细节。

基于客户端-服务器联网模型,套接字可以用作接口或通信信道端点,从而使得能够在同一设备上的进程之间进行双向数据传送。首先,遵循客户端-服务器联网模型,服务器进程(例如,提供数据的进程)可以创建第一套接字对象。接下来,服务器进程绑定第一套接字对象,从而将第一套接字对象与唯一的名称和/或地址相关联。在创建并绑定第一套接字对象之后,服务器进程然后等待并侦听来自一个或多个客户端进程(例如,寻找数据的进程)的传入的连接请求。此时,当客户端进程希望从服务器进程获得数据时,客户端进程将通过创建第二套接字对象开始。客户端进程然后继续生成连接请求,该连接请求包括至少第二套接字对象以及与第一套接字对象相关联的唯一名称和/或地址。然后,客户端进程将连接请求传输到服务器进程。取决于可用性,服务器进程可以接受连接请求、与客户端进程建立通信信道,或者忙于处置其它操作的服务器进程可以将连接请求在缓冲区中排队,直到服务器进程准备就绪为止。建立的连接通知客户端进程通信可以开始。作为响应,客户端进程可以生成指定客户端进程希望获得的数据的数据请求。数据请求随后被传输到服务器进程。在接收到数据请求后,服务器进程分析请求并搜集所请求的数据。最后,服务器进程然后生成包括至少所请求的数据的答复并将该答复传输到客户端进程。数据可以更通常地作为数据报或字符流(例如,字节)被传送。

共享存储器是指虚拟存储器空间的分配,以便证实一种机制,数据可以由多个进程进行通信和/或访问。在实现共享存储器时,初始化过程首先在持久或非持久存储装置中创建可共享的片段。在创建后,初始化过程安装该可共享的片段,然后将该可共享的片段映射到与初始化进程相关联的地址空间中。在安装之后,初始化进程继续识别并向一个或多个被授权的进程授予访问许可,这些进程也可以向可共享的片段写入数据或从可共享的片段读取数据。由一个进程对可共享的片段中的数据所做的改变可以立即影响也链接到该可共享的片段的其它进程。另外,当被授权的进程之一访问可共享的片段时,该可共享的片段映射到那个被授权的进程的地址空间。常常在任何给定时间除了初始化进程外都只有一个被授权的进程可以安装该可共享的片段。

在不脱离本发明的范围的情况下,可以使用其它技术在进程之间共享数据(诸如本申请中描述的各种数据)。这些进程可以是相同或不同应用的一部分,并且可以在相同或不同的计算系统上执行。

图5A中的计算系统可以实现和/或连接到数据储存库。例如,一种类型的数据储存库是数据库。数据库是为简化数据检索、修改、重组和删除而配置的信息的集合。数据库管理系统(DBMS)是为用户提供定义、创建、查询、更新或管理数据库的接口的软件应用。

用户或软件应用可以向DBMS提交语句或查询。然后,DBMS解释语句。语句可以是请求信息的select语句、update语句、create语句、delete语句等。而且,语句可以包括指定数据或数据容器(数据库、表、记录、列、视图等)的参数、(一个或多个)标识符、条件(比较运算符)、函数(例如,联接、完全联接、计数、平均值等)、排序(例如,升序、降序)或其它。DBMS可以执行语句。例如,DBMS可以访问存储器缓冲区、对文件的引用或索引以进行读取,写入、删除或其任何组合,以响应该语句。DBMS可以从持久或非持久存储装置中加载数据并执行计算以响应查询。DBMS可以将(一个或多个)结果返回给用户或软件应用。

以上对功能的描述仅呈现了由图5A的计算系统以及图5B中的节点和/或客户端设备执行的功能的几个示例。可以使用本文公开的一个或多个实施例来执行其它功能。

虽然本发明已经关于有限数量的实施例进行了描述,但是受益于本公开的本领域技术人员将认识到,可以设计出不背离如本文公开的本发明的范围的其它实施例。因而,本发明的范围应当只由所附权利要求来限定。

29页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种篡改验证方法及装置

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类