Fastjson反序列化远程代码执行漏洞

admin 2022年5月24日13:27:25评论12 views字数 3002阅读10分0秒阅读模式

Fastjson反序列化远程代码执行漏洞

Fastjson 是Alibaba的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

fastjson已使用黑白名单用于防御反序列化漏洞,经研究该利用在特定条件下可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大。建议fastjson用户尽快采取安全措施保障系统安全。

高危

受影响版本:Fastjson ≤ 1.2.80

截止发稿安全版本:Fastjson = 1.2.83

洞排查

可使用以下命令检测当前使用的Fastjson版本:

lsof | grep fastjson

 

暂无,等待后续更新。

一、升级到最新版本1.2.83

 

参考链接:

https://github.com/alibaba/fastjson/releases/tag/1.2.83

 

升级步骤如下:

1.备份原fastjson依赖库,避免升级失败的情况发生。

2.将低版本的fastjson库替换为1.2.83版本即可

开发人员可通过配置Maven的方式对应用进行升级并编译发布,配置如下:

<dependency>      <groupId>com.alibaba</groupId>      <artifactId>fastjson</artifactId>    <version>1.2.83</version></dependency>

该版本涉及autotype行为变更,在某些场景可能会出现不兼容的情况。

 

二、safeMode加固

fastjson在1.2.68及之后的版本中引入了safeMode,配置safeMode后,无论白名单和黑名单,都不支持autoType,可杜绝反序列化Gadgets类变种攻击(关闭autoType注意评估对业务的影响)。

 

开启方法

 

有三种方式配置SafeMode:

 

1.在代码中配置

ParserConfig.getGlobalInstance().setSafeMode(true); 

注意,如果使用new ParserConfig的方式,需要注意单例处理,否则会导致低性能full gc。

 

2.加上JVM启动参数

-Dfastjson.parser.safeMode=true

如果有多个包名前缀,用逗号隔开。

 

3.通过fastjson.properties文件配置

通过类路径的fastjson.properties文件来配置,配置方式如下:

fastjson.parser.safeMode=true

参考官方文档:

https://github.com/alibaba/fastjson/wiki/fastjson_safemode

 

另可通过将有风险的类添加至黑名单进行防护:

ParserConfig.getGlobalInstance().addDeny("类名");
利用链:
https://github.com/alibaba/fastjson/commit/560782c9ee12120304284ba98b61dc61e30324b3
注:1.2.83修复了此次发现的漏洞,开启safeMode是完全关闭autoType功能,避免类似问题再次发生,这可能会有兼容问题,请充分评估对业务影响后开启。
三、升级到fastjson v2
 

fastjson v2地址 https://github.com/alibaba/fastjson2/releases

 

fastjson已经开源2.0版本,在2.0版本中,不再为了兼容提供白名单,提升了安全性。fastjson v2代码已经重写,性能有了很大提升,不完全兼容1.x,升级需要做认真的兼容测试。

四、safeMode场景如何做autoType
 
在1.2.68之后的版本,提供了AutoTypeCheckHandler扩展,可以自定义类接管autoType, 通过ParserConfig#addAutoTypeCheckHandler方法注册。
// com.alibaba.fastjson.parser.ParserConfig.AutoTypeCheckHandler    /**     * @since 1.2.68     */    public interface AutoTypeCheckHandler {        Class<?> handler(String typeName, Class<?> expectClass, int features);    }

    // com.alibaba.fastjson.parser.ParserConfig#addAutoTypeCheckHandler
五、怎么判断是否用到了autoType
看序列化的代码中是否用到了SerializerFeature.WriteClassName
JSON.toJSONString(obj, SerializerFeature.WriteClassName); // 这种使用会产生@type
 

六、使用JSONType.autoTypeCheckHandler

 

在fastjson 1.2.71版本中,提供了通过JSONType配置autoTypeCheckHandler的方法,比如:

 

public class JSONTypeAutoTypeCheckHandlerTest extends TestCase {    public void test_for_checkAutoType() throws Exception {        Cat cat = (Cat) JSON.parseObject("{"@type":"Cat","catId":123}", Animal.class);        assertEquals(123, cat.catId);    }

    @JSONType(autoTypeCheckHandler = MyAutoTypeCheckHandler.class)    public static class Animal {

    }

    public static class Cat extends Animal {        public int catId;    }

    public static class Mouse extends Animal {

    }

    public static class MyAutoTypeCheckHandler implements ParserConfig.AutoTypeCheckHandler {

        public Class<?> handler(String typeName, Class<?> expectClass, int features) {            if ("Cat".equals(typeName)) {                return Cat.class;            }

            if ("Mouse".equals(typeName)) {                return Mouse.class;            }

            return null;        }    }}

https://github.com/alibaba/fastjson/wiki/security_update_20220523

https://mp.weixin.qq.com/s/EjINCNh51MDeSuuH8p1mKw

 

使

 

 

    

 

原文始发于微信公众号(401SecNote):漏洞通报 | Fastjson反序列化远程代码执行漏洞

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月24日13:27:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Fastjson反序列化远程代码执行漏洞https://cn-sec.com/archives/1046756.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息