热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApacheFlink多个漏洞分析

空间测绘一、简介Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任

空间测绘

一、简介

Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务:DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持JavaScalaPython

Flink是一个纯流式计算引擎,而类似于Spark这种微批的引擎,只是Flink流式引擎的一个特例。

二、简单分析



1. 任意读

org.apache.flink.runtime.rest.handler.router.RouterHandler#channelRead0 部分代码如下

进入箭头所指 org.apache.flink.runtime.rest.handler.router.Router#route(org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpMethod, java.lang.String, java.util.Map>),函数部分代码如下

如上,红框部分会将 path 利用 / 切割成 tokens,注意这里 tokens 是经过了两次 decode 的(在path被切割成tokens时进行第二次decode),而 path 只经过一次 decode,后续会利用 path 进行路由匹配,由于进行了两次 url 编码,所以路由可以正常匹配到 org.apache.flink.runtime.rest.handler.cluster.JobManagerCustomLogHandler,否则将匹配到 org.apache.flink.runtime.rest.handler.legacy.files.StaticFileServerHandler 

虽然 StaticFileServerHandler 也能读文件,但是会有跨文件读的 check

最后查看 org.apache.flink.runtime.rest.handler.cluster.JobManagerCustomLogHandler#getFile 代码如下

如上图,filename 是直接从 tokens 中取出,直接拼接到 logDir 父目录下,由于 token 经过 2 url 解码,所以能够正常获取到 ../../ ,从而进行跨目录读


2. 任意写

触发点在 org.apache.flink.runtime.rest.FileUploadHandler#channelRead0 ,部分函数如下

如上图,fileUpload 是用户可控的内容,则 filename 也是可控的,所以可以修改 filename 进行跨目录写操作


3. 反序列化

触发点在 org.apache.flink.runtime.rest.handler.job.JobSubmitHandler#loadJobGraph

如上,当以 post 方式访问到 /v1/jobs 时,会路由到此,简单查看逻辑发现会将我们上传到文件内容进行反序列化操作

三、鸡肋的反序列化


背景:

已知 apache flink 没有后端模板渲染的功能,前端的模板是通过 nodejs 静态编译得到,如果想要以任意文件写入的方式去修改模板文件,需要重新编译并且重启服务器才能 RCEflink 中虽然有 plugins 功能,但是不支持热拔插,plugins 中的 jar 包只会在服务启动时被加载一次。最后还有一个功能就是上传 jar 包并且动态执行,但是这是系统的正常功能,不在恶意利用考虑范围内

任意文件写:在 flink 中不能直接 RCE,大都需要重启服务

反序列化:flink 自身依赖非常少,公开已知的 gadgets 全部失效

破局:

从 反序列化入手,重新挖掘针对 flink gadgets,发现 flink 中存在自己实现的反序列化逻辑,并且可以通过 readObject 函数从 jdk 原生反序列化跳到它自实现的反序列化逻辑中,见 org.apache.flink.api.common.state.StateDescriptor#readObject 函数:

如上图,会有一个 deserialize 函数的调用,查看了一下实现类,非常多

其中找到个类:PojoSerializer,其 deserialize 函数部分如下:

如上图,经过仔细分析其功能逻辑,发现是通过反射直接进行属性值填充,所以无法再跳到 getter/setter 调用逻辑中,但是发现上图红框部分,存在类加载调用,且第二参数为 true (会执行类初始化,调用 static 代码块)

于是转变思路,先上传恶意 class 文件,然后触发 jdk 反序列化,最后利用它自实现的反序列化功能,加载恶意 class 文件

首先需要去验证,系统启动时 classpath 是否存在目录(非 jar 文件路径),启动 classpath 参数如下

如上图,能够看出是直接加载了所有的 /lib 目录下的 jar 文件,但是后面存在 三个 : ,猜测可能会将程序启动目录作为 classpath

动态调试如下:

如上图,证明猜测正确,系统自动将程序启动目录(根目录)作为了一个类加载路径。

所以可以将恶意 class 写入 flink-1.11.2/ 目录,然后经过反序列化去加载 class ,从而进行 RCE

 

四、总结

任意读过程中的两次 urldecode 比较有意思,第一次decode产生 pathpath 再次decode并切割产生tokenspath 会被当作路由进行匹配,而tokens会被当作最终的函数参数。

反序列化更是鸡肋,但是从上文中也能发现,虽然现在通用反序列化gadgets越来越不好用,但是由于程序自身需要,还是会涉及到很多反序列化场景,所以针对性的gadgets挖掘很有必要,在漏洞挖掘的时候应该让思路更活跃一些,就会发现更多有意思的东西

flink 本身是没有鉴权的,并且它本身支持任意jar包上传并执行,所以需要严格控制其网络访问权限,目前任意文件读写都已经在最新版修复


推荐阅读
  • 标题: ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • Flink使用java实现读取csv文件简单实例首先我们来看官方文档中给出的几种方法:首先我们来看官方文档中给出的几种方法:第一种:Da ... [详细]
  • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
  • 前言本篇为大家总结社区多人合作常见的场景和对应的git操作命令。本篇非新手教程,阅读本篇前需具备Git基础知识。Git入门教程请参考https://www ... [详细]
author-avatar
手机用户2602918063
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有