当前位置: 网站首页 - 应用安全 - 应用安全
发表日期:2015年6月8日 编辑:admin 有3355位读者读过此文 【字体:
PHP自动化白盒审计技术与实现

0x00 前言

国内公开的PHP自动化审计技术资料较少,相比之下,国外已经出现了比较优秀的自动化审计实现,比如RIPS是基于token流为基础进行一系列的代码分析。传统静态分析技术如数据流分析、污染传播分析应用于PHP这种动态脚本语言分析相对较少,但是却是实现白盒自动化技术中比较关键的技术点。今天笔者主要介绍一下最近的研究与实现成果,在此抛砖引玉,希望国内更多的安全研究人员将精力投入至PHP自动化审计技术这一有意义的领域中。

0x01 基础知识

自动化审计的实现方式有多种,比如直接使用正则表达式规则库进行定位匹配,这种方法最简单,但是准确率是最低的。最可靠的思路是结合静态分析技术领域中的知识进行设计,一般静态分析安全工具的流程大多是下图的形式:

静态分析工作所要做的第一件事情就是将源码进行建模,通俗一点讲,就是将字符串的源码转为方便于我们后续漏洞分析的中间表示形式,即一组代表此代码的数据结构。建模工作中一般会采用编译技术领域中的方法,如词法分析生成token,生成抽象语法树,生成控制流程图等。建模工作的优劣,直接影响到后续污染传播分析和数据流分析的效果。

执行分析就是结合安全知识,对载入的代码进行漏洞分析和处理。最后,静态分析工具要生成判断结果,从而结束这一阶段的工作。

0x02 实现思路

经过一段时间的努力,笔者和小伙伴也大致实现了一款针对自动化的静态分析工具。具体实现思路正是采用了静态分析技术,如果想深入了解实现思路,可以阅读之前发过的文章。在工具中,自动化审计流程如下:

首先载入用户输入的待扫描的工程目录中所有的PHP文件,并对这些PHP文件做判别,如果扫描的PHP文件是Main file,即真正处理用户请求的PHP文件,那么对这种类型的文件进行漏洞分析。如果不是Main file类型,比如PHP工程中的类定义,工具函数定义文件,则跳过不做分析。

其次进行全局数据的搜集,重点搜集的信息有待扫描的工程中类信息的定义,如类所在的文件路径、类中的属性、类中的方法以及参数等信息。同时对每个文件生成文件摘要,文件摘要中重点搜集各个赋值语句的信息,以及赋值语句中相关变量的净化信息和编码信息。

全局初始化之后,进行编译前端模块的相关工作,使用开源工具PHP-Parser对待分析的PHP代码进行抽象语法树(AST)的构建。在AST的基础上,使用CFG构建算法构建控制流图,并实时地生成基本块的摘要信息。

编译前端的工作中,如果发现敏感函数的调用,就停下来进行污染传播分析,进行过程间分析、过程内分析,找到对应的污点数据。然后基于数据流分析过程中搜集的信息,进行净化信息和编码信息的判断,从而判断是否为漏洞代码。

如果上一步是漏洞代码,则转入漏洞报告模块进行漏洞代码段的收集。其实现的基础是在系统环境中维护一个单例模式的结果集上下文对象,如果生成一条漏洞记录,则加入至结果集中。当整个扫描工程结果之后,使用Smarty将结果集输出到前端,前端做扫描结果的可视化。



相关专题:

相关信息:
 没有相关信息

相关评论:
 没有相关评论