关键词: 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 集群内使用自签名证书”,但这是错误的。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 集群内使用自签名证书”,但 Kubernetes 在已知路径提供了受信任的 CA 包。正确的方法是使用该 CA 包进行验证,而不是完全禁用 TLS。
K8S_CA_CERT_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
# 同步
resp = requests.post(token_request_url, ..., verify=K8S_CA_CERT_PATH)
# 异步
ssl_ctx = ssl.create_default_context(cafile=K8S_CA_CERT_PATH)
async with self._session.post(token_request_url, ..., ssl=ssl_ctx)
+----------------------------------------------------------+
| 1. 攻击者获得 Pod 访问权限 |
| 被攻陷的容器或网络命名空间访问 |
+---------------------------+------------------------------+
|
v
+----------------------------------------------------------+
| 2. MITM 令牌交换 |
| 集群网络内的 ARP 欺骗 / DNS 劫持 |
| 提供自签名证书(由于 verify=False 被接受) |
+---------------------------+------------------------------+
|
v
+----------------------------------------------------------+
| 3. 拦截凭据 |
| - K8s 服务账户 JWT(Authorization 标头) |
| - Databricks OAuth 令牌(响应体) |
+---------------------------+------------------------------+
|
v
+----------------------------------------------------------+
| 4. 横向移动 |
| 使用窃取的令牌访问 K8s API 和 Databricks |
+----------------------------------------------------------+
修复 PR: apache/airflow#63704
修复方案将 verify=False 替换为 verify=K8S_CA_CERT_PATH,使用标准的 Kubernetes 集群内 CA 包,并将 ssl=False 替换为正确配置的 SSL 上下文。
| 日期 | 事件 |
|---|---|
| 2026-03-15 | 向 [email protected] 报告漏洞 |
| 2026-03-15 | Jarek Potiuk(Airflow 提交者)确认收到报告 |
| 2026-03-16 | CVE-2026-32794 分配;修复 PR #63704 已创建 |
本公告根据负责任披露原则发布,用于教育和防御目的。提供的信息旨在帮助开发者和安全团队理解并修复漏洞。请勿将本信息用于未经授权的测试或恶意目的。
本项目的完整文档、方法论及相关研究位于:
由 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 |
| 方面 | 描述 |
|---|
| 直接影响 | MITM 拦截 K8s JWT 和 Databricks OAuth 令牌 |
| 攻击面 | 同一集群网络内的任何 Pod |
| 凭据窃取 | K8s 服务账户和 Databricks 令牌都被暴露 |
| 横向移动 | 窃取的令牌允许访问 K8s API 和 Databricks 工作空间 |
| 受影响用户 | 任何使用 Databricks 提供程序并启用 K8s 令牌交换的 Airflow 部署 |