CVE-2018-1270

https://github.com/vulhub/vulhub/tree/master/spring/CVE-2018-1270

https://paper.seebug.org/562/

https://sourcegraph.com/search?q=context:global+repo:%5Egithub%5C.com/spring-projects/spring-framework%24%40%5Ev5.0.4.RELEASE:v5.0.5.RELEASE+type:commit+file:spring-messaging/&patternType=standard&sm=0&groupBy=author

https://sourcegraph.com/github.com/spring-projects/spring-framework/-/commit/e0de9126ed8cf25cf141d3e66420da94e350708a?visible=1

概述

Spring Messaging 远程命令执行漏洞(CVE-2018-1270)

spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,

在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析,造成命令执行漏洞。

漏洞影响版本:

  1. Spring Framework 5.0 to 5.0.4
  2. Spring Framework 4.3 to 4.3.14
  3. 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,上下文变为了安全的类。