Web安全研究(二)

news2024/11/24 19:49:21

TChecker: Precise Static Inter-Procedural Analysis for Detecting Taint-Style Vulnerabilities in PHP Applications

香港中文大学,CCS2022

Abstract

由于php语言的高度复杂性,现有的污点分析解决方案由于其不全面的程序间分析和各种实现问题,存在着高假阳性和高假阴性的问题,即实现精确的静态污点分析是很困难的。

作者在这项工作中提出TChecker,一个上下文敏感的程序间静态污点分析工具,用于检测php应用程序中的污点式漏洞,它对php的类迭代进行程序间数据流分析,以细化类的类型,从而可以精确的识别调用目标,并且实现了php的一些动态特性,包括动态包涵。

发现了18个0day,明显优于其他的一些最新工具。

Introduction

php是当下最流行的服务端语言,约有78%的网站使用它,php会对用户的互动和请求作出反应,例如用户的点击,这种交互模式为各种攻击提供了巨大的空间,尤其是污点式漏洞,当用户的输入数据没有被完全过滤时,就会出现这一类漏洞。

现在已经提出多种方法来检测在野的污点式漏洞,一般可以分为动态方法和静态方法,动态方法注入攻击有效载荷,并在部署的网络应用程序中检查相应的输出,然而动态方法的代码覆盖较为有限,并且受高假阴性的影响,且具备较低的扩展性,另一方面,污点分析则是完全自动化和可扩展的,可以实现较高的代码覆盖率,因此静态分析已经被广泛采用,并在检测污点式漏洞方面展现出巨大前景。

作者在现有解决方案中发现了3个固有的限制:

  • 之前的污点分析并不是对环境敏感的,现代php应用程序中很多污点式漏洞都存在上下文相关性,只有在特定环境下调用相应的函数或方法才会表现出来。具体来说,找到目标方法的调用函数需要确定接收对象的类,例如($obj in $obj -> f());这是非常有挑战的,因为php是动态类型的语言,接收对象的定义并没有具体的类型注解,作为结果,php对象的类型在运行前很难决定。常用的寻找目标函数的方法是将被调用的函数/方法名与函数定义相匹配,这种方法要么会导致过度污染,要么会导致污染不足;
  • 其次,因为静态分析php代码的困难,现存的工具在简化污点分析时,设定了一些假设,但这些假设可能并不总是成立,如商业工具RIPS-A假设php应用的调用栈总是调用同一个目标函数,然而php应用可以在不同的调用上下文中调用不同的函数。其他的开源污点分析工具也作出了一些强有力的假设,比如如果任何一个参数是污点,那么调用栈的返回值就是污点,这种简化会导致不精确的污点分析,从而引入假阳性和假阴性
  • 最后,现有的工具不支持PHP常用的高级特性,比如动态常量,constant( c o n ) 等 , 可 变 变 量 con)等,可变变量 con)$a等,对这些特征建模失败会导致数据流分析等提前终止,从而造成错误的否定。

作者为了解决相应局限性,开发一个精确的静态程序间污点分析。

TChecker用几种新技术克服了上述挑战。具体来说,它对PHP对象反复进行程序间数据流分析,以推断其类型或值。这有助于它精确地确定方法调用的调用目标,以逐步建立一个精确的调用图,这对程序间数据流分析进一步有利。

此外,由于一个调用点可能在不同的上下文中调用不同的被调用函数,TChecker以一种对上下文敏感的方式分析调用点。它不总是把所有可能的目标函数看作是一个调用站点的目标函数,而是根据调用上下文确定目标函数,并把污点传播给正确的目标函数。

对复杂和常见的PHP特性进行建模,并解决了PHP应用程序污点分析中的几个实施难题。具体来说,TChecker跟踪对象属性中的污点,分析一些常用的动态特征,如动态包含,并对PHP内置函数的语义进行编码等等。这将使TChecker能够全面地跟踪复杂的PHP应用程序中的污点传播。

7.3万行的Java代码实现了TChecker的原型。并在17个有代表性的PHP应用程序的数据集上彻底评估了TChecker。TChecker在数据集中检测到131个真正的阳性污点式漏洞,包括18个以前未知的漏洞。

与最先进的工具的比较进一步表明,TChecker明显优于它们,多检测了50个漏洞。TChecker还可以找到现有工具检测到的所有漏洞,而且精度比较高。我们对这18个新的漏洞进行了定性,发现它们有可能被利用,造成严重的安全后果。例如,osCommerce2(v2.3.4.1)的一个新的XSS漏洞可能允许无权限的攻击者破坏受害者的用户账户。

https://github.com/cuhk-seclab/TChecker

Background

php特性

  • 方法调用;$o->f()
  • 变量函数;$f = “eval”; $f()
  • 动态包含;require $a
  • 对象属性;$obj->prop

php程序分析

  • 调用关系分析,分析调用关系是程序间分析的先决条件;
  • 数据流分析;

污点式漏洞

定义:网络应用程序通常为终端用户提供许多功能,并相应地对用户的输入和互动采取行动,例如,表单提交或点击。当用户提供的数据(即污点)没有得到充分的净化,并被用于应用程序的关键操作(即sink)时,就会出现安全漏洞。这样的漏洞被称为污点式漏洞[26]。常见的污点式漏洞有XSS,SQL注入等。

污点分析

污点分析跟踪来自外部的污点(例如不受信任的用户提供的数据)在程序执行过程中的传播,检查污点数据是否以流向程序的关键位置,即sink,最后报告有可能被攻击者操纵的sink。

sink:污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性

现有静态污点分析的解决方案有以下的关键思想:

  • 函数名匹配:分析调用关系对于跟踪函数便捷传播的污点是必要的,为了解决确定方法调用目标的挑战,一种常见的方法是忽略调用的对象,只匹配被调用的方法名称,RIPS将被调用的方法名f()与整个php程序中的函数定义进行比较,将匹配的函数视为调用对象obj->f()的目标函数,这种方法存在较多的误报;
  • 数据流分析:RIPS的专有版本可以对php程序进行数据流分析,RIPS可以通过程序内的数据流分析推断一个对象的类型,然后确定方法调用的目标函数,并且还对一些函数名变量进行同样的分析,例如$a(),但由于缺乏程序间分析,RIPS无法推断出在其他函数作用域中分配的变量的类型或值;
  • 函数摘要:为了避免重复分析,创建函数摘要总结一个函数中的数据流,因为一个函数可能包含调用栈点,之前的工作假设每个调用栈点在任何调用上下文中都调用相同的函数。使用函数摘要可以大大提高分析的效率,因为每个函数只分析一次,无需重复分析多次,为性能牺牲了分析的精确性。

Motivating Example

在这里插入图片描述

IMG标签中的src属性被定义为base_url函数的一个返回值,用户控制输入的_POST被用作该函数调用的参数,在没有消毒的情况下被输出,攻击者可以通过制作有效载荷进行xss攻击。

污点分析为了检测这样的漏洞,应该分析第2,5,13和17行,最后返回第2行的返回值。

为了确定第5行的get_instance()这个调用栈的目标函数,需要推断出接收对象get_instance()->config()的类型,为此需要进行数据流分析,找到它可以被实例化的类,然后推断出所有调用第3行base_url()的函数,因为该对象可以在不同的调用上下文中被实例化,然而只有完成所有的调用关系分析后才能确定base_url的调用者,但情况并非如此,因为当前还在寻找第5行调用栈的目标函数。

Overview

在这里插入图片描述

  1. 进行程序间污点分析是重要的,主要挑战则是调用关系的分析,为此,首先建立一个调用图
    1. 这有助于它以后在函数调用中进行更准确的污点传播。在传播污点之前建立调用图的好处是双重的。首先,调用图的建立已经包含了一个调用站点的所有可能的目标函数,而且是以一种与环境相关的方式。因此,给定一个特定的调用环境,TChecker可以直接从可能的目标函数中选择一个调用站点的正确目标函数。这种选择是一个从调用上下文到目标函数的映射过程,它使TChecker能够有效地获得目标函数。如果不事先构建调用图,TChecker就必须在污点分析中每次遇到(甚至在同一上下文中)调用点时重复推断其调用目标。
    2. 其次,调用图允许TChecker进行有选择的污点分析。例如,如果一个调用点的所有目标函数都不使用任何污点变量,TChecker可以跳过对该调用点的污点分析。这可以避免对不相关的函数进行不必要的分析,从而提高整体分析效率。
  2. 然后执行对上下文敏感的程序间污点分析来识别漏洞。

具体来说,TChecker采取两个阶段来增量构建一个调用图。在第一阶段,TChecker对接收对象和变量函数名进行反向数据流分析,以找到每个调用点的函数名(§4.2.1)。在第二阶段,它将一个调用站点连接到它的调用目标。更重要的是,TChecker迭代地执行这两个步骤。通过向调用图添加新的调用目标函数(在新的上下文中),可以发现新的数据流关系,使TChecker能够根据新的数据流关系确定更多函数名称变量的值或更多接收对象的类,然后进一步找到相应的新调用目标。

第3行的base_url()函数被应用程序中的多个调用站点调用。当TChecker从第2行的调用站点连接一个新的调用边到第3行的函数定义时,它检查新引入的调用函数(即通过新连接的调用边到达base_url()函数节点的所有函数节点)是否包含对get_instance()->config的赋值。如果在函数p()中存在这样的赋值,TChecker会从函数p()开始对get_instance()->config进行逆向数据流分析,以推断其类型。然后,TChecker在第4行更新调用站点get_instance()->config->base_url()的目标函数。

Implementation

作者用php-ast将PHP源代码解析为AST,并使用PHPJoern构建控制流图(CFG)和数据依赖图(DDG),用于程序内数据流分析。原始的DDG不能区分不同的对象属性(例如 o b j − > p 1 和 obj->p1和 obj>p1obj->p2)。为了解决这个问题,TChecker额外使用属性名称(如p1和p2)来识别对象属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DIV简单个人静态HTML网页设计作品 WEB静态个人介绍网页模板代码 DW个人网站制作成品 期末网页制作与实现

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

jmeter压测线程5000后内存溢出问题解决

一.报错内容: ava.lang.OutOfMemoryError: Java heap space:意思就是堆内存溢出,不够用了 版本:jmeter5 内存溢出:应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩…

【图像融合】高斯金字塔+拉普拉斯金字塔彩色水下图像融合【含Matlab源码 1629期】

⛄一、区域分割图像融合简介 图像的分解 对源图像进行融合时,首先对图像进行分解,利用拉普拉斯金字塔分解,先对图像进行高斯金字塔分解,然后再进行拉普拉斯金字塔分解。 1 高斯金字塔分解 记源图像为G0,G0即为高斯金字塔最底层,将其进行高斯低通滤波,之后对其进行隔行隔列的下…

mysqldump实战-问题1

使用mysqldump导出数据时,遇到了一个权限问题(之前没报过这个提示) mysqldump: Error: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation when trying to dump tablespaces 查看当前用户的权限: 解决方法&…

ARM 指令流水线

CPU要执行某一个指令,第一步,PC给内存发送地址,IR接收内存返回的指令;第二步,指令译码器解析IR中的指令;第三步,寄存器执行译码结果对应的运算单元。 实际上,译码器在译码的时候&am…

flutter 基于百度地图的地图选址,包括移动选址,地区搜索 ,仿微信地图选址

flutter 最近有在地图上选择地址的需求,要求如下 1.移动地图获取根据地图中心点获取周边的poi信息 2.搜索,根据搜索内容提示相关地点信息,点击移动到相关位置,显示出该位置周边的poi信息 废话少说,先上视频 flutter…

菜鸟Linux(2):进程优先级与进程状态

"才一年,看着世界变迁,有种沧海桑田" 一、进程调度 与 进程优先级 (1)何为优先级 双击.exe(可执行程序)文件 会发生什么? 但是,当我们使用电脑的时候,不仅仅只会 启动一个程序! 系统中一定会有多个 进程同时存在! 然而,需求是无…

什么是云手机?云手机的原理是什么?

什么是云手机? 云手机(Cloud Phone)是在云上运行APP的仿真手机。云手机服务根据不同场景提供多种规格的云手机,稳定24小时不间断,全面兼容Android原生APP,流畅运行大型手游,是移动办公好助手。云手机服务为您提供高性能、安全、…

微服务Spring Boot 整合 Redis 实现好友关注 – Feed流实现推送到粉丝收件箱

文章目录⛄引言一、Redis 实现好友关注 -- Feed流实现推送到粉丝收件箱⛅Feed 流实现方案⚡推送到粉丝收件箱三、Redis 实现好友关注 -- 实现分页滚动查询 实时获取信息⛵小结⛄引言 本博文参考 黑马 程序员B站 Redis课程系列 在点评项目中,有这样的需求&#xff…

【正点原子I.MX6U-MINI】删除开机内核Logo和进度条界面Logo

一、编译内核 内核源码1、例程源码-》3、正点原子 Uboot 和 Linux 出厂源码-》linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2。 在 Ubuntu 中新建名为“alientek_linux”的文件夹,然后将 linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2 这个压缩包拷贝到前面新建的 aliente…

Revit中用楼板编辑创建坡道的两种方法

在绘制坡道的时候,有一种两侧带坡度的坡道,一般我们采用楼板编辑的方式来创建。 方法有两种: 第一种是听过添加子图元的点来创建,方法如下, 首先绘制设计所需的楼板尺寸,完成之后点击楼板,形状编…

【Flutter 组件】004-基础组件:图片及 ICON

【Flutter 组件】004-基础组件:图片及 ICON 文章目录【Flutter 组件】004-基础组件:图片及 ICON一、图片1、Image概述Image 的几个构造方法常用属性ImageProvider2、从 asset 中加载图片第一步:准备图片第二步:使用图片第三步&…

9.高性能计算 期末复习

文章目录1.提纲2.第二章 并行硬件&程序设计2.1 SIMD&MIMD2.2 可扩展性2.7 串行程序并行化(poster四步:划分、通信、聚合、分配)3.mpi2.1 点对点gemm2.2集合通信gemmsend/recv实现reducesend/recv 实现ring AllReduce2.3 加速比2.4 奇…

数据预处理的方法有哪些?

数据处理的工作时间占据了整个数据分析项目的70%以上。因此,数据的质量直接决定了分析模型的准确性。那么,数据预处理的方法有哪些呢?比如数据清洗、数据集成、数据规约、数据变换等,其中最常用到的是数据清洗与数据集成&#xff…

医学影像篇

影像组学研究的基本流程知识点 01 准备工作 研究前我们先要做好准备工作:(这个准备工作呢就好像小白做菜) 最开始,我们往往主动提出或者被提出了一个临床问题(临床问题可能是老板直接安排的,也可能是在临…

【网管日记】Nginx基本介绍、安装与使用

Nginx基本使用 基本介绍 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是 占用内存少,并发能力强 ,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用ngin…

AntV-G6:图表自动居中显示/画布自适应/fitView

需求描述 图表节点较多时,可能分布到屏幕可视范围之外,期望图表自动居中显示 调研分析 阅读官网文档:G6.Graph配置项,一下就看到了这个配置项: 看起来只要在初始化图表的配置里加上“fitView: true”就能万事大吉了…

解决PyCharm中opencv不自动补全的问题

解决PyCharm中opencv不自动补全的问题前言解决办法前言 今天下载opencv后,发现用pycharm打开并没有出现代码补全的情况,对于我这种新手极其不友好,故我去网上寻找方法。 opencv版本:4.6.0 寻找半天 有的说,要移动cv…

数据结构——二叉树的顺序存储(堆)

二叉树的顺序存储 顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组&…

玩转MySQL:如何在高并发大流量情况下正确分库分表海量数据

引言 本篇数据库专栏内容,主要会讲解不同高并发场景下的MySQL架构设计方案,也包括对于各类大流量/大数据该如何优雅的处理,也包括架构调整后带来的后患又该如何解决?其中内容会涵盖库内分表、主从复制、读写分离、双主热备、垂直分…