CVE-2018-1270
https://github.com/vulhub/vulhub/tree/master/spring/CVE-2018-1270
概述
Spring Messaging 远程命令执行漏洞(CVE-2018-1270)
spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,
在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext
解析,造成命令执行漏洞。
漏洞影响版本:
- Spring Framework 5.0 to 5.0.4
- Spring Framework 4.3 to 4.3.14
- Older unsupported versions are also affected
分析
我是逆向进行搜索,首先搜索 spel 解析类关键字SpelExpressionParser
src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java:140
查看调用,定位到DefaultSubscriptionRegistry#addSubscriptionInternal方法,首先看到解析的内容是 selector,判断一下 selector 是怎么来的
selector 是从 headers 中取名称为 selector 的字段
MessageHeaders headers = message.getHeaders();
String selector = SimpMessageHeaderAccessor.getFirstNativeHeader(getSelectorHeaderName(), headers);
/* private String selectorHeaderName = "selector"; */
然后一步步往下跟
然后看一下是谁调用了这个 selectorExpression,在org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry#filterSubscriptions遍历了 Subscription,并调用了 spel 的 getValue,而且 context 还是StandardEvaluationContext。
调用链
修复分析
修复就是将StandardEvaluationContext修改为了SimpleEvaluationContext,上下文变为了安全的类。