作者:20W Bug Bounty 获得者、零信任初心者、我们敬爱的主管、赛博回忆录、老废物乐园掌门人 - 360安全忍者

这个漏洞和Spring框架在2010年出过的对象绑定漏洞有关,是2010年Spring对象绑定漏洞补丁的绕过,漏洞发现者首先review了一下补丁代码,如下

随后发现补丁代码的含义:禁止任何class对象获取classloader和protectionDomain,如果攻击者尝试以class.classloader获取任意class对象的loader,则打断嵌套属性获取流程。

补丁在jdk8及以下是没有问题的,问题出在jdk9以上,为什么?

因为oracle/sun 把一直想做的模块化在不断的delay中终于在jdk9中实现了,笔者猜测module.classloader的作用在于解决或兼容模块间类加载隔离的问题。

随后,漏洞发现者成功使用class.module.classLoader绕过了2010年官方针对Spring对象绑定漏洞的补丁,原因在于对象绑定嵌套属性获取流程是使用内省实现的,基于内省获取Module对象,所以这里的classloader是通过Module对象获取的,不是class对象。

成功获取classloader后,使用2018年公开的Tomcat利用方式实现远程代码执行,这里不再赘述。

官方针对这个漏洞发布了新的补丁

新补丁:禁止class对象进一步获取classloader,且属性名只允许为name并以Name结尾,属性返回类型不能为Classloader及Classloader子类

笔者这里给两个思路绕过这个新补丁 ( 目前只是思路 ,尚未落地 )

  1. 利用静态代码分析,分析三方包解决第一个限制
  2. 利用类型混淆漏洞解决第二个限制

Ref: https://docs.spring.io/spring-framework/docs/3.0.x/reference/validation.html
https://www.logicbig.com/tutorials/spring-framework/spring-core/data-binding.html
https://cloud.tencent.com/developer/article/1035297
http://rui0.cn/archives/1158

点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖