
CVE-2026-32794: Apache Airflow Databricks Provider における TLS 証明書検証バイパス
キーワード: TLS、証明書検証、MITM、Kubernetes、Databricks、OAuth、CWE-295、Apache Airflow
apache-airflow-providers-databricks パッケージは、フェデレーショントークン交換中に Kubernetes API サーバーと通信する際、TLS 証明書の検証を無効化します。同期・非同期の両コードパスで verify=False / ssl=False が使用されており、K8s クラスター内のネットワークにアクセスできる攻撃者は誰でも、その接続を MITM してクラスター内サービスアカウントの JWT と Databricks OAuth トークンの両方を窃取できます。
コード内のコメントは「K8s in-cluster は自己署名証明書を使用する」と主張していますが、これは誤りです。Kubernetes は、まさにこの目的のために /var/run/secrets/kubernetes.io/serviceaccount/ca.crt に CA バンドルを提供しています。
699 行目(同期パス)- _get_k8s_token_request_api():
resp = requests.post(
token_request_url,
headers={
"Authorization": f"Bearer {in_cluster_token}",
"Content-Type": "application/json",
},
json=self._build_k8s_token_request_payload(audience, expiration_seconds),
verify=False, # K8s in-cluster uses self-signed certs
timeout=self.token_timeout_seconds,
)
764 行目(非同期パス)- _a_get_k8s_token_request_api():
async with self._session.post(
token_request_url,
...
ssl=False, # K8s in-cluster uses self-signed certs
)
コメントは「K8s in-cluster は自己署名証明書を使用する」と述べていますが、Kubernetes は既知のパスに信頼された CA バンドルを提供しています。正しいアプローチは、TLS を完全に無効化するのではなく、その CA バンドルを検証に使用することです。
K8S_CA_CERT_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
# Sync
resp = requests.post(token_request_url, ..., verify=K8S_CA_CERT_PATH)
# Async
ssl_ctx = ssl.create_default_context(cafile=K8S_CA_CERT_PATH)
async with self._session.post(token_request_url, ..., ssl=ssl_ctx)
+----------------------------------------------------------+
| 1. ATTACKER GAINS POD ACCESS |
| Compromised container or network namespace access |
+---------------------------+------------------------------+
|
v
+----------------------------------------------------------+
| 2. MITM THE TOKEN EXCHANGE |
| ARP spoof / DNS hijack within cluster network |
| Serve self-signed cert (accepted due to verify=False) |
+---------------------------+------------------------------+
|
v
+----------------------------------------------------------+
| 3. INTERCEPT CREDENTIALS |
| - K8s service account JWT (Authorization header) |
| - Databricks OAuth token (response body) |
+---------------------------+------------------------------+
|
v
+----------------------------------------------------------+
| 4. LATERAL MOVEMENT |
| Use stolen tokens for K8s API + Databricks access |
+----------------------------------------------------------+
修正 PR: apache/airflow#63704
この修正は、標準の Kubernetes in-cluster CA バンドルを使用して verify=False を verify=K8S_CA_CERT_PATH に置き換え、ssl=False を適切に構成された SSL コンテキストに置き換えます。
| 日付 | イベント |
|---|---|
| 2026-03-15 | 脆弱性を [email protected] に報告 |
| 2026-03-15 | Airflow コミッターの Jarek Potiuk が報告を確認 |
| 2026-03-16 | CVE-2026-32794 が採番され、修正 PR #63704 が作成される |
本アドバイザリは、責任ある開示(responsible disclosure)の原則に基づき、教育および防御目的で公開されています。提供される情報は、開発者とセキュリティチームが脆弱性を理解し、修復することを支援することを目的としています。この情報を許可のないテストや悪意のある目的に使用しないでください。
このプロジェクトの完全な writeup、方法論、および関連研究は、以下にあります:
Kai Aizen によって作成 — 独立系オフェンシブセキュリティ研究者。
snailsploit.com · 研究 · フレームワーク · GitHub · LinkedIn · ResearchGate · X/Twitter
同じ攻撃。異なる基盤。
| フィールド | 値 |
|---|
| CVE | CVE-2026-32794 |
| CWE | CWE-295: 不適切な証明書検証 |
| パッケージ | apache-airflow-providers-databricks (pip) |
| 影響を受けるバージョン | K8s トークン交換を行う全バージョン |
| パッチ適用バージョン | 保留中 (PR #63704) |
| コンポーネント | providers/databricks/src/airflow/providers/databricks/hooks/databricks_base.py |
| 側面 | 説明 |
|---|
| 直接的な影響 | K8s JWT と Databricks OAuth トークンの MITM 傍受 |
| 攻撃対象領域 | 同じクラスターネットワーク内の任意の Pod |
| 認証情報の窃取 | K8s サービスアカウントと Databricks の両トークンが露出 |
| 横展開 | 窃取されたトークンにより、K8s API と Databricks ワークスペースの両方へのアクセスが可能になる |
| 影響を受けるユーザー | K8s トークン交換を使用する Databricks Provider を利用したすべての Airflow デプロイメント |