原文标题:TChecker: Precise Static Inter-Procedural Analysis for Detecting Taint-Style Vulnerabilities in PHP Applications
原文作者:Chenghua Luo, Penghui Li, Wei Meng
原文链接:https://www.cse.cuhk.edu.hk/~wei/papers/ccs22_tchecker.pdf
笔记作者:[email protected]安全学术圈
编辑:黄诚@安全学术圈
PHP为用户提供了各种Web交互的接口,因此容易受到污点类型漏洞的影响。由于其高效性,安全人员常常使用静态污点分析在应用部署前检测污点类型漏洞。但由于PHP本身复杂的语言特性,实现精确的静态污点分析较为困难。此外,现有的解决方法由于缺乏全面的过程间数据流分析,以及各种实现上的问题,导致漏洞检测的误报和漏报较高。
本文提出了TChecker工具,利用上下文敏感的过程内静态污点分析来检测PHP程序中的污点类型漏洞。该方法首先对PHP对象以及相关的面向对象语言特性进行建模,并对PHP进行过程内数据流分析以识别出对象的类型,以此来精确地获取调用点中的目标函数。本文还对PHP中的动态包含特性进行建模,最后进行静态污点分析。
作者实现了TChecker的原型,并检测出了18个未被发现的PHP程序漏洞。与其他静态分析工具相比,TChecker在漏洞检测上有更好的精确度。
污点类型漏洞包括常见的XSS、SQL注入等漏洞,它是由于外部控制的用户输入数据在未经过滤便直接到达应用程序的关键函数造成。攻击者可以利用此类漏洞来构造攻击载荷以改变应用程序的预期行为。
污点分析是一种跟踪并分析污点信息如何在程序中流动的技术。在漏洞分析中,常常将特定的外部输入标记为污点数据,然后通过跟踪和污点数据相关的信息的流向,可以知道它们是否会影响某些关键的程序操作,进而挖掘程序漏洞。污点分析可以抽象为三元组形式<sources, sinks, sanitizers>:
对PHP程序进行过程间污点分析的主要挑战就是如何分析调用关系。TChecker首先构建调用图,可以在跨函数调用的污点传播中获取更加精确的结果。
调用图的作用在于:
利用调用图,TChecker进行选择性的污点分析,即该工具可以跳过那些根本没有污点变量的调用点,从而提高效率。
调用图构建分为两个阶段:
这部分需要对普通的方法调用和PHP的可变函数调用进行处理,TChecker需要推断出方法调用的接收对象类型,以及可变函数调用的变量值。
对于普通的方法调用,执行流程如下:
由于方法调用(method call)是通过接收对象(receiver object)来调用的,这些对象可能属于多个类,而这些类可能都定义了同名的函数,需要推断出正确的接收器类型(receiver)。若接收器由局部变量赋值,则进行后向数据流分析,如果是由一个语句实例化得到的,即,则直接返回作为其类型;否则后向分析直到找到的类型或是发现是由外部变量(作者定义在其他函数作用域中定义或赋值的变量)赋值为止。对于外部变量的类型推断,Tchecker使用以下4种方式进行交叉过程间数据流分析:
对PHP中的可变函数,Tchecker会尝试推断可变函数(如)中的变量值,来识别函数名称,由于涉及到许多复杂的PHP语言特性,相较于推断接收对象类型而言会困难得多。
接下来是连接调用目标,将调用点与其相应的调用目标(即目标函数)进行相连,这部分由两个阶段组成:
最后,TChecker还模拟了动态文件包含,它对文件包含语句进行分析,将这些语句视作调用点,并将相应的被包含文件处理为调用图中的用户定义函数。
第二大模块为污点分析,TChecker将外部输入视作sources,并将数据库操作、内容生成操作和循环终止条件中的变量视作sinks。TChecker支持对XSS、SQLi和DoS漏洞的检测。
第一个阶段为过程内污点传播,TChecker将污点信息从类似赋值语句(assignment-like)的右操作数传播至左操作数,以语句为例:右操作数为,的返回值,的返回值;左操作数为的形参,的形参和。
TChecker会对赋值操作数的污点状态进行分析,如果一个操作数已经过滤,TChecker会清除其污点标记;否则,如果满足以下情况,则认为该操作数被污染:
第二阶段为过程间污点传播。TChecker对调用语句进行分析并在函数之间传播污点。TChecker引入了上下文敏感机制,对于一个调用点,它在调用图中可能有多个目标函数,使用上下文机制可以选取出特定上下文的目标函数。TChecker采取一种启发式方法来缩小潜在的目标函数范围,优先考虑那些已经被同一文件中其他函数调用过的函数作为目标函数,这样可以在调用图中获得一组目标函数子集。
接着对目标函数进行预处理,TChecker基于选择性污点分析的思想,如果某个函数没有使用任何被污染的变量,那么就可以跳过对这类被调用函数的污点分析。最后进行目标函数的分析,TChecker进入某个调用语句的目标函数中(跳过对递归函数的分析),模拟上下文切换,并将被污染的局部变量初始化为任何被污染的函数形参,然后在目标函数中执行标准的过程内污点分析。
TChecker对比了PHPJoern和RIPS两个工具,并在17个PHP应用程序上进行了检出效果的验证。TChecker总共检出了284个漏洞(包括误报),同时,TChecker还可检出18个新的漏洞(包括CVE-2022-35212,CVE-2022-35213)。
与RIPS相比,TChecker的检出准确度更高(46.1%),而RIPS只有大约6%。而PHPJoern采取了与TChecker相同的选择性污点分析策略,其误报率在3个工具中最低,且取得了最好的准确度(47.9%),但是PHPJoern报告的真阳性要少得多,比TChcker少了60个TP。
针对TChecker出现的153个误报漏洞,作者认为主要由4个方面产生:
而针对TChecker中出现的漏报,作者认为是在对sanitization代码进行建模时不够充分,会将未完全清理的变量中的污点数据清除掉,从而导致了漏报的产生。
本文提出了一种新颖的PHP污点类型漏洞检测工具TChecker,可用于检测XSS、SQL注入以及DoS漏洞。相较于之前的相关工作,TChecker在分析调用关系时引入了上下文敏感机制,以构建出一个精确的调用图,并在调用图的基础上进行选择性的污点分析,可以在更少的FP和FN的情况下实现漏洞的检测。本文引入上下文提升调用关系分析精度时,采取的方法是优先选取本文件内被调用过的函数,个人感觉这样做Completeness不太够,可以进一步地引入静态分析中的上下文敏感理论进行优化。
孟玮(Wei Meng),创立并领导了港中文计算机安全实验室。他于2017年在佐治亚理工学院获得了计算机科学博士学位;于2012年在清华大学获得了计算机科学学士学位。他通常对所有与计算机安全和隐私相关的问题感兴趣,包括与计算机科学和其他学科的其他领域交叉的问题。最近,他一直专注于保护互联网上的应用/服务和终端用户。
香港中文大学计算机安全实验室:致力于解决计算机系统和应用程序中各种安全和隐私挑战的人。解决相关领域的问题,例如编程语言、软件工程、操作系统、计算机网络等。https://seclab.cse.cuhk.edu.hk/
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com