上期小阑针对基于文本特征的 PHP 开源白盒审计工具进行了初步的介绍。本期针对基于静态分析的 PHP 开源白盒审计工具进行初步探索。
基于静态分析:即借助传统静态分析技术来进行白盒审计。常见的技术主要有数据流分析、污点传播和控制流分析等。静态分析的方式能够更加准确的判断外部输入是否经过安全函数的处理,这点是基于文本特征的方式很难实现的。此外,基于静态分析的方式在判断一个变量是否部分/全部来自外部输入的时候也更有优势,尤其在针对框架进行审计的时候。但是,有好的一面就有坏的一面,基于静态分析的问题在于:
1)时间开销大,做一次完整的分析所需的时间远大于基于文本特征的方式;
2)适配成本高,针对不同的目标,需要适配相应的解析器来生成所需的 AST 树和 CFG 等信息,此外,检测规则的适配也是一个相对较重的成本。
基于静态分析
Cobra
Github: https://github.com/WhaleShark-Team/cobra
Language: Python2
Last commit on 2019.08.23
2016 年开源的白盒审计工具 Cobra 相信很多人都曾听说过。迄今为止,Cobra 已经在 Github 上收获 2.1k 的 star,也是这次分析的开源白盒审计工具中 star 数最多的项目。Cobra 支持直接通过命令行的方式进行白盒审计,也支持启动一个本地 WEB 服务,然后通过 WEB 界面或者 API 交互的方式控制 cobra 对源码进行白盒审计和查看报告。Cobra 支持 PHP、Java、Python 等开发语言,并支持数十种类型文件,还支持对 WEB 框架的识别,具体列表如下:
开发语言 |
PHP、Java、Python、JSP、C、Ruby、Perl、Lua、Go、Swift、C++、C#、Header、Objective-C、Scale、Ceylon、Kotlin、Shell、Bat、JavaScript、HTML、CSS |
文件 |
Image、Font、Conf、CMake、SQL、Compression、Executable、Log、Text、Office、Media、Certificate、Source、Thumb、Git |
框架 |
WordPress、Joomla、Drupal、CodeIgniter、ThinkPHP、Laravel、Kohana、Yii、Symfony、Phalcon、Slim、CakePHP、Django、Flask、Sprin |
Cobra 具体工作原理官方文档已经介绍的很详细,引用如下:
对于一些特征较为明显的可以使用正则规则来直接进行匹配出,比如硬编码密码、错误的配置等。 对于OWASP Top 10的漏洞,Cobra通过预先梳理能造成危害的函数,并定位代码中所有出现该危害函数的地方,继而基于 Lex (Lexical Analyzer Generator, 词法分析生成器)和 Yacc (Yet Another Compiler-Compiler, 编译器代码生成器)将对应源代码解析为 AST (Abstract Syntax Tree, 抽象语法树),分析危害函数的入参是否可控来判断是否存在漏洞(目前仅接入了PHP-AST,其它语言AST接入中)。
Cobra 的检测规则主要分为依赖检查规则和代码安全扫描规则。依赖检查只支持 Python、Java 和 NodeJS 三种主要语言。主要为检查引用的第三方库的版本是否满足相应语言配置文件(requirements.txt、pom.xml、package.json)中规定的版本要求。Cobra 共提供 95 条代码安全扫描规则,具体如下:
php: 57 java: 8 *: 3 jsp: 2 conf: 2
certificate: 1 source: 1 lua: 1 log: 1 thumb: 1
Cobra-W
Github: https://github.com/LoRexxar/Cobra-W
Language: Python3
Last commit on 2020.01.17
Cobra-W 是基于 Cobra 2.0 进一步优化来提高发现漏洞的准确率以及精度的白盒审计工具。两者的工作原理基本相同,其不同之处主要体现在:
深度重写AST,大幅度减少漏洞误报率。
提供更易于从代码层面定制审计思路的规则书写方式,更易于白帽子使用,易于拓展。
底层 api 重写,支持 windows、linux 等多平台。
多层语义解析、函数回溯,secret机制,新增多种机制应用于语义分析。
新增 javascript 语义分析,用于扫描包含js相关代码。
Cobra-W 不仅仅对检测规则的格式进行重写,还精简优化了已有的检测规则。Cobra-W 官方提供了涵盖 12 种不同漏洞,共 17 条检测规则。
Reflected XSS: 2
SSRF: 3
SQLI: 3
RFI: 1
Xml injection: 1
RCE: 2
LDAPI: 1
Information Disclosure: 1
URL Redirector Abuse: 1
variable shadowing: 1
unserialize vulerablity: 1
phpcs-security-audit
Github: https://github.com/FloeDesignTechnologies/phpcs-security-audit
Language: PHP
Last commit on 2019.08.06
phpcs-security-audit是另一款白盒审计框架,它是基于PHP_CodeSniffer(https://github.com/squizlabs/PHP_CodeSniffer) 开发的。PHP_CodeSniffer 是一个代码风格检测工具,主要包含两类脚本:1)根据预定义的一系列代码规范来检测不符合规范的代码,并发出警告或报错的 phpcs 脚本;2)自动修正代码格式上不符合规范的部分 phpcbf 脚本。准确来讲phpcs-security-audit 并不能称之为一个完整的白盒审计框架,它只是提供了一些能够检测代码中潜在安全漏洞的代码规范的规则集。
phpcs_security-audit 检测漏洞的核心在于 phpcs 脚本。它预先定义好能够检测潜在安全漏洞的代码规范,然后借助 phpcs 检测源码中是否有不符合该规范的代码,以此来判断潜在的漏洞点。其中,phpcs 通过通过Token化 PHP、JavaScript 和 CSS 文件来检测该代码是否违反代码规范。
phpcs_security-audit 的检测规则主要分为两类:1)通用型检测规则,主要包含 BadFunctions 目录中的 16 种和 Misc 目录中的 2 种,总计 18 种不同漏洞的检测规则;2)针对不同框架的检测规则,其提供了 Drupal7、Drupal8 和 Symfony2 三种框架的检测规则。
progpilot
Github: https://github.com/designsecurity/progpilot
Language: PHP
Last commit on 2019.06.02
progpilot 是一款使用 PHP 开发的针对 PHP 的白盒审计框架,基于 PHP-CFG(https://github.com/ircmaxell/php-cfg/)来实现控制流图 (CFG) 的生成,同时又基于 PHP-Parser(https://github.com/nikic/php-parser) 来实现抽象语法书 ( AST 树) 的生成。
progpilot 在 CFG 和 AST 的基础上做进一步的漏洞分析。progpilot 借助生成的 CFG 图检查指定函数之间执行顺序是否符合预定义的规则。progpilot 还会检查指定函数的参数是否满足规则。progpilot 支持以下四种方式来检测漏洞:
sources:在分析过程中,将 sources.json 中指定的函数参数作为污点进行分析;
sinks:在 sinks.json 中指明危险函数及其可能导致的漏洞类型
sanitizers:在sanitizers.json中指明防御特定漏洞安全函数及其用法。此处,安全函数会修改参数的值,比如转义;
validators:在validators.json中指明防御特定漏洞的安全函数及其用法。此处,安全函数不会修改污点的值。
progpilot 的检测规则位于 package/src/uptodate_data。其提供了 PHP 和 JavaScript 的通用检测规则。对于 PHP 而言,progpilot 还提供CodeIgniter,PrestaShop,SuiteCRM,SymFony,WordPress 这五个框架的定制化检测规则。
pixy
Github: https://github.com/oliverklee/pixy
Language: Java
Last commit on 2018.01.24
pixy 是一款使用 Java 开发的针对 PHP 的白盒审计框架。本文中介绍的 prixy 是 Oliver Klee 开发的,其原作者为 Jenad Jovanonic。当时为了开发 pixy,Oliver Klee 还专门开源了另外一个项目PhpParser (https://github.com/oliverklee/phpparser)来在 Java 中实现对 PHP 程序的解析。
pixy 借助 PhpParser 实现对源代码的解析,然后基于解析结果生成相应的 AST 树和 CFG,接着在此基础上做污点分析,检查敏感函数的参数是否可控。
pixy 的检测规则主要为 ./config/model_*.ini 文件。每个 ini 文件中可以设置 5 种类型的函数/参数,如安全函数、依赖函数和敏感函数等。
RIPS
Github: https://github.com/ripsscanner/rips
Language: PHP
Last commit on 2016.05.22
作为一个很早就开始使用语法分析来进行漏洞挖掘的白盒审计工具 — RIPS,相信大家对他都不陌生。即使它现在已商业化运作,最新的版本只有SourceForge (https://sourceforge.net/projects/rips-scanner)上 2017 年更新的 v0.55,但是这并不妨碍我们对其代码理念的学习,梅子酒师傅的三篇 RIPS 分析文章十分值得一读。商业化的 RIPS 提供免费试用,感兴趣的朋友可以前去体验一下。
RIPS 使用 PHP Zend 引擎语法分析器获取源码 Token 流信息,然后基于这个 Token 流信息生成相应的 AST 树和 CFG。然后,RIPS 在此基础上定位敏感函数,然后对敏感函数的参数进行回溯,检查其是否为用户可控输入,以此来判断是否有漏洞。RIPS 在变量回溯过程中会检查该变量是否进行安全函数的处理来减少误报。
RIPS 没有单独的检测规则文件,其检测规则主要集成在配置文件中,位于 config 目录下。
info.php:定义一些额外需要关注的函数;
securing.php :定义安全处理函数;
sink.php:定义敏感函数和相应的安全函数;
sources.php :定义用户可能可控的输出点函数/变量;
token.php:定义分析过程中需要重点关注与敏感函数相关的 Token 信息流。
梅子酒师傅的三篇 RIPS 分析文章:
- https://xz.aliyun.com/t/2502
- https://xz.aliyun.com/t/2605
- https://xz.aliyun.com/t/3991
总结
十几款白盒审计工具看下来给我的感觉是自动化代码审计仍然是一个任重而道远的活计。正如开头的所说的,目前主流的 PHP 白盒审计工具都是基于同一条经验。这个经验可以简单拆分成三个子问题:
- 定位敏感函数;
- 参数部分/全部来自外部输入;
- 外部输入在传递过程中是否经过安全函数处理。
针对第一个问题,现如今的方案基本上可以解决了。针对第二个问题,通过静态分析的方式可以基本解决大部分的情况,但仍然存在较大的改进空间,比如针对源码更加全面深入的解析、借助数据库等的二次输入等等;第三个问题现如今依然是一个重灾区,基本上还停留在传递链上是否存在安全函数的判断,而未考虑多次编码导致的绕过问题,安全函数可以被绕过等问题。再者,近几年来我们设计白盒审计工具的原理基本上都是一致,是否存在现如今技术条件下其他更好的设计方案?这点还是有待商榷的。有趣的是,同样是漏洞挖掘,二进制方面的不管是工业界还是学术界都有相当一部分人在研究,但是回归 WEB 这边,主力就都是工业界的人(手动狗头)。
来源:freebuf.com 2021-04-30 18:46:45 by: 北京星阑科技有限公司
请登录后发表评论
注册