CVE-2022-25237 Bonitasoft Platform 从认证绕过到未公开反序列化漏洞发现之旅

VSole2022-05-30 07:11:13

漏洞信息

Bonitasoft 从 Dockerhub 下载超过 500 万次,它是一个业务自动化平台,可以更轻松地在业务流程中构建、部署和管理自动化应用程序。

CVE-2022-25237 Bonitasoft Platform 存在 Auth AP I认证绕过漏洞,通过精心构造 payload 发送到特殊功能的 API URL,可导致远程代码执行。受影响版本如下:

For community(社区版):

  • 2022.1-u0 (7.14.0) 以下

For subscription(订阅版):

  • 2022.1-u0 (7.14.0) 以下
  • 2021.2-u4 (7.13.4) 以下
  • 2021.1-0307 (7.12.11) 以下
  • 7.11.7 以下

在分析认证绕过漏洞时,还发现了一处潜藏的未公开反序列化漏洞。下面将完整分析过程共享给大家。

环境准备

使用 docker 运行对应版本镜像。查看 Java 进程:

添加远程调试配置:

重启容器,查看是否开启 5000 调试端口,开放成功后配置 idea 指定调试端口:

补丁对比

对比 `bonita:7.13.0` 和 `bonita:7.14.0` 版本,发现`bonita:7.14.0` 中删除了 `AbstractAuthorizationFilter` 类,该文件中包含 `Filter` 权限认证绕过逻辑:

通过补丁对比,在 `web.xml` 中发现还增加了一处认证配置:

这个配置主要是为 `/serverAPI/` 路由添加 `BASIC` 认证。

认证绕过漏洞

补丁分析中讲到,最新版的软件已经将 `AbstractAuthorizationFilter` 删掉,那么在 `AbstractAuthorizationFilter` 代码中明确指出了哪些路由不需要 `session`,在漏洞分析的时候主要关注 `isMatched` 赋值为 `true` 的那一行。`requestURL` 为用户请求的 `URL`, `contains` 只是简单匹配了路由是否包含 `excludePatterns`:

其中 `excludePatterns` 在配置文件中赋值:

上面3个鉴权 `Filter` 中的 `excludePatterns` 变量,必定包含 `i18ntranslation` 。`web.xml` 文件中配置了路由对应的 `Filter` 链,因为 `/API/*` 路由对应了 `RestAPIAuthorizationFilter` ,因此可以选择 `i18ntranslation` 作为权限绕过关键字:

根据上面的分析,我们可以构造多种姿势的 URL 实现认证绕过:

文件上传到 RCE

虽然有了 `Filter` 认证绕过,但并不意味着能在核心功能代码中完全实现认证绕过,从目前公开的 POC 来看,主要利用了管理员的权限上传恶意组件,核心 `servlet` 为 `FileUploadServlet`,其子类对应两个 `url` :

通过静态分析和动态调试, `FileUploadServlet` 在文件处理过程中需要获取 `session` 中的 `apiSession` 字段:

然而问题是,如果不登陆, `Session` 中的 `apiSession` 就不会被赋值,获取该字段会抛异常。因此如果要使用该功能必须要配合用户登录的 `session` 才行。虽然访问 `/API/pageUpload` 需要管理员权限,但是结合 `Filter` 认证绕过,在普通用户下也可以访问,所以漏洞的准确描述应该为越权漏洞。这个漏洞的逻辑过程比较简单,这里就不过多叙述了,下面重点分析新发现的反序列漏洞。

反序列化漏洞

进入真正的主题。在分析复现 CVE-2022-25237 的过程中,注意到修复补丁增加了其他一些 `servlet` 的鉴权。根据 `web.xml` 配置信息,可知 `/serverAPI/` 路由对应的是 `HttpAPIServlet` ,关联的处理类为 `org.bonitasoft.engine.api.internal.servlet.HttpAPIServlet` :

定位 `doPost` 方法,判断了 `this.enabled` 变量,该变量在 docker 安装时默认为 `false`:

需要在 docker 启动时添加环境变量,或者在系统启动时修改环境变量的默认值。检查完环境变量后,将调用 `callHttpApi` 函数, 接着进入 `HttpAPIServletCall#doPost` 方法:

函数内部存在很多反序列化操作,主要包括 xstream XML 反序列化和 Java 原生反序列化:

因为 xstream 版本为 v1.4.18,目前公开的利用链无法使用。重点关注存在原生反序列化过程的 `deserialize` 函数:

按照代码处理流程构造数据包成功达到反序列化触发点:

在项目依赖库中发现 bonitasoft 使用了 `commons-beanutils-1.9.4.jar`,可以参考公众号前面提到的不依赖 cc 链的 cb 利用链新的构造思路,同时结合 Tomcat 命令回显姿势,实现反序列化命令执行回显的效果:

有兴趣深入交流的小伙伴,请加入我们的漏洞空间站-致力于打造优质漏洞资源和小伙伴聚集地!

由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。

漏洞序列化
本作品采用《CC 协议》,转载必须注明作者和本文链接
最近两个月我一直在做拒绝服务漏洞相关的时间,并收获了Spring和Weblogic的两个CVE但DoS漏洞终归是鸡肋洞,并没有太大的意义,比如之前有人说我只会水垃圾洞而已,所以在以后可能打算做其他方向早上和pyn3rd师傅聊天
浅谈Java反序列化漏洞
2022-05-17 17:48:01
Java序列化与反序列化Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。
序列化漏洞汇总
2022-01-07 22:17:34
漏洞出现在WLS Security组件,允许远程攻击者执行任意命令。攻击者通过向TCP端口7001发送T3协议流量,其中包含精心构造的序列化Java对象利用此漏洞。然后将其序列化,提交给未做安全检测的Java应用。Java应用在进行反序列化操作时,则会触发TransformedMap的变换函数,执行预设的命令。
序列化的核心思维旨在,将A变成B,最后再从B还原回A。 总之,在一些条件苛刻或者变化无常的环境与需求中,产生了这种灵活的可逆性的B的中间体。 理解不安全反序列化的最好方法是了解不同的编程语言如何实现序列化和反序列化。这里的序列化与反序列化指的是程序语言中自带的实施与实现。而非自创或者自定义的序列化与反序列化机制(比如:N进制形式hashmap树型等其他数据结构里的序列化中间体)。
漏洞影响版本 Jboss 漏洞搭建 在阿里云端,用docker 搭建测试环境jboos使用的漏洞库是 vulhub ,进入漏洞库选择jboos里面有三个选项选择第一个cve.输入 docker-compose up -d 启动 本地测试,在浏览器输入访问 /invoker/readonly,若显示HTTP Status 500,则说有反序列化漏洞。使用工具测试验证漏洞是否存在,工具下载地址: ... 执行whoami命令
前置知识分析Transformer接口及其实现类。transform()传入对象,进行反射调用。构造调用链调用链构造原则:找调用关系要找不同名的方法,如果找到同名,再通过find usages得到的还是一样的结果。找到InvokerTransformer类中的transform(),右键,点 Find Usages,找函数调用关系,最好找不同名的方法,调用了transform()。因为transform()调用transform()不能换到别的方法里,没有意义。如果有一个类的readObject()调用了get(),那我们就可能找到了调用链。最终选择TransformedMap这个类,因为TransformedMap类中有好几处都调用了transform()。
使用 SerializationBinder 无法完全修复反序列化漏洞隐患。经过深入研究总结了两种不安全 SerializationBinder 限定的绕过方式,下面分享给大家。
近日Oracle通报了一个反序列化漏洞CVE-2022-21445,未经身份认证的远程攻击者可利用该漏洞实现反序列化操作导致任意代码执行。任何基于ADF Faces框架开发的程序都受到此漏洞的影响,包括Oracle的多个产品。
Fastjson Develop Team发布安全公告,修复了一个存在于Fastjson1.2.80 及之前版本中的反序列化漏洞漏洞编号:暂无,漏洞威胁等级:高危。
JDK7u21的核心点是我们在cc1中也出现过的AnnotationInvocationHandler,在cc1中我们用到了他会触发this.memberValues.get(var4);这个点,而在JDK7u21中利用到了他里面的equalsImpl。先来看一下equalsImpl。
VSole
网络安全专家