Code Audit


前言

代码审计是白盒测试的重要部分,对它的自动化探索也从未停止,但是在现实环境复杂度下现有的工具 实用性并不用.只能实现发现简单漏洞.本文讨论现有的代码审计工具和理论.

自动化代码审计

介绍常见的自动化审计

静态分析

最简单的方法自然是不对代码进行分析 直接进行正则匹配,发现危险模式.例如

1
eval($GET['xxx'])

自然就是一种危险模式,缺点不然而喻误报率高 检测率低. 优点则是容易实现 很简单就能集成到ci上,作为一种代码规范 自动不需要考虑误报率这个问题了. (检测出来就是你代码不符合安全规范)

污点分析

污点分析在安全人员的手工审计思路上可以体现为 先搜一下危险函数, 然后看看危险函数参数可不可控,在分析可不可控中 需要看之前的代码.

以下是现有工具的基本实现逻辑 污点分析基于对代码路径的分析,首先也需要标记危险函数和输入源(在php一般可以认为是$GET, $POST, $COOKIES). 和安全函数 然后对代码进行解析 生成语法树. 这方面已经有多个库实现了. 再寻找标记的危险函数和其参数, 然后参数就是输入源 基本可以确认是漏洞了. 如果不是 需要进行回溯 确认这个参数的来源. 在这个过程如果遇到安全函数进行过滤,则可以认为这里不存在漏洞.

污点分析理论上是没有问题 只是一种审计思路 当然在代码实现上存在一些问题. 例如安全函数过滤后并不能真的确认没有问题了, 换做真人审计肯定是要确认这些函数的效果. 这个问题在mvc框架下非常明显, 框架使用的安全函数太多了.

语义分析

要解决上面的问题, 彻底解析所有php代码,但基础函数并不能分析,必须提供基础函数的数据. 理解这些代码到底起了什么作用.

最后代码审计工具只需要声明 某函数不应该可以输入什么样的参数.例如 echo函数 不应可以输入 <xxx>的参数. 这里的判断可以归结于一个 约束求解. 首先一个外部输入源是不存在约束的,可以任意输入 然后例如通过intval函数后添加了一个约束 这个参数只能是0-9. 显然这种约束后 是不可能存在<xxx>的解的.

这种方法的优势很明显 但是实现非常困难 光是语义分析就没有已实现的例子.

结尾

本文总结了常见的自动代码审计实现,但自动化归自动化. 我们安全人员在审计时需要考虑这次审计对自身技术有提升么?重复在一些低劣cms上审计 固然是容易挖漏洞刷cve 但是对自身技术没什么帮助.

参考

http://blog.fatezero.org/2018/11/11/prvd/ https://wooyun.js.org/drops/PHP%E8%87%AA%E5%8A%A8%E5%8C%96%E7%99%BD%E7%9B%92%E5%AE%A1%E8%AE%A1%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%AE%9E%E7%8E%B0.html