《Java API 中的魔法.pdf》由会员分享,可在线阅读,更多相关《Java API 中的魔法.pdf(38页珍藏版)》请在三个皮匠报告上搜索。
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端解析客户端传入数据的流程如下在进行通
7、信解析客户端传入参数时,会使用SOFA-Hessian进行反序列化,当构造好恶意的Object类型参数时,就可以将UnixPrintServiceLookup封装到数据中,在反序列化时执行命令,由于在反序列化前Server端并没有校验客户端调用的方法是否存在,因此无需知道远程的方法名也不影响反序列化恶意数据。KryoKryo是一种Java对象序列化协议,它可以快速地序列化和反序列化Java对象,并且生成的序列化数据比其他Java序列化协议更小,其反序列化的流程如下kryo在反序列化类时当类不在预设的缓存中时会使用FieldSerializer进行反序列化,FieldSerializer实例化类
8、时仅会使用类的无参数的构造方法,当类没有无参数的构造方法时无法实例化,实例化后利用反射来恢复属性。Lead to CVE-2020-5413Spring Integration是一种消息控制框架,其CodecMessageConverter在对消息进行转换时会使用到kryo进行反序列化,具体流程如下在5.2.7及以前的版本中,类无需注册即可使用kryo进行反序列化,因此在这里可以反序列化任意类,在反序列化时会默认用到FieldSerializer来恢复类和属性,因此这里符合使用UnixPrintServiceLookup的条件,无需任何依赖即可完成RCE利用Lead to CVE-2020-5
9、413官方对于该问题的修复逻辑主要是开启了kryo的类注册机制,因此在高版本中当消息接收方没有注册我们的恶意类时,是无法进行利用的FastJson(FieldBased)当FastJson开启Autotype和FieldBased配置时,将JSON转换为JAVA对象的流程如下Lead to CVE- version:3.1.0-3.1.4在dubbo的 3.1.x版本中,新增了fastjson2反序列化器,反序列化数据的流程如下Lead to CVE- version:3.1.0-3.1.4在dubbo中默认会使用hessian进行反序列化,但攻击者
10、可以通过consumer更改Serializeid来更改反序列化器的类型,虽然在高版本的dubbo存在着对反序列化id的校验检查,但在检查之前还存在着一个readUTF来读取dubbo的版本号,在Fastjson2反序列化器中readUTF会调用readObject来进行反序列化,整体流程如下可以看到在调用fastjson2解析数据时开启了AutoType和FieldBased,可以利用UnixPrintServiceLookup 执行命令,值得注意的是,该种方法适用性更强,无需知道远程服务的服务名及参数类型即可利用;Lead to CVE- version:3.1.0-
11、3.1.4对此问题,官方关闭了Autotype,同时不允许反序列化不实现Serializable的类Pojo Class Recovery通常应用在恢复Pojo类时为了兼容无setter方法的属性会使用反射来直接恢复属性,当其恢复类实例时如使用默认的构造方法,即可满足我们的要求Lead to CVE-当Dubbo服务提供者收到一个泛化调用请求时,GenericFilter会对请求进行处理,将请求中的参数转换为对应的Java对象,并将其传递给实际的服务实现类进行处理,在dubbo泛化调用时将其模式设置为raw.return后,在还原Pojo类时将使用默认的构造方法,并使用反
12、射来恢复属性Lead to CVE-其泛化调用时也有着自己的黑名单,位于serialize.blockedlist,在3.1.4版本前,sun.print包不在黑名单的范围中,因此这里符合利用UnixPrintServiceLookup的条件,利用泛化调用时的类实例化来执行命令;为了修复该问题,官方在后续的版本中对类实例化使用了黑白名单结合的过滤形式;使得后续的版本中整体的安全性大大提升。Lead to Flink RCE当向/v1/jobs路由发送文件上传的数据包时,会对上传的数据进行反序列化操作,起始点位于org.apache.flink.runtime.rest.h
13、andler.job.JobSubmitHandler#loadJobGraph这里可以使用mon.state.StateDescriptor中的readObject来选择反序列化器进行二次反序列化,当选择PojoSerializer反序列化器时,会使用无参构造函数来创建对象,同时使用反射的方式来恢复属性Lead to Flink RCE在这里完全适用UnixPrintServiceLookup 的利用条件,将看似“鸡肋”的反序列化变得不再鸡肋Member of gadget chain由于UnixPrintServiceLookup中执行命令的方法会由getDefaultPrintServi
14、ce方法调用到,且该方法为public方法,因此在反序列化中可以充当getter的gadget的角色,在实际利用中,通常会结合Fastjson、Rome等组件结合使用Safety Case某开源的分布式远程服务调用(RPC)框架中,在其进行远程方法调用的过程中,会默认使用hessian2进行数据序列化与反序列化,同时在反序列化前并不会对远程是否存在客户端所请求的方法进行校验;Safety Case即使不知道远程服务端的方法,也可以进行反序列化的利用,通过查询其依赖可以发现发现存在着fastjson的依赖;由于其没有反序列化安全过滤,可以直接通过fastjson中的JSONObject.toSt
15、ring 来调用UnixPrintServiceLookup的getDefaultPrintService方法,进而执行命令;RASP攻防TricksRASP攻防Tricks根据UnixPrintServiceLookup实例化时新建线程的特性,对RASP的检测规则能够轻松的绕过,demo如下RASP攻防Tricks上面的操作中显式的使用了反射来修改值,假如存在着一些漏洞场景时,可以有如下更隐蔽的利用如在spel+fastjson的场景下,可以无感的使用 fastjson特性来恢复属性减缓措施减缓措施对于 RPC服务来说对泛化调用进行严格的类型检查对通信时使用的序列化器使用黑白名单配置使用安全性较高的序列化器对于其他应用来说对用户可控的类实例化操作进行严格校验和检查对危险类对象的恢复进行检查感谢您的观看!T H A N KY O UF O RY O U RW A T C H I N G