Apache Airflowに、認証の欠如に起因する深刻な脆弱性が見つかりました。攻撃者はAirflowの認証情報を持たなくても、Celeryワーカー上でコードを実行できます。この脆弱性はCVE-2026-68982として追跡されており、CWE-306に分類されています。影響を受けるのは、CeleryExecutorを使用している3.4.0より前のAirflowです。
Celeryブローカーに書き込める人物であれば、ワーカーがインポート可能なPython関数を、任意の引数を指定して実行させることができます。
この問題を発見したのは、セキュリティ研究者のReflectizの Or Sahar氏です。同氏は、CeleryExecutor、Redisブローカー、PostgreSQLバックエンドを用いたDocker Composeの検証環境で、Airflow 3.2.1と3.3.0において脆弱性を確認しました。Airflowでは、ここ数カ月で複数のセキュリティ上の問題が見つかっていますが、今回の脆弱性はログインがまったく不要な点が特徴です。
Cybersecurity news
Apache Airflowの脆弱性
Airflowのワーカーが指示を受け取る経路は3つあります。Web UIとREST APIは、認証情報のないユーザーを拒否します。ブローカー上のExecuteTaskメッセージには署名付きトークンが付与されており、タスクの実行前にExecution APIがこれを検証します。一方、同じブローカー上のExecuteCallbackメッセージには、検証がまったく行われません。
ExecuteCallbackは、同期型のDeadline Alertコールバックのために追加されたものです。DAG実行が期限に間に合わなかった場合に、指定した関数を実行する仕組みです。スケジューラがブローカー経由でワーカーにコールバックを送り、ワーカーは設定された関数をインポートして呼び出します。ブローカーはメッセージを認証しないため、攻撃者はメッセージを偽造し、任意の関数を指定できます。
execute_workloadタスクは、ブローカーから届いたJSON形式のボディを、型付きオブジェクトにそのまま変換します。署名もHMACもブローカー側のアクセス制御もありません。コールバックのメッセージにはtokenフィールドがありますが、3.2.1のexecute_callback_workload()も、3.3.0のsupervise_callback()とCallbackSubprocessも、これを検証していません。
ワーカーはメッセージからpathとkwargsを読み取り、import_moduleとgetattrで関数を読み込んで、即座に呼び出します。これにより、os、subprocess、プロバイダーのNotifierクラスなど、インポート可能なあらゆるモジュールに到達できます。
この機能は実験的なものとして文書化されていますが、それで影響範囲が限定されるわけではありません。Celeryプロバイダーが読み込まれると、この処理はすべてのCeleryExecutorワーカーに登録されます。Airflowの認証情報漏えいに関する過去の調査からも、これらのワーカーが機密データを大量に保持しうることがわかります。
概念実証(PoC)
攻撃者は、typeをExecuteCallback、tokenを空にしたワークロードを偽造します。コールバックオブジェクトではfetch_methodにimport_pathを指定し、pathにos.systemを設定します。kwargsには、touch /tmp/pwned_by_broker_callbackなどのコマンドを入れます。攻撃者はこれを、Celeryのsend_task(“execute_workload”, …)を使って、redis://<broker-host>:6379/0のようなブローカーに送信します。
この攻撃にはJWT、DAG、DagRun、スケジューラのいずれも必要ありません。攻撃後もAirflowのAPIはDAGとDagRunが0件であると報告しており、そのためUI
SOCにアラートの文脈情報を提供し、インシデントを迅速に止めましょう。16,000のSOCの脅威インテリジェンスを統合。