【原创】Spring Data Redis <=2.0.3反序列化漏洞
Spring Data Redis隶属于Spring Data家族, 提供简单易用的方式来访问Redis缓存。
Spring Data Redis在往Redis里面写数据的时候,默认会先对数据进行序列化,然后把序列化之后的字节码写入Redis;然后当Spring Data Redis从Redis里取数据的时候,会取出字节码进行反序列化操作,在反序列化的过程中没有对目标类进行校验和过滤,可导致远程任意代码执行。
攻击路径:
1.首先准备反序列化payload,参考ysoserial系列。
2.把生成的payload写入Redis中:
redis.set("\xac\xed\x00\x05t\x00\brebeyond",Payload)
这样,名为rebeyond的key中就有了我们构造的payload。
最好选择Redis中已经存在的key,这样等Spring取数据的时候就可以触发代码执行。
3.等待Spring读取我们已经覆盖的key,示例如下:
4.Spring侧的机器成功弹出计算器:
调用栈如下:
其他:
This vulnerability is tested on jdk1.8.0_144+spring 5.0.3+spring data redis 2.0.3+ commons-collections4:4.0
Common-collections4 is not necessary.Some modifications to payload can be applied to <=jdk8u20 without Common-collections4.
尝试把这个问题提给Spring,不过Spring认为Redis在内网,开发人员有必要保证Redis的安全,所以没有认可该问题,只是更新了他们的产品guidelines ,让用户确保自己的Redis用在安全网络中。下图是pivotal的答复。但是我觉得认为Redis在内网就是安全的有点太乐观,我觉得对于spring来讲更好的解决方案是把默认的序列号引擎由DefaultDeserializer 改为JsonDeserializer:)
[0] https://jira.spring.io/browse/DATAREDIS-780
[1] https://github.com/spring-projects/spring-data-redis/commit/1f6790b10099f26c23c46ae5a099ba1023f055b1