污点分析
所需概念
- source、sink、sanitizers定义
- ast、cfg的构建(很多文章的污点分析实现方式)
- PHP-Parse
- CFG要点
- LLVM IR -> CFG https://www.zhihu.com/question/29744909
- AST -> CFG 还是得看虎书,有很长的路要走
自动化方案
危险函数匹配
Seay, 没啥好说的代码相似性比对
一些开发者会复制其他框架的代码,或者使用各种框架。如果事先有建立对应的漏洞图谱,则可使用相似性方法来找到漏洞。控制流分析
在2012年,Dahse J等人设计了RIPS,该工具引入AST进行数据流与控制流分析,结合过程内与过程间的分析得到审计结果,相对危险函数匹配的方式来说误报率少了很多,但是同样的也增加了开销。RIPS初始的版本开放源代码,而后闭源进行商业化。基于图的分析
基于图的分析是对控制流分析的一个改进,其利用CFG的特性和图计算的算法,一定程度上简化了计算,比较有代表性的是微软的Semmle QL和NDSS 2017年发表的文章Efficient and Flexible Discovery of PHP Application Vulnerabilities。
注:Semmle就是CodeQL的开发公司,因此SemmleQL实际就是CodeQL的前身。
- 灰盒分析
基于控制流的分析开销较大,于是有人提出了基于运行时的分析方式,对代码进行Hook,当执行到危险函数时自动回溯输入,找到输入并判断是否可用。
这种方式解决了控制流分析实现复杂、计算路径开销大的问题,在判断过滤函数上也有一定的突破,但是灰盒的方式并不一定会触发所有的漏洞。fate0大佬开发的prvd就是基于这种设计思路。
注:除此之外,像php-taint、rasp等应该都是这种思路。但这里的分析应该是基于代码覆盖率的。
已有的工具和思路学习
fate0-PRVD
PRVD分为taint和payload两种模式。
taint模式就是和php-taint一样对输入做标记然后分析。但是由于一些filter的成功/不成功过滤,使得分析容易误报/漏报。因此产生payload模式:直接打payload,然后在sink点观测payload。隐形人-phpvulhunter
这个工具手工实现了php->AST->CFG的过程,虽然看大佬们的评论说有点简陋,但对于我来说很有学习的意义。
工具核心思路是:ast—>cfg,然后检测cfg中调用了敏感函数,就停下来进行污染传播分析,进行过程间分析、过程内分析,找到对应的污点数据。然后基于数据流分析过程中搜集的信息,进行净化信息和编码信息的判断,从而判断是否为漏洞。
不错的入门资料
- https://www.bookstack.cn/read/CTF-All-In-One/doc-5.5_taint_analysis.md#5.5%20%E6%B1%A1%E7%82%B9%E5%88%86%E6%9E%90
- https://xz.aliyun.com/t/4637
- https://www.zhihu.com/question/27730062
- https://blog.csdn.net/u011721501/article/details/46271551
符号执行
概念
在计算机科学中,符号执行技术指的是通过程序分析的方法,确定哪些输入向量会对应导致程序的执行结果为某个向量的方法(绕)。通俗的说,如果把一个程序比作DOTA英雄,英雄的最终属性值为程序的输出(包括攻击力、防御力、血槽、蓝槽),英雄的武器出装为程序的输入(出A杖还是BKB)。那么符号执行技术的任务就是,给定了一个英雄的最终属性值,分析出该英雄可以通过哪些出装方式达到这种最终属性值效果。
可以发现,符号执行技术是一种白盒的静态分析技术。
知识点
- klee解决了文件处理等导致的符号传递中断问题
- 符号执行分为过程内分析和过程间分析。程序的全局分析是在过程内分析的基础上进行的,如果过程内分析中包含了函数调用,就引入了过程间分析。
利用
是否可以把符号执行+Fuzz应用在web的基于运行时的动态代码审计中。