杂志的下一篇文章
骨骼III类咬合不良患者正颌外科颞下颌关节间隙的变化
特刊下一篇
BDIDA-IoT:基于区块链的分散身份体系结构提高了物联网数据流的效率
期刊上的上一篇文章
基于过滤多类型图神经网络的面向领域实体对齐方法
 
 
订购文章重印
字体类型:
宋体 佐治亚州 宋体,Verdana
字体大小:
澳大利亚 澳大利亚 澳大利亚
行距:
列宽:
背景:
第条

VulPathsFinder:基于CPG的PHP应用程序漏洞路径静态查找方法

北京邮电大学网络与交换技术国家重点实验室,北京100876
*
应向其寄送信件的作者。
申请。科学。 2023,13(16), 9240;https://doi.org/10.3390/app13169240
收到的提交文件:2023年7月14日/修订日期:2023年8月10日/接受日期:2023年8月12日/发布日期:2023年8月14日

摘要

:
如今,随着PHP应用技术的日益成熟,现代多层web应用程序的功能越来越完善,复杂性也在逐渐增加。在为开发人员提供各种业务功能和接口的同时,多层Web应用程序还成功地涵盖了应用程序开发的细节。这种类型的web应用程序采用统一入口,使用了许多面向对象的代码,并且封装、继承和多态性等特性从静态分析的角度给漏洞挖掘带来了挑战。大量面向对象的代码使得简单的函数名称匹配方法无法构建完整的调用图(CG),导致无法执行全面的过程间分析。同时,类的封装特性使得数据隐藏在对象属性中,通过一般的数据流分析无法获得漏洞路径。针对上述问题,我们提出了一种支持基于MVC(Model-View-Control)体系结构的多层web应用程序漏洞检测的漏洞检测方法。首先,我们改进了调用图和代码属性图(CPG)的构造。然后,基于增强的代码属性图,我们提出了一种支持多层web应用程序漏洞检测的技术。基于这种方法,我们实现了VulPathsFinder的原型,这是一个从PHP安全分析器Joern-PHP扩展而来的安全分析工具。然后,我们选择了10个基于MVC和10个非基于MVC的应用程序组成测试数据集,并基于该数据集验证了VulPathsFinder的有效性。实验结果表明,与当前可用的工具相比,VulPathsFinder可以更有效地处理框架应用程序,构建完整的代码属性映射,并检测现有工具无法检测到的框架应用程序中的漏洞。

1.简介

我们经常使用静态分析来检测程序中的安全漏洞,其优点是不用执行程序就可以分析代码。一系列安全分析工具,如Pixy[1]、RIPS[2],哦,皮克斯[]PHPSAFE公司[4],韦韦卡[5]和Joern-PHP[6],通常用于检测漏洞。然而,随着PHP应用程序的复杂性不断增加,当前的工具和方法面临着额外的挑战。多层web应用程序(如MVC架构)采用统一的入口点,广泛应用面向对象的代码,使得简单的函数名称匹配方法无法构建完整的调用图,导致无法执行全面的过程间分析。同时,应用封装、路由和全局配置等编程技术来隐藏通用数据流分析无法访问的复杂数据流中的漏洞[7].
现有方法无法有效地对现代多层web应用程序进行静态分析,误报率提高[8,9]. 尽管有些方法试图通过动态分析和自动漏洞验证来解决这个问题[7,10,11,12,13,14]这些方法依赖于静态分析。现有的静态分析技术无法有效地处理多层web应用程序,从而导致误报并限制动态分析。为了缓解上述问题,我们将别名分析过程合并到代码属性图的构造中。我们使用别名分析技术推断对象类型,构造方法调用边,并改进调用图以执行完整的上下文敏感进程间数据流分析。此外,我们提出了一种污点分析方法,通过可变传播路径生成漏洞数据流路径,以提高图遍历在构建漏洞路径时的效率。
基于该方法,我们实现了一个新的静态分析工具VulPathsFinder。它基于Joern PHP分析器,增加了别名分析和可变访问路径构建的功能,增强了现代多层PHP应用程序的分析能力。我们将VulPathsFinder的工作流分为三个阶段。首先,我们将PHP源代码转换为中间表示形式P-TAC[1],类似于传统的三地址码[15]. 然后,我们基于抽象语法树构造代码属性图并进行别名分析[16]和上下文敏感数据流分析[17]在此基础上构造完整的调用图和可变的访问路径。我们主要通过以下方式对原始代码属性图进行改进:(1)收集变量别名信息并跟踪变量访问路径;(2) 利用别名信息和类型推理改进调用图;(3) 根据攻击字典标记用户输入(源)和安全敏感调用(汇)节点。最后,基于节点标签和可变访问路径构造易受攻击的数据流路径。
本文的主要贡献总结如下:
  • VulPathsFinder工具的设计和实现:我们开发了一个名为VulPathsFinder的静态分析工具,专门用于解决现代多层PHP应用程序中的安全分析挑战。该工具基于Joern-PHP,扩展了别名和污点分析的功能,以增强其对复杂应用程序的分析能力。
  • 改进代码属性图的构造:我们重新设计了代码属性图构造过程。通过收集变量别名信息、跟踪变量数据传播路径以及推断类实例变量的类型信息,我们可以生成更准确、更全面的调用图。
  • 别名分析和污点分析的新方法:在构造控制流图之后,我们设计了一个基于注释解析的别名分析过程。我们还用污点标记了用户输入和安全敏感功能节点。这些改进提高了工具检测的准确性,并减少了误报。
  • 一种新的安全漏洞路径发现方法:我们提出了一种基于图遍历技术的数据流分析方法,可以有效地挖掘应用程序漏洞路径。此方法允许在过程和面向对象编程中对安全敏感函数进行有效的回溯分析。
通过实验,我们确认这些改进显著提高了复杂应用程序中静态分析的有效性。我们相信,VulPathsFinder以及本研究的其他贡献可以为PHP应用程序的未来安全分析提供新的视角和方法。
本研究的组织结构如下。第2节讨论了相关工作。第3节介绍了技术背景,通过一个运行示例讨论了基于MVC架构的应用程序为安全分析带来的挑战,并简要概述了VulPathsFinder为解决这些挑战而实施的解决方案。第4节描述了改进的CPG和漏洞路径构建算法的详细信息。第5节讨论了VulPathsFinder的实验评估。最后,第6节包括结论。

2.相关工程

在过去十年中,检测PHP代码中的安全漏洞一直是研究的重点。

2.1. 静态分析

2006年,谢和艾肯[18]解决了静态识别PHP应用程序中的SQL注入漏洞的问题。与此同时,Jovanovic等人。介绍了PHP静态污染分析工具PIXY[1]. 他们的重点是PHP应用程序中的跨站点脚本错误。他们总共分析了六个不同的开源PHP项目。在这些测试中,他们重新发现了36个已知漏洞(含27个误报)和另外15个先前未知的缺陷(含16个假阳性)。Wasserman和Su介绍了两部专注于静态查找SQL注入和跨站点脚本的作品[19,20]. Jovanovic等人。[21]将其方法扩展到SQL注入,作为Pixy工作的后续。尽管所有这些工具都是PHP应用程序漏洞自动发现领域的先驱,但它们只关注非常特定类型的缺陷,即跨站点脚本和SQL注入。
Dahse和Holz[2]拟定RIPS。RIPS构建一个控制流图,然后通过模拟每个基本块的数据流来创建块和函数摘要,从而执行精确的污染分析。在这个过程中,作者发现了osCommerce、HotCRP和PHPBB2中以前未知的缺陷。Dahse和Holz通过检测二级漏洞(例如,持久跨站点脚本)继续他们的工作,在六个不同的应用程序中识别了150多个漏洞[22]. 2015年,Olivo等人。[23]讨论了二阶拒绝服务漏洞的静态分析。他们分析了六个应用程序,其中一些与之前的工作中分析的应用程序重叠,发现了37个漏洞,伴随着18个误报。David Hauzar等人。现为WeVerca[5],一个允许为PHP应用程序定义静态分析的框架。它支持类型系统、方法调用、数据结构等。该框架通过独立于解决这些功能所需的值和堆分析定义最终用户分析来解决实现不精确或过于复杂的问题。赵静玲等。[8]提出一个检测PHP web应用程序漏洞的框架。该框架结合了静态和动态分析,以提高检测效率。Paulo A.L.D.Nunes等人。[4]提出phpSAFE,这是一个静态分析器,用于识别使用面向对象编程(OOP)开发的PHP web应用程序中的漏洞。本文针对两个著名的工具和35个广泛使用的CMS插件评估了phpSAFE。结果表明,phpSAFE明显优于其他工具。Michael Backes等人。[6]是第一个将代码属性图应用于挖掘PHP应用程序中的漏洞的公司,并实现了一种基于代码属性图的PHP应用程序漏洞发现方法。我们的工作基于它们的实现,通过收集函数、方法和实例化语句的摘要信息来完成调用边,我们进一步改进了调用图和数据流图。同时,利用摘要信息,结合攻击字典来标记用户输入和安全敏感操作节点。最后,我们使用图遍历技术构建了漏洞路径。该领域的其他工作涉及消毒程序的正确性[4,11,24].

2.2. 利用漏洞生成

Abeer Alhuzali等人。[25]目前,Chainsaw是一种工具,它改进了最先进的web应用程序注入漏洞识别和漏洞生成。Chainsaw被用于分析九个开源应用程序,生成了超过199个一级和二级开发组合,超过了几个相关方法。第二年,Alhuzali等人。呈报的NAVEX[7]这是一个结合了动态和静态分析技术的工具,用于识别漏洞并在大型多层web应用程序中构建有效的自动漏洞利用。它们都应用静态符号执行来对状态间依赖关系进行建模,这可以产生种子来指导动态扫描程序发现代码中隐藏的漏洞。Lee等人。[10]提出了一个渗透测试工具FUSE,旨在发现服务器端PHP web应用程序中的UFU和UEFU漏洞。FUSE旨在生成上传请求;每个请求都会成为触发UFU或UEFU漏洞的攻击负载。FUSE发现了30个以前未报告的UEFU漏洞,包括来自33个现实世界web应用程序的15个CVE,从而证明了其通过文件上传发现代码执行错误的有效性。Park等人。[12]介绍FUGIO,第一个针对POI漏洞的AEG工具。作者提出了一系列静态分析、动态分析和模糊化技术来计算POP链并生成漏洞利用。FUGIO报告了30个真实PHP应用程序中已知POI漏洞中的68个攻击对象。FUGIO还报告了两个以前未知的POI漏洞,并生成了可利用的对象,证明了FUGIO在显著减轻面向属性编程的繁重负担方面的有效性。
总之,从检查安全敏感函数到控制流图,再到代码属性图,关于数据结构的静态污染漏洞检测技术已经越来越完善。其核心是通过检测用户输入是否达到安全敏感功能,检查用户输入并跟踪数据流以触发敏感操作。然而,由于广泛使用了面向对象的代码、封装和动态特性,现代多层web应用程序使得这些方法很难准确获取污染传播路径或执行完整的过程间分析。虽然动态分析或动态和静态分析的混合方法可以避免上述问题,但由于需要代码运行环境和动态测试所需的较长时间,它无法实现完全自动化的检测。我们基于代码属性图原型Michael Backes等人。实现并通过别名分析将方法调用边添加到调用图中。我们建议通过可变传播路径构建污点传播路径来生成漏洞路径。一方面,我们构建了一个完整的调用图,允许安全分析师基于这个代码属性图对进程间的数据流进行更准确的分析。另一方面,我们解决了由于封装而无法准确获取污染传播路径的问题。

3.背景和动机

在本节中,我们首先介绍代码属性图(CPG)的基本知识。随后,通过几个示例,我们展示了现代PHP应用程序中用于漏洞检测的现有CPG原型实现中的不足,启发我们重新设计我们的解决方案。

3.1. Joern-PHP概述

我们的研究基于代码属性图的概念,它是程序语法、控制流和数据流的集成表示。这一概念首先由山口等人提出。并应用于检测C代码中的漏洞[26]. 该方法的关键思想是将传统的程序表示合并到代码属性图中,从而通过图遍历技术实现代码模式挖掘。抽象语法树(AST)清楚地展示了程序的嵌套结构,而控制流图(CFG)允许对语句之间的交互进行推理,尤其是它们的执行顺序,而程序依赖图(PDG)揭示了语句和谓词之间的依赖关系。这些依赖性支持程序内的静态数据流分析,尤其是可攻击控制数据的传播。虽然代码属性图中AST、CFG和PDG的组合为分析程序控制和数据流提供了强大的结构,但CFG和PD仅限于功能级别。将调用图并入代码属性图允许我们在过程间级别执行控制和数据流分析。
2017年,Michael等人。将其引入到PHP应用程序漏洞检测中,并使用调用图来丰富代码属性图[6]. 他们开发了Joern-PHP,这是一个为PHP应用程序构建代码属性图的原型工具,并演示了如何使用图遍历技术进行跨过程漏洞分析。尽管Michael等人。将调用图引入到代码属性图的原型实现中,方法调用的边是不完整的。对于动态方法调用,只有当方法名称在项目中唯一时,才会构造从调用节点到相应方法声明的边。如果没有类型推理,就无法获得动态方法调用和类方法之间的映射关系,这使得该工具不适合在广泛使用封装和方法调用的现代应用程序中进行漏洞检测。因此,我们通过使用别名分析,将方法调用边添加到调用图中,并跟踪变量或字段之间的数据传播,进一步丰富了此结构,以更好地促进跨过程分析。

3.2. 别名分析

作为静态分析的基础,指针分析主要检查指针可能引用的所有可能对象[27,28,29]. 面向对象语言主要用于确定变量或字段可能指向的潜在对象。指针分析在面向对象编程的程序分析中起着至关重要的作用,结果通常表示为指针和内存位置之间的点对关系,或者表示为每个指针的可能目标对象集。它提供程序内的基本数据流信息。指针分析被公认为最基本的静态分析技术之一,其研究已有40多年的历史,主要集中在Java和C/C++等语言上[30,31,32]. 指针分析是一种静态代码分析技术,用于确定程序中指针或引用变量可能指向的对象。这种分析在许多高级程序分析任务中是不可或缺的,例如程序切片、数据流分析、程序理解等。
别名分析[33]是指针分析的一个重要分支,其重点是确定在程序执行期间可能引用同一内存位置的两个或多个指针变量,也称为别名。这个问题存在于许多编程语言中,尤其是那些允许显式指针操作(如C和C++)的语言。别名分析的重要性源于它的多种应用场景。例如,编译器可以使用别名信息来优化程序,在确认没有别名冲突时更自由地重新排列指令,并提高程序执行效率。此外,别名分析是许多高级程序分析和转换的基础,如程序切片、数据流分析、线程分析等。
别名分析面临的挑战之一是,它需要解决的问题是不可判定的,这意味着没有任何算法能够在所有情况下精确地确定所有别名关系。因此,现有的别名分析技术通常需要平衡精度和效率。共同战略[28,31]在实践中包括:
  • 流敏感分析:这种别名分析考虑程序的执行顺序,提供更精确的结果,但计算复杂度更高。
  • 流敏感分析:与流敏感分析相反,这种别名分析忽略程序的执行顺序,产生的结果不太精确,但计算复杂度较低。
  • 上下文敏感分析:这种类型的别名分析考虑函数调用的上下文,能够处理函数之间的别名关系,但计算复杂度较高。
  • 上下文相关分析:与上下文相关分析相比,这种类型的别名分析忽略了函数调用的上下文,导致结果不太精确,但计算复杂度较低。
尽管别名分析面临众多挑战,但通过选择适合特定应用程序需求的策略,它仍然是一个非常有用的工具。

3.3. 污点跟踪分析技术

着色分析[34]是一种跟踪和分析程序中受污染信息流的技术。在漏洞分析中,污点分析用于标记感兴趣的数据(来源(例如,不受信任的用户提供的数据)。可以通过跟踪受污染数据流并检查其是否影响关键项目操作来发现漏洞(水槽). 这将识别程序漏洞的问题转化为确定受污染信息是否到达执行关键操作的汇点。
着色分析通常涉及以下组件:
  • 识别产生受污染信息的来源,并标记受污染数据。
  • 通过特定规则跟踪和分析受污染信息的传播。
  • 在汇点检测关键操作是否受到受污染信息的影响。
被篡改的信息不仅可以通过数据相关性传播,还可以通过控制相关性传播。我们将通过数据依赖的信息流称为显式信息流,而通过控制依赖的信息流动称为隐式信息流。
  • 基于数据流的污点分析将污点分析视为专注于污点数据的数据流分析,而不考虑隐含的信息流。它包括根据污染传播规则跟踪污染信息,或标记污染路径上的变量,并检查污染信息是否影响敏感操作。
  • 基于依赖的污点分析考虑了隐含的信息流。分析过程根据程序中语句或指令之间的依赖关系,检查汇聚点的敏感操作是否依赖于在源点接收受污染信息的操作。
静态污染分析系统[2,4,6,7,35]首先解析程序代码以获得中间表示。他们执行辅助分析,如控制流分析,以获得控制流图、调用图和其他必要信息。在辅助分析过程中,系统可以使用污点分析规则来识别中间表示中的源点和汇点。最后,检测系统利用基于污点分析规则的静态污点分析来检查程序中与污点相关类型的漏洞。

3.4. 运行示例

对于使用新实例创建类实例的语句,获取实例化变量的类类型相对容易。如今,越来越多的PHP应用程序是基于框架开发的。这些框架使用类封装了常见的业务功能,并广泛利用了动态数组和反射功能。这使得通过静态分析获取类型信息变得非常困难。静态分析无法检索与方法调用对应的类方法,导致调用图不完整,并且难以进行过程间数据流分析。
为了解释研究问题和动机,我们从两个实际应用程序中提取了相关代码,并将它们组合成示例代码片段[36,37],如清单1和2所示:
清单1。MVC应用程序中简单代码片段的第一部分。
Applsci 13 09240 i001公司
清单1定义了一个名为Push的控制器类,它扩展了controller类(第3-13行)。在Push类的index()方法中,使用post()方法调用类属性请求,并将其返回值赋给变量$cf名称。请求属性源自父类Controller。清单2显示post()方法从全局变量检索用户输入$_邮政数组。
在清单1中,属性$此->请求在Push类的父类Controller中初始化。在Controller类中,$此->请求初始化为的实例 t吨 小时 n个 k个 R(右) e(电子) q个 u个 e(电子) t吨 通过构造函数中的动态数组赋值。我们无法获取的类类型$此->请求通过静态或别名分析。然而,我们注意到,我们可以从所请求属性的注释(第15-17行)推断出它是 t吨 小时 n个 k个 R(右) e(电子) q个 u个 e(电子) t吨 类。除了实例创建语句之外,标准化的开发实践还为我们提供了额外的静态信息。我们可以通过注释解析获得相应参数或类字段的类型信息。
清单2。MVC应用程序中的简单代码片段的第二部分。
Applsci 13 09240 i002公司
在清单1(第6-8行)中,$cf名称直接连接到SQL语句中,并在非状态方法调用中用作参数,$SQL->WHERE_and().在第10行,实例化$博客_结果通过调用Results类的构造函数执行。随后,在第11行运行查询Results类的方法被调用$博客_结果检查Results类定义(清单1,第24-32行)可以发现,在类方法中运行查询(_query)(清单1,第28-31行),class属性$这个->sql作为参数传递给非状态方法,$数据库->查询()根据清单1第2行,$数据库是一个全局变量,是DB类的一个实例(清单2,第6-15行)。
在清单2中查询方法(第11-14行)表示$查询_SQL非状态方法调用的参数$this->dbhandle.query()(清单2,第12行)。根据DB类的构造函数推断(__construct()),$this->dbhandle是mysqli类的一个实例$this->dbhandle.query()一个原始的、安全敏感的方法调用。
最后,$this->request.post()从全局变量中提取用户输入数据。将结果值赋给变量$cf名称,然后将其合并到SQL语句中,并通过$SQL->鉴于和()到SQL类属性$this->其中.然后,$SQL->获取()指导的价值$这个->在哪里作为的参数$博客_结果实例属性$sql语言.$博客_结果通过调用安全敏感方法执行包含用户输入的SQL语句,Mysqli->query(),通过运行查询(_query)方法。

3.5. 动机

总结一下提供的实例,对象封装应用程序中存在的动态特性使得直接检索实例对象的类具有挑战性。然而,这些应用程序具有统一的体系结构和相对标准的语言约定,使我们能够通过解析注释中的变量或类字段声明类型来间接确定其对应的类,从而构造方法调用边。此外,此类应用程序通过实例属性封装数据,通过数据流图遍历来掩盖潜在的漏洞。
以这个例子为例,我们综合了现有的挑战,并提出了在检测当代web应用程序中的漏洞时进行静态分析的解决方案。
要发现上述SQL注入漏洞,我们必须:
  • 实现过程间数据流跟踪,因为许多关键方法调用在多个调用点之间发生,从而创建准确的调用图。
  • 确保分析将控制流图中的字段变量和上下文临时变量映射到相同的对象或值(例如。,$SQL->SQL==$_t2时间).
  • 将程序依赖图与过程间污点分析结合起来,以跟踪可变访问路径。
总之,现代多层web应用程序大量使用面向对象代码及其封装、动态和附加功能,使对象类型不明确,因此需要现有工具来帮助构建基于方法调用的完整调用图,并执行全面的过程间分析。受污染的信息被封装在大量的类代码中,由于传统数据流分析无法发现隐藏的易受攻击的数据流,因此导致误报。代码属性图的现有实现旨在构建一个完整的图结构,该结构表示代码语法和语义,并通过图遍历技术执行过程间数据流分析。然而,构建代码属性图并不能推断对象类型,因此无法执行完整的过程间分析。图遍历技术使用代码属性图来基于通用污点跟踪方法构建漏洞路径,该方法无法发现封装在对象属性中的污点信息,并可能导致误报。此外,这种基于安全敏感节点回溯数据流图的图遍历方法容易导致路径爆炸和效率低下。因此,有必要改进现有的代码属性图构建过程,优化图遍历算法,以缓解现有静态分析工具中的误报和漏洞检测效率低的问题。具体而言,我们确定了以下挑战:

3.6. 挑战

面向对象。多层Web应用程序广泛采用面向对象编程(OOP),通过方法调用执行功能。特别是,非状态方法是通过从相应类实例化的变量来调用的。我们必须确定这些实例化变量的特定类型,以便在代码属性图中构建全面的调用图。然而,许多应用程序严重依赖于面向对象编程和动态特性,只在运行时显示特定的类型。如清单1(第20-21行)所示,通过静态分析直接获得这些类型显然是一项挑战。另一方面,面向对象编程的封装特性掩盖了数据依赖性,使得我们很难通过追溯数据流来发现缺陷。
性能。在许多现代应用程序中,许多功能需要一系列相互依赖的步骤,通常使用不同的模块完成。如果安全敏感功能位于这些模块的深层,则中间数据流节点的交叉会生成许多数据流路径。此外,为了准确识别从用户输入到安全敏感函数/方法的数据流路径,必须识别安全敏感方法的名称并分析调用该方法的变量的实例化。将这些任务直接集成到漏洞路径发现算法中必然会增加其复杂性并降低其效率。
可扩展性。除了利用安全敏感的功能外,现代应用程序还封装了安全敏感的方法,例如$this->dbhandle清单2中DB类的属性。为所有安全敏感功能/方法设计特定的数据流路径查找算法是一项挑战。为了保持可扩展性,我们根据安全敏感操作的现有形式将其分类为安全敏感函数和方法,并为其设计了统一的漏洞路径遍历算法。通过引入攻击字典,用户可以根据漏洞类型配置相应的安全敏感函数或方法,而无需更改算法。例如,我们可以设置查询()清单2中DB类的方法作为安全敏感的方法并执行遍历。

4.实施概述

考虑到现代多层web应用程序面向对象的封装特性,我们旨在设计和实现一种基于增强的代码属性图的统一、可扩展和高效的漏洞路径发现方法。
基于这种方法,我们开发了一个工具VulPathsFinder。为了解决可伸缩性问题,我们的工具分为三个步骤:(1)从源代码转换为三地址代码;(2) 增强型代码属性图的构造;(3) 识别漏洞路径。VulPathsFinder的体系结构如所示图1.
第一步将给定应用程序的源代码作为输入,将其解析为抽象语法树(AST),然后使用PHPToTAC工具将AST转换为三地址代码形式的源代码,同时保持原始项目文件的目录结构。
第二步涉及构建增强的代码属性图。此阶段以三地址代码形式处理代码文件,解析文件中的语句以构建控制流图和程序依赖图。为了解决面向对象的挑战,我们基于控制流图进行类型推理,以获取实例对象和可变访问路径的类型信息。然后,我们将从调用点到方法定义的调用关系添加到调用图中,以便于后续的过程间分析。此外,在类型推理过程中,我们在函数或方法返回值和调用点之间建立数据依赖边(USE-DEF关系),从而细化程序依赖图。我们引入了一个攻击字典,其中包含有关安全敏感函数的信息,以及从公认的安全敏感方法到类的映射,以解决性能问题和可伸缩性。在类型推理过程中,我们使用攻击字典标记安全敏感的函数和方法调用节点以及用户输入节点,从而避免在代码属性图中查询安全敏感操作和用户输入节点。
第三步涉及构建漏洞路径。通过将安全敏感功能/方法节点作为数据流回溯和进行污点分析的起点,我们可以通过标记的用户输入节点和可变的访问路径跟踪污点的传播路径,从而识别从安全敏感节点到用户输入的漏洞路径。

4.1. PHP解析器

为了分析最新版本的PHP,我们使用PHP-Parser[38]作为从PHP源代码生成解析树的库。此库会随每个PHP版本不断更新,从而方便后续更新和维护。解析器可以用于静态分析、代码操作和任何其他以编程方式处理代码的应用程序。解析器构造代码的抽象语法树(AST),使其能够被抽象和稳健地处理。
还有其他处理源代码的方法。PHP本机支持的一种方法是使用“token_get_all”生成的令牌。令牌流的级别比AST低得多,因此具有不同的应用程序:它还允许分析文件的确切格式。另一方面,对于更复杂的分析,令牌流更难处理。例如,AST抽象出一个事实,即在PHP中,变量可以写为$foo公司,$$酒吧,${“足球”},甚至${!${“}=barfoo()}。您不必担心标识令牌流中的所有不同语法。
除了解析器本身,此包还捆绑了对其他几个相关功能的支持:
  • 预打印支持,这是将AST转换为PHP代码的操作;
  • 支持将节点树序列化和反序列化为JSON;
  • 支持以人类可读的形式转储节点树;
  • 用于遍历和修改AST(节点遍历器和节点访问者)的基本基础设施;
  • 用于分析命名空间名称的节点访问者。

4.2. PHPtoTAC公司

除了引入新的PHP解析器之外,我们还修改了中间模型的构造,以适应面向对象的特性和别名分析。由于我们引入了一个新的PHP解析器来构建抽象语法树(AST),我们利用基于该AST的PHP解析器的节点遍历功能来检查每个节点。本模块[39]跟踪各种类型的表达式(赋值、函数调用、方法调用、实际参数、形式参数等),并监视函数定义、类定义、对象引用、方法定义、变量、名称空间和接口。PHP-Parser通过遍历跟踪将这些表达式和语句节点转换为三地址代码格式,这允许我们对转换后的代码执行别名分析和变量数据跟踪。因此,在进行污染分析时,我们可以执行过程间数据流分析。

4.3. 代码属性图

将PHP源代码转换为基于PHP-Parser的三地址代码格式后,我们将其用作Joern-PHP的源代码输入,以构建代码属性图(CPG)。首先,我们将转换后的三地址代码解析为AST,然后遍历AST中的每个文件以构建控制流图。然后遍历此控制流图以分析别名,以获取可变别名信息。基于注释和实例创建语句,我们推断变量的实例类型,解析方法调用点,并创建方法调用边以改进调用图。
在Joern-PHP之上,我们添加了别名分析和变量实例类型推断来创建方法调用边。该过程的伪代码如算法1和2所示:
算法1和2显示了我们基于Joern-PHP添加的类型推理和调用图构建过程。
在算法1中,遍历的过程称为抽象语法树(AST)(第4行)。算法1中的第5–22行显示了遍历控制流图以执行上下文相关别名分析的过程。此过程遍历控制流图并分析语句的赋值、存储和加载操作。通过这个解析过程,一方面,我们可以推断变量的方向信息,即类型信息。另一方面,我们可以为变量构造访问路径。算法1中的第23行显示了基于前两个步骤的结果构建调用图的过程。
算法1类型推理与调用图构造(1)
输入:
  1:
A类 S公司 :抽象语法树; C类 F类 G公司 :控制流图
输出:
  2:
第页 t吨 :点对信息; C类 G公司 :调用图
  3:
e(电子) t吨 小时 o(o) d日 C类 = [ ] , n个 t吨 n个 c(c) e(电子) V(V) 第页 = [ ]
  4:
第页 第页 e(电子) A类 S公司 ( A类 S公司 )
  5:
对于  (f) u个 n个 c(c) t吨 o(o) n个 n个 C类 F类 G公司 . (f) u个 n个 c(c) t吨 o(o) n个  
  6:
      S公司 t吨 t吨 e(电子) e(电子) n个 t吨 = (f) u个 n个 c(c) t吨 o(o) n个 . e(电子) t吨 V(V) e(电子) 第页 t吨 c(c) e(电子) ( )
  7:
     对于  t吨 t吨 n个 t吨 t吨 e(电子) e(电子) n个 t吨  
  8:
            c(c) o(o) n个 t吨 e(电子) x个 t吨 = d日 第页 t吨 c(c) 小时 ( t吨 t吨 )
  9:
            V(V) 第页 = 第页 第页 e(电子) V(V) 第页 ( t吨 t吨 )
10:
           如果  c(c) o(o) n个 t吨 e(电子) x个 t吨 : v(v) 第页 n个 n个 t吨 n个 c(c) e(电子) V(V) 第页  然后
11:
                  如果  t吨 t吨 v(v) 第页 . (f) =  然后
12:
                        A类 d日 d日 E类 d日 e(电子) ( c(c) o(o) n个 t吨 e(电子) x个 t吨 : , c(c) o(o) n个 t吨 e(电子) x个 t吨 : v(v) 第页 . (f) )
13:
                  结束条件为
14:
                  如果  t吨 t吨 = v(v) 第页 . (f)  然后
15:
                        A类 d日 d日 E类 d日 e(电子) ( c(c) o(o) n个 t吨 e(电子) x个 t吨 : v(v) 第页 . (f) , c(c) o(o) n个 t吨 e(电子) x个 t吨 : )
16:
                  结束条件为
17:
             结束条件为
18:
             如果  t吨 t吨 x个 =  然后
19:
                   A类 d日 d日 E类 d日 e(电子) ( c(c) o(o) n个 t吨 e(电子) x个 t吨 : , c(c) o(o) n个 t吨 e(电子) x个 t吨 : x个 )
20:
             结束条件为
21:
      结束
22:
结束
23:
第页 o(o) c(c) e(电子) C类 ( e(电子) t吨 小时 o(o) d日 C类 )
详细信息解析AST如算法2所示(第3-21行)。它主要解析实例创建语句(算法2,第5-9行)、方法调用(算法2、第10-15行)和全局语句(算法2中,第16-19行)。全局语句反映变量的范围,这会影响我们对相应变量的类型推断。这个过程处理调用(算法2,第28-39行)首先解析方法调用中的实例变量和方法,然后通过实例变量名从变量方向信息中获取实例变量对应的类,然后用调用边将调用语句与相应的方法定义节点连接。此外,我们在调用点的实际参数变量和相应方法的形式参数(算法2,第34-36行)之间建立了数据依赖边。如果该方法有返回值,则还将在返回值节点和调用语句的左值之间建立数据依赖边(算法2,第37行)。
需要注意的是,算法1–3具有一些特定代码未显示的功能。这些功能是功能性的,代表一个过程。我们通过在算法的相应位置添加注释来描述它们的功能。
将上述过程应用于示例代码后,我们获得了改进的代码属性图和变量访问路径,如所示图2:
算法2类型推理和调用图构造(2)
输入:
  1:
A类 S公司 :抽象语法树; C类 F类 G公司 :控制流图
输出:
  2:
第页 t吨 :点对信息; C类 G公司 :调用图
  3:
功能 分析AST( A类 S公司 )
  4:
      对于  n个 o(o) d日 e(电子) n个 A类 S公司 . n个 o(o) d日 e(电子)  
  5:
            如果  n个 o(o) d日 e(电子) A类 n个 n个 d日 n个 o(o) d日 e(电子) . 第页 小时 t吨 N个 e(电子) w个  然后
  6:
                    c(c) o(o) n个 t吨 e(电子) x个 t吨 = d日 第页 t吨 c(c) 小时 ( n个 o(o) d日 e(电子) )  //获取节点的上下文信息
  7:
                    v(v) 第页 , c(c) = 第页 第页 e(电子) N个 e(电子) w个 ( n个 o(o) d日 e(电子) ) //获取变量名和类
  8:
                    A类 d日 d日 < c(c) o(o) n个 t吨 e(电子) x个 t吨 : v(v) 第页 , [ c(c) ] > t吨 o(o) n个 t吨 n个 c(c) e(电子) V(V) 第页
  9:
            结束条件为
10:
            如果  n个 o(o) d日 e(电子) G公司 o(o) b条  然后
11:
                    c(c) o(o) n个 t吨 e(电子) x个 t吨 = d日 第页 t吨 c(c) 小时 ( n个 o(o) d日 e(电子) )
12:
                    V(V) 第页 = 第页 第页 e(电子) G公司 o(o) b条 ( n个 o(o) d日 e(电子) ) //获取全局声明的变量名
13:
                    C类 e(电子) = G公司 e(电子) t吨 o(o) b条 j个 e(电子) c(c) t吨 (f) 第页 o(o) n个 t吨 n个 c(c) e(电子) V(V) 第页
14:
                    A类 d日 d日 < c(c) o(o) n个 t吨 e(电子) x个 t吨 : v(v) 第页 , c(c) e(电子) > t吨 o(o) n个 t吨 n个 c(c) e(电子) V(V) 第页
15:
            结束条件为
16:
            如果  n个 o(o) d日 e(电子) M(M) e(电子) t吨 小时 o(o) d日 C类  然后
17:
                    c(c) o(o) n个 t吨 e(电子) x个 t吨 = d日 第页 t吨 c(c) 小时 ( n个 o(o) d日 e(电子) )
18:
                    A类 d日 d日 < c(c) o(o) n个 t吨 e(电子) x个 t吨 : v(v) 第页 , [ e(电子) t吨 小时 o(o) d日 C类 ] > t吨 o(o) e(电子) t吨 小时 o(o) d日 C类
19:
            结束条件为
20:
      结束
21:
end函数
22:
功能 添加边缘( , t吨 )
23:
      如果  t吨 n个 o(o) t吨 n个 第页 t吨  然后
24:
             A类 d日 d日 t吨 t吨 o(o) 第页 t吨
25:
             n个 t吨 n个 c(c) e(电子) V(V) 第页 ( ) = n个 t吨 n个 c(c) e(电子) V(V) 第页 ( t吨 )
26:
      结束条件为
27:
end函数
28:
功能 处理调用( e(电子) t吨 小时 o(o) d日 C类 )
29:
      对于  e(电子) t吨 小时 o(o) d日 C类 n个 e(电子) t吨 小时 o(o) d日 C类  
30:
             C类 o(o) n个 t吨 e(电子) x个 t吨 , e(电子) t吨 小时 o(o) d日 = d日 第页 t吨 c(c) 小时 ( e(电子) t吨 小时 o(o) d日 C类 )
31:
             o(o) b条 j个 e(电子) c(c) t吨 V(V) 第页 = 第页 第页 e(电子) V(V) 第页 ( e(电子) t吨 小时 o(o) d日 C类 ) //从方法调用分析对象
32:
             c(c) e(电子) t吨 c(c) (f) 第页 o(o) n个 t吨 n个 c(c) e(电子) V(V) 第页 b条 e(电子) d日 o(o) n个 t吨 小时 e(电子) o(o) b条 j个 e(电子) c(c) t吨 V(V) 第页 )
33:
             d日 d日 < e(电子) t吨 小时 o(o) d日 C类 c(c) : e(电子) t吨 小时 o(o) d日 > t吨 o(o) C类 G公司
34:
            对于  第页 第页 e(电子) t吨 e(电子) 第页 第页 o(o) (f)  
35:
                    A类 d日 d日 E类 d日 e(电子) ( c(c) o(o) n个 t吨 e(电子) x个 t吨 : , 第页 )
36:
            结束
37:
             A类 d日 d日 E类 d日 e(电子) ( c(c) o(o) n个 t吨 e(电子) x个 t吨 : 第页 e(电子) t吨 , c(c) o(o) n个 t吨 e(电子) x个 t吨 : 第页 )
38:
      结束
39:
end函数
如所示图2,我们通过类型推理在调用位置和方法之间构建调用边来改进调用图,并完善了程序依赖图(PDG)[6]通过在方法返回值和调用点的左值之间建立数据依赖关系。同时,通过获取实例的类型信息和类型推理过程中变量之间的数据传播路径,构造了右侧变量访问路径图。它包括以下元素:用户输入标记节点、变量之间的USE-DEF关系、过程间数据传播和安全敏感调用标记。此外,我们使用虚线连接表示相同实例封装的数据字段节点。尽管它们处于不同的上下文或过程中,但它们表示相同的数据,并且它们之间确实没有USE-DEF定义的程序依赖性。因此,我们使用虚线连接它们。这样,我们就获得了一个完整的变量访问路径,可以指导我们构建一个完整漏洞路径。

4.4. 图的遍历

在构建代码属性图时,我们根据攻击字典标记用户输入和安全敏感调用。这样,我们就避免了在图遍历期间基于图遍历检查用户输入和查询安全敏感调用。由于基于安全敏感调用的图遍历技术在递归回溯数据流中容易发生路径爆炸,因此我们修改了通过递归回溯的方法来构造易受攻击的路径的过程。更新后的算法如算法3所示:
算法3基于传播路径和图遍历的污点分析
  1:
S公司 n个 k个 = G公司 e(电子) t吨 S公司 n个 k个 ( ) //从CPG获取汇聚节点
  2:
所有路径=[]
  3:
对于  n个 k个 n个 n个 k个  
  4:
        第页 t吨 小时 = n个 k个 . o(o) o(o) 第页 ( ) . n个 ( R(右) E类 A类 C类 H(H) E类 S公司 ) . o(o) o(o) 第页 ( n个 o(o) d日 e(电子) . k个 e(电子) 第页 ! = o(o) u个 第页 c(c) e(电子) )  //遍历可变访问路径
  5:
        t吨 t吨 _ 第页 t吨 小时 第页 e(电子) t吨 第页 e(电子) v(v) e(电子) ( 第页 t吨 小时 )  //从变量访问路径检索语句节点
  6:
        A类 t吨 小时 . d日 d日 A类 ( t吨 t吨 _ 第页 t吨 小时 )
  7:
结束
算法3基于可变访问路径和汇标记构建漏洞路径,这仍然是一个图遍历过程,但不再基于程序依赖关系图中的数据流回溯。首先,我们从代码属性图中查询汇聚标记以获得汇聚节点(第1行)。基于获得的汇聚点,我们获得受污染的变量,在可变访问路径中定位变量节点,然后以汇聚点为起始节点对可变访问路径进行回溯。如果我们遇到用户输入标记,我们将停止回溯(第3-4行)。此时,我们已经提取了用户输入到安全敏感调用的可变访问路径。最后,我们将这些可变访问路径中的可变节点恢复到相应CPG中的语句节点,从而获得漏洞路径(第5-6行)。与Joern-PHP的漏洞路径发现的图遍历算法相比,算法3大大简化了图遍历过程。然而,这并不意味着我们的工具简化了漏洞路径发现的整个过程。如所示图2,我们在遍历控制流图时构造可变访问路径,标记用户输入节点,并标记安全敏感操作。由于遍历控制流图是必要的,因此我们在此过程中执行一些附加操作以简化最终的图遍历过程。

5.评估

5.1. 数据集

我们在基于开源框架或MVC结构开发的十个应用程序上评估VulPathsFinder,如表1我们对应用程序的选择标准如下:(1)我们评估了具有统一框架结构的流行、大规模应用程序,无论它们是独立开发的还是基于开源框架开发的复杂应用程序,并且包括了具有报告漏洞的最新版本;(2) 我们比较了静态漏洞检测工具使用的相同测试应用程序。

5.2. 安装程序

我们实施了PHPtoTAC[39]使用PHP-Parser将源代码转换为三种地址码格式[38]并基于Joern-PHP实现了静态分析工具VulPathsFinder[40]. 我们在Ubuntu 22.04.2 LTS上部署了VulPathsFinder,每个内核2.6 GHz,内存50 GB。为了评估VulPathsFinder,我们将其精度和召回率与四个PHP静态分析工具进行了比较:Joern-PHP[6],ooPIXY(哇)[]和RIPS[2]. 我们使用真实世界的开源PHP应用程序进行了实验。对VulPathsFinder和Joern-PHP进行比较,以评估基于Joern-HPP的增强带来的改进。由于RIPS和ooPixy支持OOP功能,因此与VulPathsFinder的比较可以深入了解OOP支持。然而,RIPS的最新版本是商业的、非开源的,并且不提供学术许可。因此,我们在评估中使用了最新的开源版本0.55。
在整个评估过程中,我们使用了以下定义:精度(),召回(R(右))、和 F类 e(电子) u个 第页 e(电子) (F类) []. 精度是真阳性数的比率(TP(转移定价))报告的错误数,包括报告的真阳性和假阳性(FP公司):
= + F类 .
召回是真阳性数与实际错误数的比率,包括报告的真阳性数和假阴性数(FN公司,我们未能检测到的)。
R(右) = + F类 N个 .
F类 e(电子) u个 第页 e(电子) 提供了结合精度和召回率的综合测量标准。这个 F类 e(电子) u个 第页 e(电子) 给定工具的范围介于0和1之间。我们将使用,R(右) F类 e(电子) u个 第页 e(电子) 为所研究的工具提供准确度排名。
F类 e(电子) u个 第页 e(电子) = ( 2 R(右) ) + R(右) .

5.3. 结果摘要

我们从数据集中选择了10个基于MVC架构的应用程序作为测试集,评估VulPathsFinder和Joern PHP在构建代码属性图方面的差异,主要体现在两个方面:(1)改进前后代码属性图中节点和边类型的变化;(2) 二者在构建代码属性图时的时间效率比较。
如所示表2,我们对同一数据集进行了比较,该数据集包括十个项目和总共1336649行代码。首先,我们可以看到AST节点和边的数量以及CFG边的数量在两者之间是一致的,因为我们使用php-AST以相同的方式解析相同的数据集。主要区别在于调用数和程序依赖边。然后,VulPathsFinder中的调用边数比Joern-PHP中的要多,因为我们已经将方法调用边添加到调用图中。此外,与Joern-PHP相比,程序依赖边的数量也增加了,因为在处理方法调用时,我们同时处理了调用点处具有左值的函数和方法的返回值的USE-DEF关系,从而增加了程序依赖边数量。
中的最后一行表2显示了两个工具在同一数据集上构造代码属性图所花费的时间。因此,两者的时间相同。这主要是因为整个过程所花费的时间是由于遍历AST节点和控制流图,这两个节点都没有改变。此外,添加程序依赖边和调用边只会增加整个AST和CFG遍历过程的恒定计算负载,因此它们不会显著影响最终的总运行时。
除了由使用中描述的框架的现代应用程序组成的数据集之外表2,我们收集了另一个由不使用统一框架的流行应用程序组成的数据集。该数据集用于比较VulPathsFinder和Joern-PHP对非框架和基于框架的现代应用程序的漏洞检测的影响。实验结果如所示表3.
与OOPixy和RIPS相比,PHPAudit和Joern-PHP可以检测大多数漏洞。OOPixy是一个基于Pixy开发的工具,用于适应PHP的面向对象特性。它只支持检测SQLi和XSS漏洞,并且适用的PHP版本是浅层的(PHP5)。在运行此工具进行漏洞检测时,我们没有获得有效的输出结果。调试时,由于无法解析某些代码,在解析PHP代码以生成中间代码(例如类的访问修饰符)时,我们通常会遇到语法错误。此外,该工具通过基于控制流图识别用户输入和安全敏感功能来执行污点分析。封装用户输入和安全敏感功能会妨碍完整的过程间分析。上述问题导致OOPixy无法输出有效的检测结果。RIPS检测到OOPixy的其他漏洞,目前作为商业项目进行维护。它的开源版本只有5.5。虽然它在PHP中对许多内置函数进行建模,并基于控制流图构建漏洞信息流路径,但它不支持面向对象的代码分析,并且处理复杂的封装应用程序需要太长时间,因此无法输出有效的结果。我们重点关注VulPathsFinder和Joern PHP在两个数据集上的漏洞检测性能。
如所示表3,对于非MVC应用程序,Joern-PHP和VulPathsFinder之间的漏洞检测结果略有不同。两者的漏洞检测逻辑略有不同。主要区别在于,我们对源代码输入执行三地址代码转换,消除了循环逻辑,并大大减少了图所遍历的路径数。此外,我们改进了基于图遍历的漏洞检测算法。VulPathsFinder使用标记和访问路径进行漏洞检测,这也在剪枝图遍历和缓解图遍历技术中的低效问题方面发挥了作用。专栏几何平均值显示了基于MVC架构的应用程序漏洞检测结果的几何平均值。从本专栏中的值可以看出,VulPathsFinder在基于MVC的应用程序漏洞检测的准确性和时间消耗方面优于Joern-PHP。对于基于MVC的应用程序,VulPathsFinder添加了变量类型推断,该推断通过推断对象类型向调用图添加额外的方法调用边。它还改进了程序依赖图,缓解了代码属性图中过程间分析不完整的问题。同时,它还保持了Joern-PHP的原始可扩展性。基于上述改进,VulPathsFinder和Joern-PHP对基于MVC的应用程序的漏洞检测性能进行了比较。Joern-PHP显著提高了准确性并减少了漏洞检测所花费的时间。

6.结论

面向对象代码在多层现代web应用程序中的广泛使用从静态分析的角度对漏洞挖掘提出了挑战,包括封装、继承和多态性。大量面向对象的代码使得无法使用简单的函数名称匹配方法构建完整的调用图,导致无法执行全面的过程间分析。类的封装特性使得数据隐藏在对象属性中,使得无法通过通用数据流分析获得漏洞路径。为了缓解上述问题,我们通过添加别名分析功能来改进代码属性图,为基于代码属性图的完整过程间分析提供基础。此外,为了缓解图遍历技术的效率问题,我们提出了一种基于可变访问路径的漏洞路径构建方法,以提高漏洞发现的效率。然而,我们必须承认,现代PHP应用程序的深度动态特性使得静态分析技术无法完全解决对象类型推断的问题,VulPathsFinder生成的结果仍然需要手动验证。在未来的工作中,我们将根据VulPathsFinder的检测结果进行动态测试研究,以避免手动验证,实现漏洞检测和验证的全自动化。

作者贡献

概念化,S.Q.和C.Z。;方法论,C.Z。;软件,C.Z。;验证、C.Z.、T.T.和C.W。;形式分析、C.Z.和S.Q。;调查,C.Z。;资源,C.W。;数据管理,C.Z。;书面原稿编制,C.Z。;写作审查和编辑,C.Z.和S.Q。;可视化,C.Z。;监督,T.T。;项目管理,C.Z。;资金收购,S.Q。所有作者都已阅读并同意手稿的出版版本。

基金

这项工作得到了2021YFB270040国家重点研发计划的支持。

机构审查委员会声明

不适用。

知情同意书

不适用。

数据可用性声明

不适用。

利益冲突

作者声明没有利益冲突。

缩写

本手稿中使用了以下缩写:
CPG公司代码属性图
CG公司调用图
PDG公司程序依赖关系图
配置文件控制流图

工具书类

  1. Jovanovic,N。;克鲁格尔,C。;Kirda,E.Pixy:用于检测web应用程序漏洞的静态分析工具。2006年5月21日至24日,美国加利福尼亚州伯克利/奥克兰,IEEE 2006年安全与隐私研讨会(S&P’06)会议记录;第6页。[谷歌学者]
  2. Dahse,J。;Holz,T.模拟用于精确静态代码分析的内置PHP功能。2014年2月23日至26日,美国加利福尼亚州圣地亚哥,《NDSS会议记录》;第14卷,第23-26页。[谷歌学者]
  3. 纳沙特,M。;Ali,K。;Miller,J.检测面向对象PHP程序中的安全漏洞。2017年9月17日至18日在中国上海举行的2017 IEEE第17届国际源代码分析与操作工作会议记录;第159-164页。[谷歌学者]
  4. Nunes,P.J.C。;丰塞卡,J。;Vieira,M.phpSAFE:面向对象的web应用程序插件的安全分析工具。2015年6月22日至25日,在巴西里约热内卢举行的2015年第45届IEEE/IFIP可靠系统和网络国际年会论文集;第299-306页。[谷歌学者]
  5. Hauzar,D。;Kofroň,J.Weverca:针对php的Web应用程序验证。《软件工程与形式方法:第12届国际会议论文集》,SEFM 2014,格勒诺布尔,法国,2014年9月1日至5日;程序12。施普林格:德国柏林/海德堡,2014年;第296–301页。[谷歌学者]
  6. Backes,M。;Rieck,K。;斯科鲁帕,M。;股票,B。;Yamaguchi,F.高效灵活地发现php应用程序漏洞。2017年IEEE欧洲安全与隐私研讨会(EuroS&P)会议记录,2017年4月26-28日,法国巴黎;第334-349页。[谷歌学者]
  7. Alhuzali,A。;Gjomemo,R。;埃塞特,B。;Venkatakrishnan,V.NAVEX:为动态web应用程序生成精确且可扩展的漏洞。2018年8月15日至17日在美国马里兰州巴尔的摩举行的第27届USENIX安全研讨会(USENIX-Security 18)会议记录;第377-392页。[谷歌学者]
  8. 赵,J。;Gong,R.PHP web应用程序中安全漏洞检测的新框架。2015年7月8日至10日在巴西圣卡塔里纳举行的2015年第九届通用计算创新移动和互联网服务国际会议论文集;第271-276页。[谷歌学者]
  9. Livshits,B。;Nori,A.V.公司。;Rajamani,S.K。;Banerjee,A.Merlin:显式信息流问题的规范推理。ACM Sigplan不是。 2009,44, 75–86. [谷歌学者] [交叉参考]
  10. Lee,T。;Wi、S。;Lee,S。;Son,S.FUSE:通过渗透测试发现文件上传错误。《NDSS会议记录》,美国加利福尼亚州圣地亚哥,2020年2月23日至26日。[谷歌学者]
  11. 巴尔扎罗蒂,D。;Cova,M。;Felmetsger,V。;Jovanovic,N。;柯达,E。;克鲁格尔,C。;Vigna,G.Saner:合成静态和动态分析,以验证web应用程序中的净化。2008年5月18日至22日,美国加利福尼亚州奥克兰,IEEE 2008年安全与隐私研讨会(SP 2008)会议记录;第387-401页。[谷歌学者]
  12. 南帕克。;Kim,D。;贾纳,S。;Son,S.FUGIO:PHP对象注入漏洞的自动利用漏洞生成。2022年8月10日至12日在美国马萨诸塞州波士顿举行的第31届USENIX安全研讨会(USENIX-Security 22)会议记录;第197-214页。[谷歌学者]
  13. 埃里克森,B。;佩莱格里诺,G。;Sabelfeld,A.黑寡妇:黑匣子数据驱动的网络扫描。2021年IEEE安全与隐私研讨会(SP)会议记录,美国加利福尼亚州旧金山,2021年5月24日至27日;第1125-1142页。[谷歌学者]
  14. 李,P。;Meng,W。;卢克。;Luo,C.关于自动内置函数建模用于php符号执行的可行性。2021年4月19日至23日在斯洛文尼亚卢布尔雅那举行的2021年网络会议记录;第58-69页。[谷歌学者]
  15. 阿霍,A.V。;Sethi,R。;J.D.乌尔曼。编译器:原理、技术和工具; 艾迪森·韦斯利阅读:阅读,马萨诸塞州,美国,2007年;第2卷。[谷歌学者]
  16. Sridharan,M。;Chandra,S。;杜比,J。;芬克,S.J。;Yahav,E.面向对象程序的别名分析。面向对象编程中的混叠。类型、分析和验证; 施普林格:德国柏林/海德堡,2013年;第196-232页。[谷歌学者]
  17. Khedker,美国。;三亚,A。;B.萨特。数据流分析:理论与实践; CRC出版社:美国佛罗里达州博卡拉顿,2017年。[谷歌学者]
  18. 谢毅。;Aiken,A.脚本语言中安全漏洞的静态检测。2006年7月31日至8月4日在加拿大不列颠哥伦比亚省温哥华举行的USENIX安全研讨会会议记录;第15卷,第179-192页。[谷歌学者]
  19. Wassermann,G。;Su,Z.针对注入漏洞对web应用程序进行可靠而精确的分析。2007年6月10日至13日在美国加利福尼亚州圣地亚哥举行的第28届ACM SIGPLAN编程语言设计与实现会议记录;第32-41页。[谷歌学者]
  20. Wassermann,G。;Su,Z.跨站点脚本漏洞的静态检测。第30届软件工程国际会议论文集,德国莱比锡,2008年5月10日至18日;第171-180页。[谷歌学者]
  21. Jovanovic,N。;克鲁格尔,C。;Kirda,E.用于检测web应用程序中的污染类型漏洞的静态分析。J.计算。安全。 2010,18, 861–907. [谷歌学者] [交叉参考]
  22. Dahse,J。;Holz,T.Web应用程序中二阶漏洞的静态检测。2014年8月20日至22日在美国加利福尼亚州圣地亚哥举行的第23届USENIX安全研讨会(USENIX-Security 14)会议记录;第989–1003页。[谷歌学者]
  23. Olivo,O。;迪利格,I。;Lin,C.检测和利用web应用程序中的二阶拒绝服务漏洞。2015年10月12日至16日,美国科罗拉多州丹佛市,第22届ACM SIGSAC计算机和通信安全会议记录;第616–628页。[谷歌学者]
  24. Yu,F。;Alkhalaf,M。;Bultan,T.Stranger:一个用于php的基于自动机的字符串分析工具。2010年3月20日至28日在塞浦路斯帕福斯举行的欧洲软件理论与实践联合会议(ETAPS 2010)第16届国际会议《系统构建与分析工具与算法会议记录》(the Proceedings of the Tools and Algorithms for the Construction and Analysis of Systems:16th International Conference,TACAS 2010);程序16。施普林格:德国柏林/海德堡,2010年;第154-157页。[谷歌学者]
  25. Alhuzali,A。;埃塞特,B。;Gjomemo,R。;Venkatakrishnan,V.Chainsaw:链式自动化基于工作流的漏洞生成。2016年ACM SIGSAC计算机和通信安全会议记录,2016年10月24日至28日,奥地利维也纳;第641-652页。[谷歌学者]
  26. 山口,F。;Golde,N。;阿普·D。;Rieck,K.使用代码属性图建模和发现漏洞。2014年IEEE安全与隐私研讨会论文集,美国加利福尼亚州伯克利,2014年5月18日至21日;第590-604页。[谷歌学者]
  27. Weihl,W.E.存在指针、过程变量和标签变量时的跨过程数据流分析。1980年1月28日至30日,美国内华达州拉斯维加斯,第七届ACM SIGPLAN-SIGCT编程语言原理研讨会论文集;第83–94页。[谷歌学者]
  28. 指针分析:我们还没有解决这个问题吗?2001年6月18日至19日,美国犹他州雪鸟市,2001年ACM SIGPLAN-SIGSOFT软件工具和工程程序分析研讨会论文集;第54-61页。[谷歌学者]
  29. 海因策,N。;Tardieu,O.需求驱动的指针分析。ACM Sigplan非。 2001,36, 24–34. [谷歌学者] [交叉参考]
  30. Milanova,A。;Rountev,A。;Ryder,B.G.Java指向和副作用分析的参数化对象敏感性。2002年7月22日至24日在意大利罗马举行的2002年ACM SIGSOFT国际软件测试与分析研讨会论文集;第1-11页。[谷歌学者]
  31. Sridharan,M。;Bodík,R.基于精炼的上下文敏感点——Java分析。ACM SIGPLAN非。 2006,41, 387–400. [谷歌学者] [交叉参考] [绿色版本]
  32. Hardekopf,B。;Lin,C.蚂蚁和蚱蜢:对数百万行代码进行快速准确的指针分析。2007年6月10日至13日,美国加利福尼亚州圣地亚哥,第28届ACM SIGPLAN编程语言设计与实现会议论文集;第290-299页。[谷歌学者]
  33. 张,Q。;Lyu,M.R。;袁,H。;Su,Z.Dyck-CFL可读性的快速算法及其在别名分析中的应用。第34届ACM SIGPLAN编程语言设计与实现会议记录,2013年6月16日至19日,美国华盛顿州西雅图;第435-446页。[谷歌学者]
  34. Lei,W。;冯·L。;Lian,L。;肖冰,F。污染分析的原理与实践。J.软件。 2017,28, 860–882. [谷歌学者]
  35. 李,P。;Meng,W.Lchecker:检测php中的松散比较错误。2021年4月19日至23日在斯洛文尼亚卢布尔雅那举行的2021年网络会议记录;第2721–2732页。[谷歌学者]
  36. Skoruppa,M.b2evolution 7-2-2-“cf_name”SQL注入。2021. [谷歌学者]
  37. Rookie,D.远程代码执行漏洞#238。2020. [谷歌学者]
  38. 波波夫,N.nikic/PHP-Parser:用PHP编写的PHP解析器。2018. [谷歌学者]
  39. 赵,C.PHPCodeToTAC。2023. [谷歌学者]
  40. Skoruppa,M.PHPCodeToTAC。2017. [谷歌学者]
图1。VulPathsFinder的体系结构。带灰色的组件表示对Joern-PHP原始架构的修改或添加。
图1。VulPathsFinder的体系结构。带灰色的组件表示对Joern-PHP原始架构的修改或添加。
阿普西13 09240 g001
图2。代码示例的代码属性图。
图2。代码示例的代码属性图。
阿普西13 09240 g002
表1。基于MVC和非MVC项目的列表。
表1。基于MVC和非MVC项目的列表。
类别项目/版本
基于MVCosTicket v1.11版
开放式Web Analytics v1.73
PrestaShop v8.0.4
LimeSurvey v3.17.13
WebSvn 2.6.0版
皮维戈v11.3.0
b2进化v7.2.2
lansuite v2.1.0版
qdPM v9.1
印象机v1.4.2
非MVCpfBlockerNG v2.1.4版
SPIP v3.1.1
公交通行证管理系统v1.0
elFinder v2.1.47
DomainMod v4.13
60周期CMS 2.5.2
Webtareas v2.0版本
SPIP v4.2.0
SQLiteManager 1.2.0版
Webutler v3.2
表2。数据集和图形大小。
表2。数据集和图形大小。
项目乔恩-PHPVulPathsFinder
#共个项目1010
#php文件的69236923
#LOC的1,336,6491,336,649
#AST节点的数量3,936,0573,936,057
#AST边缘3,880,4793, 880, 479
#CFG边缘611,351611,351
#PDG边缘25,946291,881
#的呼叫边缘53286459
#次,共次1213
表3。脆弱性的实验结果。表示运行时间;TF公司,FP公司,,R(右)、和F类与中描述的相同第5.2节; 破折号表示该工具不支持检测漏洞。
表3。脆弱性的实验结果。表示运行时间;TF公司,FP公司,,R(右)、和F类与中描述的相同第5.2节; 破折号表示该工具不支持检测漏洞。
类别主题#项目VulPathsFinderOO像素RIPS(独立电源系统)乔恩-PHP
TP(转移定价)FP公司R(右)F类TP(转移定价)FP公司R(右)F类TP(转移定价)FP公司R(右)F类TP(转移定价)FP公司R(右)F类
非MVCSQL注入440.5610.721380000-0000-3040.5710.73201
命令注入1120.3310.50170000-10000-23120.3310.5038
跨站点脚本110.2510.40240000-20000-3810.2510.4050
文件读取11011151-----10000-671011197
文件上传11011150-----10000-651011185
代码执行220111290000-0000-252011153
基于MVCSQL注入4410.8010.891390000-0000-42210.670.501172
命令注入1110.5010.67190000-10000-360000-34
跨站点脚本1110.5010.67230000-20000-47110.5010.6739
文件读取11011151-----10000-730000-38
文件上传11011152-----10000-690000-37
代码执行220111300000-20000-390000-27
几何平均值0.7610.8640.36--00-1.57--00-42.99--0.580.710.9457.99
免责声明/出版商注释:所有出版物中包含的声明、意见和数据仅为个人作者和贡献者的声明、观点和数据,而非MDPI和/或编辑的声明、看法和数据。MDPI和/或编辑对内容中提及的任何想法、方法、说明或产品造成的任何人员或财产伤害不承担任何责任。

分享和引用

MDPI和ACS样式

赵,C。;Tu,T.等人。;王,C。;秦,S。VulPathsFinder:基于CPG的PHP应用程序中查找漏洞路径的静态方法。申请。科学。 2023,13, 9240.https://doi.org/10.3390/app13169240

AMA风格

赵C,涂T,王C,秦S。VulPathsFinder:基于CPG的PHP应用程序中查找漏洞路径的静态方法。应用科学. 2023; 13(16):9240.https://doi.org/10.3390/app13169240

芝加哥/图拉宾风格

赵春晖、涂腾飞、王成和秦素娟。2023.“VulPathsFinder:基于CPG的PHP应用程序中查找漏洞路径的静态方法”应用科学13、16号:9240。https://doi.org/10.3390/app13169240

请注意,从2016年第一期开始,该杂志使用文章编号而不是页码。请参阅更多详细信息在这里.

文章指标

返回页首顶部