Spring Framework通过spring-messageing模块和STOMP代理对象通讯。根据漏洞描述可以知漏洞出现在spring-message模块 或者是 stomp-websockets模板块,下面逐一分析:
存在的敏感方法
@Nullable
public String[] decode(String content) throws IOException { return (String[])this.objectMapper.readValue(content, String[].class); }
反序列化使用的jackson组件,但是没有开启 autotype
功能,并且代码指定了反序列化类型为 String[].class
,利用jndi注入方式会导致异常,没有成功。
DefaultSubscriptionRegistry
类中方法 addSubscriptionInternal
存在 expression = this.expressionParser.parseExpression(selector)
(危险的SPEL表达式语句)。
根据上下文可以初步判定selector参数可以控制,但是了解SPEL注入的同学应该知道,要想达到代码执行,需要调用 expression.getValue()
或者 expression.setValue()
方法。继续寻找会发现该文件的154-164行调用了 expression
对象的 getValue
方法。
点击Connet按钮抓包
修改请求报文,插入如下字段
/nselector:new java.lang.ProcessBuilder("/Applications/Calculator.app/Contents/MacOS/Calculator").start()
回到聊天窗口,发送任意消息即可触发恶意代码
Patch:[ https://github.com/spring-guides/gs-messaging-stomp-
websocket/commit/6d68143e04ea1482b724c3f620688ec428089bc0][8]
From: https://pivotal.io/security/cve-2018-1270