香港中文大学 | TChecker:用于检测PHP应用程序中的污点式漏洞的精确静态跨过程分析
2023-7-3 22:55:10 Author: 安全学术圈(查看原文) 阅读量:15 收藏

原文标题: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]安全学术圈
编辑:黄诚@安全学术圈

1. 研究介绍

PHP为用户提供了各种Web交互的接口,因此容易受到污点类型漏洞的影响。由于其高效性,安全人员常常使用静态污点分析在应用部署前检测污点类型漏洞。但由于PHP本身复杂的语言特性,实现精确的静态污点分析较为困难。此外,现有的解决方法由于缺乏全面的过程间数据流分析,以及各种实现上的问题,导致漏洞检测的误报和漏报较高。

本文提出了TChecker工具,利用上下文敏感的过程内静态污点分析来检测PHP程序中的污点类型漏洞。该方法首先对PHP对象以及相关的面向对象语言特性进行建模,并对PHP进行过程内数据流分析以识别出对象的类型,以此来精确地获取调用点中的目标函数。本文还对PHP中的动态包含特性进行建模,最后进行静态污点分析。

作者实现了TChecker的原型,并检测出了18个未被发现的PHP程序漏洞。与其他静态分析工具相比,TChecker在漏洞检测上有更好的精确度。

2. 背景知识

污点类型漏洞

污点类型漏洞包括常见的XSS、SQL注入等漏洞,它是由于外部控制的用户输入数据在未经过滤便直接到达应用程序的关键函数造成。攻击者可以利用此类漏洞来构造攻击载荷以改变应用程序的预期行为。

污点分析

污点分析是一种跟踪并分析污点信息如何在程序中流动的技术。在漏洞分析中,常常将特定的外部输入标记为污点数据,然后通过跟踪和污点数据相关的信息的流向,可以知道它们是否会影响某些关键的程序操作,进而挖掘程序漏洞。污点分析可以抽象为三元组形式<sources, sinks, sanitizers>:

  • sources:即污点源,代表直接引入不受信任的数据或者机密数据到系统中。
  • sink:即污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性)。
  • sanitizer:即过滤,无害处理,代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害。

PHP语言特性

  • PHP是OOP语言,即支持实例对象进行函数调用,也支持静态函数调用。
  • 可变函数:PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
  • 动态包含:如,根据变量的值,包含其所指定路径的文件。
  • 对象属性:如,即实例对象的字段,其中接收对象类型(receiver type)大多数是在运行时确定的。

3.现有方法的局限性以及本文贡献

局限性

  1. 现有方法的误报和漏报较多,具有污点类型漏洞的现代PHP程序大多都是依赖上下文的,这样特征表现为某些特定的函数或方法只有在特定上下文被调用时才显现出来,现有方法并未实现上下文敏感机制,导致精确度不高。
  2. 现有方法假设PHP程序中的调用点永远调用同一个目标方法(这会导致不同上下文的目标方法被简单的视为同一个,导致错误数据流的出现),但是由于上下文的存在,目标方法在不同上下文是不同的,这会导致漏洞检测中的误报和漏报。
  3. 现有方法并未很好地考虑到PHP的独特性质,例如PHP中的动态调用常量、可变变量等。

本文贡献

  1. TChecker,一种精确的上下文敏感过程间静态污点分析框架,支持PHP程序的面向对象特性,TChecker克服了现有方法的局限性,它对PHP对象进行过程间数据流分析来推断对象的类型或值,可以精确识别出调用点的目标方法以构建准确的调用图。此外,TChecker会分析根据上下文语境准确地确定目标方法,并将污点传播至正确的函数。
  2. TChecker显著优于现有的工具,并检测出了18个以前未知的漏洞。
  3. 将TChecker原型工具开源,以检测污点类型漏洞。

4.整体设计

构建调用图

对PHP程序进行过程间污点分析的主要挑战就是如何分析调用关系。TChecker首先构建调用图,可以在跨函数调用的污点传播中获取更加精确的结果。

调用图的作用在于:

  1. 调用图以上下文敏感的方式包含了一个调用点所有可能的目标函数。
  2. 对于一个给定的上下文,TChecker可以直接选取一个正确的目标函数。

利用调用图,TChecker进行选择性的污点分析,即该工具可以跳过那些根本没有污点变量的调用点,从而提高效率。

调用图构建分为两个阶段:

  1. 对接收对象和可变函数使用后向数据流分析来寻找每个调用点的函数名。
  2. 连接调用点与它的目标函数。
  3. 迭代地执行这两个步骤,通过将新的调用目标函数(在新上下文中)添加到调用图中,可以发现新的数据流关系,从而允许TChecker基于新的数据流关系确定更多函数名变量或更多接收器对象类别的值,并进一步找到相应的新调用目标。
推断调用点的函数名

这部分需要对普通的方法调用和PHP的可变函数调用进行处理,TChecker需要推断出方法调用的接收对象类型,以及可变函数调用的变量值。

对于普通的方法调用,执行流程如下:

由于方法调用(method call)是通过接收对象(receiver object)来调用的,这些对象可能属于多个类,而这些类可能都定义了同名的函数,需要推断出正确的接收器类型(receiver)。若接收器由局部变量赋值,则进行后向数据流分析,如果是由一个语句实例化得到的,即,则直接返回作为其类型;否则后向分析直到找到的类型或是发现是由外部变量(作者定义在其他函数作用域中定义或赋值的变量)赋值为止。对于外部变量的类型推断,Tchecker使用以下4种方式进行交叉过程间数据流分析:

  1. 如果是一个具有类型声明的函数形参,则返回声明的类型;若无类型声明,则会搜索当前函数的可能调用点,然后后向分析每个调用点中对应的参数,以找到参数可能具有的类型。
  2. 是函数调用的返回值(如),Tchecker会进入目标函数并分析数据流,并获取其类型。
  3. 如果是对象属性(如,即实例对象的字段),TChecker会推断其父对象的类型来进一步确定属性的类型。
  4. 如果是当前函数中使用的全局变量,则会后向追踪中的数据流,以及的调用者函数。

PHP中的可变函数,Tchecker会尝试推断可变函数(如)中的变量值,来识别函数名称,由于涉及到许多复杂的PHP语言特性,相较于推断接收对象类型而言会困难得多。

接下来是连接调用目标,将调用点与其相应的调用目标(即目标函数)进行相连,这部分由两个阶段组成:

  1. 首先需要确定被调用函数的名称,由于PHP类继承的OOP特性,被调用的函数名可能与目标函数的定义不完全相等。TChcker为了解析extends关键字而构建了一个继承树,然后从被调用的函数名中提取出类名,若类名是静态关键字(如)或,TChecker会将其替换为相应的类型。
  2. 之后需要确定正确的调用目标。TChecker进行函数原型检查来剔除错误的候选调用目标。检查情况包括:静态函数调用非静态函数、调用点的参数数量少于候选项中所需参数数量等情况。

最后,TChecker还模拟了动态文件包含,它对文件包含语句进行分析,将这些语句视作调用点,并将相应的被包含文件处理为调用图中的用户定义函数。

污点分析

第二大模块为污点分析,TChecker将外部输入视作sources,并将数据库操作、内容生成操作和循环终止条件中的变量视作sinks。TChecker支持对XSS、SQLi和DoS漏洞的检测。

第一个阶段为过程内污点传播,TChecker将污点信息从类似赋值语句(assignment-like)的右操作数传播至左操作数,以语句为例:右操作数为的返回值,的返回值;左操作数为的形参,的形参和

TChecker会对赋值操作数的污点状态进行分析,如果一个操作数已经过滤,TChecker会清除其污点标记;否则,如果满足以下情况,则认为该操作数被污染:

  1. 该操作数是污点源;
  2. 该操作数与某一被污染变量完全相等;
  3. 该操作数可能是一个被污染的数组元素;
  4. 该操作数是一个被污染的返回值。然后,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个方面产生:

  1. TChecker对Sanitizers的建模不够充分, 比如未对函数调用中参数语义进行分析,这导致了部分误报
  2. 部分误报来自开发者提供的预期功能,例如某些应用实现了一个调试功能,可以执行由管理员提供的任意SQL查询语句。
  3. TChecker对数组的过近似处理导致了误报。例如,当一个数组元素被污染时,整个数组都会被标记为污染。
  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

文章来源: http://mp.weixin.qq.com/s?__biz=MzU5MTM5MTQ2MA==&mid=2247489199&idx=1&sn=495ff7aab614ef1759d0629ee9fd7c02&chksm=fe2ee924c9596032e4de4c27477dd6dc4f84edbe5f9b7066bb8657fc4c5f2834686a1932b231#rd
如有侵权请联系:admin#unsafe.sh