近日, 最受欢迎的开源轻量级 Java 框架 Spring 被曝存在 高危的 RCE( 远程控制设备 ) 零日漏洞 , 北京大学计算中心(相关公告在本文发布时已删除)、 外媒 praetorian 、bleepingcomputer 等站点对该漏洞进行了报道。
据网上疯传的介绍,该 RCE 漏洞源于 Spring 框架核心的 SerializationUtils#dserialize
方法,该方法基于 Java 的序列化与反序列机制,可导致远程代码执行 (RCE),使用 JDK9 及以上版本 皆有可能受到影响。
正在紧急修复?
从 Spring 项目的 Git 提交记录来看,在漏洞消息疯传的同时, Spring 开发者似乎在紧急处理漏洞相关的代码,比如 3 月 29日的新提交: 弃用 SerializationUtils#deserialize 。
在这个敏感的时间点,该提交引了一些紧张情绪,很多用户在该提交下面留言,询问该提交的代码改动是否与网传的 0day RCE 漏洞相关?而 Spring 核心开发者之一 sbrannen 对此 作出澄清:
弃用 SerializationUtils#deserialize 跟目前所有的漏洞都没有关系。
此提交的目的是通知使用过 SerializationUtils#deserialize
的用户:从不受信任的来源反序列化对象是危险的。
Spring 核心框架不会使用 SerializationUtils 反序列化来自不受信任来源的对象。
事实上,早在 2 月 19 日 Spring 框架的仓库就出现过对该 SerializationUtils
方法的讨论,开发者 ledoyen 就指出: 基于 Java 的序列化机制, SerializationUtils#dserialize
可能导致 RCE 远程代码执行漏洞,因此 他提出了弃用 SerializationUtils#dserialize
的 PR #28075 :
由此看来,前面的提交是 ledoyen 针对该 PR 的一次代码合并,弃用 SerializationUtils#dserialize
也是计划之内的事情。有人询问在该 PR 下询问“ SerializationUtils#dserialize
是否应该作为漏洞报道”时, ledoyen 也进行解释:
SerializationUtils#dserialize
本身不是漏洞,使用此工具处理用户输入数据可能会导致 CVE,但该方法在内部作为缓存结果拦截器( CacheResultInterceptor) 使用的话,则不会导致任何漏洞。
目前, SerializationUtils#dserialize
在 Spring Framework 6.0 中已弃用,而对于 5.3.x 版本,则是向 Javadoc 中添加针对 SerializationUtils 工具类的警告,以提高用户的警觉意识。
如果确实存在,那么这个 Spring 框架 RCE 漏洞的影响将远超此前的 Log4j 或 Heartbleed ,但小编翻了一整天,也没有看到谁能真正复现此漏洞(基本是开局一张马赛克图,漏洞细节全靠编)。
GitHub 上倒是有很多命名为 Spring core RCE 的新仓库,但基本都是“懂得都懂”的谜语描述。据郑州网安协会报道,甚至还有人趁乱发布钓鱼 exe 文件...
截至发稿时间,Spring 团队 没有对该漏洞发表任何官方公告: 官方博客的最新漏洞公告是 CVE-2022-22963:Spring 表达式资源访问漏洞 和 CVE-2022-22950:Spring 表达式 DoS 漏洞 ,但这两个漏洞的严重程度都是中等,无法与网传 Spring 核心框架的 RCE 高危程度相比。