1、Magic In Java APISpeaker:yemoli、R1ckyZyemoli、永信至诚伽玛实验室高级研究员R1ckyZ、中国科学院大学wha1eriR1ckyZyemoliSecR1ckyZ-WEByml-sec.topr1ckyz.github.ioAbout UsAgenda01API简介04减缓措施02安全影响03RASP攻防TricksAPI简介JDK中 PrintServiceLookup接口用于提供打印服务的注册查找功能,在linux的JDK中它的实现类叫做UnixPrintServiceLookup 或 PrintServiceLookupProvider(高版本 j
2、dk中)API简介execCmd的参数来自于类的属性,在某些特定情况下如果被篡改掉可能存在着一些安全风险安全影响安全影响01FieldBased mechanism02Pojo Class Recovery03Member of gadget chainHow FieldBased mechanism work in deserialisation在某些时候实例化类时调用无参数构造方法还原 Map 类型时,会调用 hashcode 等方法允许反序列化未实现 Serializable 接口的类使用反射来恢复对象的属性Existing ideasUtilisation under FieldBas
3、ed mechanismSerialize TypeAffectjava native serializeNOHessianYES(version=3.x)Hessian LiteYES(version=3.2.12)SOFA-HessianYES(version4.0.0)KryoYESFastJsonYES(FieldBased)JacksonYES(FieldBased)XStreamNOFSTNOHessianHessian是一种轻量级的二进制序列化协议,3.x版本中其反序列化的大致流程如下Hessian可以反序列化不实现Serializeable的类使用默认反序列化器JavaDese
4、rializer实例化类时会调用构造方法优先使用无参数构造方法,没有无参数构造方法时会选择有参数的构造方法,但只能还原基本类型参数,其他类型的参数会自动设置为null通过反射来恢复属性总结来讲,在进行反序列化时有如下的关键行为perfect with UnixPrintServiceLookupWhy not hessian 4.x?Why not hessian 4.x?Hessian Litehessian-lite是Apache Dubbo的一个模块,它是基于官方hessian的一个修改版本,在安全性上来说,相比于原始的hessian,hessian-lite中维护了一个黑名单,用于防御
5、已知的反序列化攻击;在3.2.12以及之前的版本中,可以反序列化没有继承Serializable的类,同时在黑名单中也不存在对sun.print的包的过滤,且默认的反序列化器为JavaDeserializer,因此可以完全符合我们对UnixPrintServiceLookup的利用要求Lead to CVE-2022-39198dubbo通信时默认使用hessian-lite进行反序列化,流程如下Lead to CVE-2022-39198根据上述流程可以发现完全符合UnixPrintServiceLookup的利用条件;对于此官方修复方案是在黑名单中限制了包名,同时不允许实例化未继承Seri
6、alizable的类SOFA-HessianSOFA-Hessian也是一个基于原生 Hessian 的改进版本,同样的,在3.x版本中,其默认的反序列化器为 JavaDeserializer,且 sun.print 包并不在其 serialize.blacklist 黑名单中,所以在3.x版本中对于 SOFA-Hessian 也可以直接利用 UnixPrintServiceLookup而在4.x的版本中,其反序列化器选择上同Hessian一样做出了改动,因此无法使用Safety Case某开源rpc框架依赖了SOFA-Hessian 3.x,Server端解析客户端传入数据的流程如下在进行通