SOFARPC简介
SOFARPC 是一个高性能、高扩展性、生产级的 Java RPC 框架。
2024年1月24日,启明星辰VSRC监测到SOFARPC中修复了一个反序列化漏洞(CVE-2024-23636),该漏洞的CVSSv3评分为9.8。由于SOFARPC 默认使用 SOFA Hessian 协议来反序列化接收到的数据,而 SOFA Hessian 协议使用黑名单机制来限制危险类的反序列化。SOFARPC 版本5.12.0之前,威胁者可通过Gadget链(只依赖于JDK,不依赖任何第三方组件)绕过SOFA Hessian黑名单保护机制,导致远程代码执行。
序列化分析
sofa-rpc默认使用 SOFA Hessian 协议来反序列化接收到的数据,所以,下载源码去看对应的实现。
对应的代码在com.alipay.sofa.rpc.codec.sofahessian
这个包下面
com/alipay/sofa/rpc/codec/sofahessian/SofaHessianSerializer.java# encode()
这里先对传入obj获取对应的serializer,若果没有获取到,就使用默认Hessian进行序列化。
com/alipay/sofa/rpc/codec/sofahessian/SofaHessianSerializer.java# decode()
对应两种反序列方式,可以看到就是hessian序列化和反序列化外面套了一成。
尝试一下,直接调用它的序列化,反序列化方法是能可以命令执行的。
因为直接调用它的序列化和反序列函数,是没用过黑名单的。
具体的流程就是非常短的一条链子
HashMap.equals
UIDefault.equals
Hashtable.equals
UIDefault.get
UIDefault.getFromHashtable
SwingLazyValue.createValue
简单说就是UIDefault它里面没有equals方法,调用它的父类的equals,然后触发UIDefault.get。完成了 only jdk的调用。
这是tostring的方式。