影响版本

Spring Framework 5.0 to 5.0.4
Spring Framework 4.3 to 4.3.14

漏洞分析

Spring Framework通过spring-messageing模块和STOMP代理对象通讯。根据漏洞描述可以知漏洞出现在spring-message模块 或者是 stomp-websockets模板块,下面逐一分析:

spring-websockets 模块

存在的敏感方法@Nullablepublic String[] decode(String content) throws IOException {
return (String[])this.objectMapper.readValue(content, String[].class);
}
反序列化使用的jackson组件,但是没有开启autotype功能,并且代码指定了反序列化类型为String[].class,利用jndi注入方式会导致异常,没有成功。

rce1.png

分析spring-message模块

DefaultSubscriptionRegistry类中方法addSubscriptionInternal存在expression = this.expressionParser.parseExpression(selector)(危险的SPEL表达式语句)。
根据上下文可以初步判定selector参数可以控制,但是了解SPEL注入的同学应该知道,要想达到代码执行,需要调用expression.getValue()或者expression.setValue()方法。继续寻找会发现该文件的154-164行调用了expression对象的getValue方法。
###复现下漏洞的触发流程:
点击Connet按钮抓包

rce2.png

修改请求报文,插入如下字段
\nselector:new java.lang.ProcessBuilder("/Applications/Calculator.app/Contents/MacOS/Calculator").start()

rce3.png

回到聊天窗口,发送任意消息即可触发恶意代码。

rce4.png

rce5.png

rce6.png

修复方案

5.0.x users should upgrade to 5.0.5
4.3.x users should upgrade to 4.3.15

源链接

Hacking more

...