一种基于污点分析的PHP静态代码分析方法与流程

文档序号:28168221发布日期:2021-12-24 23:02阅读:335来源:国知局
一种基于污点分析的PHP静态代码分析方法与流程
一种基于污点分析的php静态代码分析方法
技术领域
1.本发明涉及网络安全领域,具体涉及一种基于污点分析的php静态代码分析方法。


背景技术:

2.对于代码审计,目前主流分为黑盒测试、白盒测试。两种测试方式最大的区别是在于审计系统能否获取目标系统的源代码。在黑盒测试中,审计系统不知道目标的源代码,它把目标程序当作一个黑箱,可以不用考虑目标程序的内部结构与逻辑。审计系统通过不断改变输入的数据,通过获取程序的输出或其工作状态从中判定是否存在漏洞。由于每次测试都是通过确定的数据引发了非正常结果,所以黑盒测试是一种误报率很低的测试方式,但它对于漏洞的检测覆盖率取决于输入数据的容量,往往难以完全覆盖程序的各个分支,容易造成漏报的现象。
3.白盒测试是掌握软件源代码的情况下,通过分析源代码中的语法、函数调用等具体代码来寻找漏洞。由于白盒审计工具可以读取到源码,即它比黑盒测试来说可以完全的覆盖代码中的全部分支,即白盒测试的漏报率低,但相比于黑盒测试中每次漏洞发现都是由确切的恶意数据引发的,白盒测试静态的分析来发现漏洞会带来更高的误报率高。
4.目前针对 php 的源代码的审计工具有:pixy,rips 等。其中 pixy 是一款由 java 开发的静态检测工具。它只支持自动扫描 php4 语法下的源代码和部分 php5 语法下的源代码,已经无法处理目前最新的 php7 语法特性,并且也只能识别 xss 漏洞,并不能检出其他类型的漏洞。rips 也是一款知名的开源静态检测工具,可以通过代码分析和正则分析来检测漏洞,并且会给出修复提示。
5.总体来看,目前业界虽然已经有 php 漏洞分析工具,但是目前源码分析工具大多都陷入了停止更新的情况,已无法适配目前新版 php 的语法特性。这导致了从新特性中引入的漏洞将无法正确的识别,也带来对新特性的误报。


技术实现要素:

6.本发明的目的在于研究是如何利用污点分析技术来分析 php 源代码,因此提供一种基于污点分析的php静态代码分析方法,先分析了web应用常见的漏洞及其原理,研究了当前流行的污点分析检测方法,并创造性地对每个变量增加了变量类型的约束。此外,审计系统通过 web 页面报告漏洞,对漏洞信息,污点传输流程进行可视化显示,这样便于安全人员的查看分析。
7.为实现上述目的,本发明的技术方案是:一种基于污点分析的php静态代码分析方法,首先,对php静态代码进行词法分析和语法分析,构建对应代码的抽象语法树;其次,将抽象语法树分割成不同的子函数,利用污点分析技术对每个函数中污点数据流进行标记;最后,根据污点数据流的汇聚点参数性质来判定是否存在漏洞。
8.在本发明一实施例中,在标记污点数据流时,通过限制新增变量的数据类型缩小变量范围,结合具有安全威胁函数在被利用时的条件以降低漏洞误报率。
9.在本发明一实施例中,该方法具体实现步骤如下:步骤s1、对 php 代码进行词法分析和语法分析,构建对应代码的抽象语法树,在源代码中的结构信息会在抽象语法树中的每个节点里;这并不会破坏原始代码的逻辑或语法规则。抽象语法树在语法检查,代码格式化等中起到很重要的作用,本发明利用抽象语法树把待检测的源代码转化为更利于分析的语法结构。
10.步骤s2、将抽象语法树分割成不同的子函数,利用污点分析技术对每个子函数中污点数据流进行标记,每个输入点在初始化中都会携带一个污点状态,被分析的代码中每个变量都会有一组关联状态表,代表污点状态变换的过程中的代码;通常来说污点流都会显式的进行传播。在污点分析策略中转变为污点的操作主要是输入源,传播(赋值),函数调用等,同时也会有一些操作进行清理污点,例如哈希算法。
11.步骤s3、根据污点数据流的汇聚点参数性质来判定是否存在漏洞,当污点数据流在代码中传播,一旦出现污点汇聚点,即需判断污点汇聚点中是否带有污点标识,若存在污点标识,则判断存在漏洞。
12.在本发明一实施例中,步骤s1中,构建对应代码的抽象语法树实现方式如下:步骤s11、获取源代码;步骤s12、经过词法分析器,将源代码按照 php 中的语法标准生成词素流;步骤s13、接着经过语法分析器把词素流转换为符合 php 语法的抽象语法树。
13.相较于现有技术,本发明具有以下有益效果:(1)创造性的提出通过新增限制变量的数据类型来缩小变量的范围,通过结合具有安全威胁的函数利用的条件共同的降低误报。
14.(2)系统通过不同的模块相互耦合,可以对目录下的 php 文件进行自动的分析、标记、追踪污点流来发现可能存在的应用漏洞,并且生成可视化的数据报告。
15.(3)从未来发展来看,自动化审计必定会慢慢取代传统的人工审计。当前基于污点分析技术的审计工具有着较低的误报率,必会成为未来网络安全的研究热点。
附图说明
16.图1为本发明静态代码分析工具流程图。
17.图2为函数节点的结构。
18.图3为带有条件分支的代码基于污点分析的 php 静态代码分析工具设计与实现。
19.图4为带有清洗函数的代码。
20.图5为总体结果显示。
21.图6为漏洞细节展示。
具体实施方式
22.下面结合附图,对本发明的技术方案进行具体说明。
23.本发明一种基于污点分析的php静态代码分析方法,首先,对php静态代码进行词法分析和语法分析,构建对应代码的抽象语法树;其次,将抽象语法树分割成不同的子函数,利用污点分析技术对每个函数中污点数据流进行标记;最后,根据污点数据流的汇聚点参数性质来判定是否存在漏洞。
24.基于本发明一种基于污点分析的php静态代码分析方法,本发明实现了基于污点分析php静态代码漏洞检测原型工具,即将静态代码分析工具引入编码阶段,设计并实现了基于 php 的静态代码分析工具。首先本发明将介绍静态代码分析攻击的框架结构与各个模块的功能,进而分析每个框架中的实现方式。
25.1、php静态代码分析框架对于php静态代码分析工具,按照文件夹、单个文件、单个函数的自顶向下的设计模式。对整个工具分为文件夹分析模块、文件分析模块、函数分析模块、结果显示模块共4给模块,如图1所示。
26.1)文件夹分析模块,作为整个分析的入口模块它需要收集目标目录下待检测的文件,并且按顺序的进行文件分析。
27.2)文件分析模块,需要将对应文件内部拆分成为更小的函数块,进而使用函数分析模块进行分析。
28.3)函数分析模块,使用污点分析来分析对应的函数中代码是否存在污点数据被危险函数所执行。
29.4)结果显示模块,使用 html 技术将发现的漏洞进行可视化显示。
30.2、文件夹分析模块文件夹分析模块作为整个分析项目的起点,其主要功能有1)遍历并存储目标文件夹 目录下所有 php 文件;2)分析每个 php 文件互相的引用关系;3)根据相互关系来决定解析文件的先后。
31.算法1:按顺序分析文件(files,includesmap)/* 由于 php 文件中可以使用“include”来引用外部 php 代码,所以需要按一定顺序分析各个文件。 *//* files 为待处理的文件路径集合;*/图 4

1 php 静态代码分析工具流程图福州大学本科生毕业设计(论文)12/* includesmap 为每个文件互相引用的关系*/1. begin2.
ꢀꢀꢀ
handledfiles
ꢀ←ꢀø
3.
ꢀꢀꢀ
do4.
ꢀꢀꢀꢀ
list = files \ handledfiles5.
ꢀꢀꢀꢀ
if list =
ꢀøꢀ
then6.
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break7.
ꢀꢀꢀꢀ
end8.
ꢀꢀꢀꢀ
for each file ∈ list do9.
ꢀꢀꢀꢀꢀꢀ
if includesmap[file] \ handledfiles =
ꢀøꢀ
then10.
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
dofileanalysis(file)11.
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
add file to handledfiles12.
ꢀꢀꢀꢀꢀ
end
13.
ꢀꢀ
end14.
ꢀꢀ
end15. end在算法 1 表示了如何决定文件解析的先后,算法的输入是一个待处理文件集合和各个文件的引用关系。在程序开始会初始化一个数组用于存储已处理过的文件集。之后算法进入一个循环,循环的终止条件是所有文件处理完毕,即待处理的文件集与已处理文件集的差集是为空集。在循环内部,将会处理依次处理当前轮次中待处理的文件,通过文件引用关系表与已处理的文件取差集是否为空来判断该文件所引用的文件是否被处理完成。若该文件所引用的文件已经处理完成后,就可以处理该文件,并在处理后把该文件加入到已处理文件集中,否则跳过该文件继续处理下一个文件。
[0032]
3、文件分析模块文件分析模块需要将文件内部的代码通过语法分析、词法分析构建对应的抽象语法树,其次需要将给定的文件进行切割成各个函数,以供函数分析模块处理。但在php中运行引用外部的文件,如果不提前处理会导致后期对函数分析时出现大量的未定义函数、未知的污点流,从而降低代码分析的准确性。
[0033]
3.1、处理文件包含对于文件包含的问题,由于在 php 代码中只能通过“include”或其它别名函数来引用其他 php 文件。这些引用方式在对应抽象语法树中都汇集成\phpparser\node\expr\include_节点。所以只需要检测到对应节点,就可以判断出引入外部的文件。这样就可以将对应的基于污点分析的 php 静态代码分析工具设计与实现php文件中的函数、污点源数据继承到当前文件中。由于在算法1中,我们已经可以保证单 php 文件被分析时,该对应的引用文件已经被分析完毕,所以这里就可以不经过判断直接的继承对应的数据。
[0034]
3.2、切分函数对于整个 php 代码文件可以分为用户自定的函数与非函数部分。用户定义的函数在没有被调用时是不会自动执行。而非函数部分会在脚本执行时按顺序自动执行,我们可以把这些非函数部分的代码看作一个无输入参数函数,我们将这种函数称为主函数。在构建的抽象语法树中,每个函数都是以\phpparser\node\stmt\function_节点存储,节点结构如图2。节点中包含了函数名称、函数参数和函数中的语句。对于用户函数的提取,只需要遍历节点中的所有\phpparser\node\stmt\function_即可。
[0035]
对于主函数则需要手动创建一个\phpparser\node\stmt\function_节点,并且设置函数名,参数为空。遍 历 文 件 中 非 \phpparser\node\stmt\function_ 节 点下的所有\phpparser\node\stmt,即单行的语句节点存储到\phpparser\node\stmt\function_的语句集中。最终我们通过分割 php 文件中的各个函数,和把非函数代码段组建成一个函数。这样对每一个 php 文件可以以许多独立的函数来做进一步分析。
[0036]
4、函数分析模块函数分析模块可以确定由开发人员定义的函数是否属于安全威胁的函数,即在不安全的调用中,是否会调用系统的安全威胁函数。如果对于主函数的分析,则可以判断这个文件是否存在安全漏洞。
[0037]
4.1、污点对象
对于每一个污点变量都会采用一个对象进行存储,称为污点对象。在污点对象中,需要存储的有:1)当前状态下的污点标识;2)当前的变量类型,主要种类有“int”,“string”,“boolean”等 php 常见类型,也有 mixed 一种可以表示任意类型的类别;3)当前变量的值,如果被标识为污点状态,该值会被置空;4)在代码执行过程中,有改变过污点值的所有语句结构。
[0038]
4.2、污点传递分析对于一个初始的函数,首先程序会对函数的参数进行分析:该函数是否包含参数和参数是否强制定义了某些类型。把这些参数标记污点状态并加入污点源中。之后对于每一行代码进行分析。这里采用了动静结合的方式:1)对于一些常见的数字运算“+”,
“‑”
,“*”,“/”,位运算“&”,“|”,“!”等对于左右值都是非污点的状况,即左右值都为已知。这时可以直接的进行运算。获得运算后的值。这时获取后的值也是为确定值,也是非污点状态。
[0039]
2)对于一些不在威胁函数和不允许执行的函数表中的函数,也可以按照 1)中的方式执行,当调用函数中的参数都为非污点值,这可以执行该函数,获取对应的返回值。
[0040]
3)对于运算值或参数中存在污点值,这时我们采用一种基于变量类型的方式降低传播污点类型。对于算数运算符,我们可以确定的是在运算后的结果必定是为数字类型,包括整数与浮点数。例如在 php 中“1+1=2”,
“’
a’+1”会抛出一个警告后继续执行,最终的结果为 1。对于字符串之间的运算例如连接符“.”,最终返回的是字符串型的变量。这时就可以大胆的确定该污点变量为字符串型。
[0041]
4)对于一些函数调用也会出现污点数据,这代表无法直接执行该函数获得返回值,这里类似 3)的方案,本设计共统计了 php 自带与扩展库中共计 1 万个函数,根据官方文档给出的返回值,建立了一个“函数

参数

返回值”表。通过这个表格,我们就可以增加被标记的污点变量的类型,降低后期误报率。
[0042]
4.3、对于代码分支的分析在程序中也会出现分支类型的代码,比如使用“if”语句可以根据不同的条件执行不同的代码。以图3代码为例。
[0043]
很容易就可以发现第 6 行的“exec”为 php 中执行系统命令函数,是一种具有安全威胁的函数。那么“$var”变量的污点状态就决定了这个函数是否需要报告漏洞。通过跟踪“$var”变量的来源,会发现在第 2 行与第 4 行中都对“$var”变量进行了污点的修改,第 2 行中把“$var”变量变为污点状态,而第4行变为了非污点状态。这一切都取决于第1行的条件。所以对于这种情况,我们依次采用以下两种策略:1) 当条件中的所有变量都是非污点状态,因为表达式内的变量都有确定的值,可以直接判断条件的真假,来决定选择的分支。
[0044]
2) 当条件中存在部分变量为污点状态时,这时就无法通过直接的计算来确定分支。这里采用污点优先的原则。当有多条分支都对一个变量进行污点状态修改时,最终的污点状态为各条污点状态相与。简单来说,若有一条分支让某变量变污点,那么这个变量就会被污点标记,只有全部分支都让某变量变为清洁状态,该变量才是清洁状态。
[0045]
4.4、污点汇聚分析经过对函数内代码的分析与污点跟踪,就会跟踪到可能存在安全威胁的函数。我们都 知道,即使有存在安全威胁的函数也是需要一定条件才能被执行的。以图4代码为例:代码中出现两个函数,第 1 行中“intval”函数功能为把输入的变量转化为整数,它的返回值为整数类型。第 2 行中“system”函数功能为执行系统命令,并且将执行命令的结果输出到屏幕,在我们的程序分析中,“$_get”为超全局变量,可以被用户所控制,是为污点数据。那么其子元素“evil”也是污点数据,经过了 intval 函数,赋值给“$var”,所以“$var”变量就通过“$_get[

eval’]”感染为污点变量,其次分析程序通过对函数表的查询,提取到“intval”返回是“int”类型,最终把“$var”变量标记为整数类型的污点变量。程序继续分析,到达第 2 行,发现出现一个调用一个存在安全威胁函数。对每个参数进行污点判别,发现与所需的字符串类型污点数据不符合,最终报告该代码安全。
[0046]
从上面的例子可以看出,通过对污点变量类型的判断,可以有效的减少无法利用的误报现象。
[0047]
4.5、函数性质的认定当分析完毕整个函数后,我们会关注以下两个问题 1)在该函数中是否调用了存在安全威胁的函数,并且有可能触发的漏洞。如果存在可能出现的漏洞,那么对于这个开发人员定义的函数就是有安全威胁的函数。将来在别的函数中若调用也会存在安全威胁。反之,这个函数就是一个安全的函数。2)该函数的返回值是否确定,返回值类型是什么。我们可以通过“return”关键字来做到简单的判断汇总,如果每个返回值都是确定一种类型。那么这个函数的返回值类型也确定。若存在多种不同的类型,本发明中统一归为“mixed”混合类型。
[0048]
5、结果展示经过前几个模块的分析处理,我们虽然已经可以发现待分析代码中漏洞的情况,但是这些仅仅有文字数据还是不够直观,就需要有相应的系统进可视化显示,以便可以人工的查看漏洞的信息。所以工具设计了一个模块用来显示结果与漏洞信息,整个可视化模块使用了前端框架vue 与代码高亮模块 prismjs。一共有两个主要页面:1)总体结果显示,展示分析了文件数量与找到的不同等级漏洞数量,如图5,从图中我们可以很清晰的获取到扫描的文件数量,检出的漏洞数量及其不同等级漏洞中的占比。
[0049]
2)对于漏洞细节,采用了三段式的结构,左端文件列表与当前文件的模块信息,中间为当前查看文件的源代码,右端为漏洞信息,并且可以查看污点流。其中漏洞点会使用红色高亮,污点流会使用黄色高亮。如图6。我们可以看出该文件中存在两个严重类型的漏洞,他们都是调用了危险函数“shell_exec”。在中间的窗格中可以看到,第 10 行代码被红色高亮,显示当前为漏洞的汇聚点;在第 5 行被黄色高亮,显示污点数据“$target”在该行受到了影响,影响的源为“$_request[

ip’]。
[0050]
以上是本发明的较佳实施例,凡依本发明技术方案所作的改变,所产生的功能作用未超出本发明技术方案的范围时,均属于本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1