【论文阅读】FUGIO: Automatic Exploit Generation for PHP Object Injection Vulnerabilities

PHP反序列化链自动生成的研究
论文题目:FUGIO: Automatic Exploit Generation for PHP Object Injection Vulnerabilities
论文出处:USENIX 2022
论文作者:Sunnyeo Park(KAIST),Daejun Kim(KAIST) ,
在这里插入图片描述

0x01 Intraduction

0x02 Background

0x03 Motivation and Challenges

现存的工具只关注检测潜在的反序列化漏洞,需要使用POP来检测误报,构造POP链需要大量的手工操作和专业知识。
Dahse提出了一种利用静态分析识别可用POP链的方法,但为了减少误报,仍需解决可达性分析问题,即找到一个合适的输入来利用一个可能利用的POP链。当可能利用的POP链很多时,这变成非常艰巨的工作。如Contao CMS至少有26180条POP链,手工分析这些链是不可能的。
对POI漏洞自动化利用需要实现如下目标:
发现一个POI漏洞;
在触发识别的POI漏洞时,识别出可用的gadgets组成的POP链;
为识别出可利用的POP链生成输入对象。
作者考虑到当前的Burp、Acunetix、sonarsource等工具已经可以挖掘POI漏洞,核心贡献关注在生成可利用对象,关注上面的后两个目标,解决第二个和第三个目标面临的挑战如下:
识别POP链
AEG工具应该可以识别用户输入位置所有可加载类的gadgets组成的POP链。
(C1-1)PHP的动态特性使得识别可加载的类和它们的gadgets很难。自动加载机制(autoload)使得可以基于触发开发者指定的回调函数加载任意存在的类。然而,很多PHP CMS严重依赖动态生成的PHP类,然而仅仅考虑静态调用的类会导致未考虑POP链中可用的gadgets,产生漏报。
(C1-2)当评估可利用性时,单纯的连接可加载的gadgets的方法会产生很多大量的POP链。尤其是长链时,因为它会呈指数级增长。
利用生成
AEG工具应该生成一个具有多个属性值的利用对象,使其能够在不中断的情况下执行已标识的链。生成一个合适的输入使应用执行到目标语句。
符号执行无疑是最好的方法,但是这种方法需要根据我们的符号来建模PHP内置函数的语义,需要大量的工程努力;作者实验中30个web应用使用了460个内建函数,然后随着PHP解释器的发展,将需要更多的内置函数来执行符号执行,因此作者选择了模糊测试,意味着存在漏报。
Fuzzing
(C2-1)在大型PHP应用程序上进行无状态模糊处理时,很难建立高吞吐量。当目标应用很大时,在应用上执行每个生成的输入是一个很慢的过程。作者选择的30个应用平均一个请求执行时间是0.6s。比SOTA慢非常多。因为目标应用会执行很多与POI漏洞无关的模块,进一步,也可能在模糊测试的过程中,产生副作用,导致目标应用不能正常工作。然后,在每次执行完将程序恢复到原始状态是非常费时的。
(C2-2)通过模糊测试生成一个具有多个属性值的可利用对象是困难的。大量模糊测试将输入建模为字节流,然而POI漏洞自动利用需要执行面向对象的编程,需要更改多个属性并塑造对象层次结构,如何识别出可利用对象需要的属性?如何突变?

0x04 Overview

解决(C1-1)利用动静结合分析合并所有静态声明和动态加载生成的gadgets,解决(C1-2)通过粗粒度的过程间分析(修建不必要的POP链)和深度有界的宽度优先搜索,枚举可能的POP链。
解决(C2-1)通过合成一个PUT测试程序模拟触发POI漏洞的执行环境,解决(C2-2)利用分支覆盖率、运行时引用错误和提示来生成潜在的POP链。
在这里插入图片描述

0x05 Design

5.1 POI Detector

运行爬虫提取每个页面的<a><form>标签,生成对应的请求模板,对于这个请求模板中的每个GET、POST和COOKIE参数,检测器注入一个预定义的序列化字符串,该字符串表示我们的测试PHP对象,从而生成一组测试请求;在每个请求中,一个输入参数保存我们的预定义字符串。然后,检测器发送每个测试请求,并观察一个反序列化用户输入的PHP内置调用站点是否被我们的测试对象调用。
为了实现这个功能,FUGIO使用runkit和uopz,HOOK了26个预定义的涉及反序列化用户输入的PHP内置函数,如unserialize、is_file、file_exists等,如果这些反序列化相关内置函数被调用而且包含参数包含测试对象的实际参数时,就报告为一个潜在的POI漏洞,并将这处调用发送给动态分析器。

5.2 Static Analyzer

静态分析计算用户自定义类和函数的静态摘要,用于生成POP链和PUT测试程序。
解析每个PHP文件到AST,然后分析函数、类、interfaces和traits的定义。
对于类,提取如下信息,包括类名、命名空间、父类、implemented interfaces、used traits和类自己的定义,存储这些信息到定义该类的PHP文件的类摘要中。还包括类的每个已定义的属性和成员方法的名称和可见性(visibility)。
当解析函数和成员方法定义时,静态分析器提取它的函数原型并计算函数摘要,包括调用者-被调用者关系,对于函数和成员方法定义中的每一个函数调用(如$receiver->method()),分析器提取目标的method名称和它的receiver类候选对象。当调用显式地使用$this时,静态分析器会精确地推断出receiver为目标方法的所有者和该所有者的父类的所有者。否则,它将一组包含目标的method的类作为receiver的候选对象,计算所有可能类的保守集。当存在来自涉及new关键字的新实例化对象的过程内数据流到receiver如($receiver = new ClassA), 分析器使用这个类作为receiver,每个文件摘要中的调用者-被调用者关系后面用来连接gadget构建POP链。
对于每个成员方法和函数,静态分析器计算从它的形参和所有者的属性到函数体中每个调用的参数的流不敏感的过程内数据流。函数摘要中的这些数据流用来删除在攻击中不能通过调整注入对象的属性值来改变后续gadgets的真实参数因而不可利用的中间的gadget 。
PS:思考
收集类名、包含的属性和成员方法、调用者-被调用者关系、成员函数体中过程内数据流(成员函数形参、类属性到函数体内调用的数据流)
member method和function的区别是什么?
(类/函数)摘要的具体格式是什么样?

5.3 Dynamic Analyzer

为哪些动态生成的,没有在函数源代码中静态定义的类和函数计算函数摘要和类摘要。这些摘要随后也会被用于生成链的POP链标识符和PUT所使用。
给定一个POI漏洞,动态分析器收集静态分析器收集不到的额外信息。为此,FUGOI创建一个文件来安装hook ,使用runkit和uopz扩展来hook php内置函数,如unserialize

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

衬衫chenshan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值