
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 | 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 |
| 측면 | 설명 |
|---|
| 직접적인 영향 | K8s JWT 및 Databricks OAuth 토큰의 MITM 가로채기 |
| 공격 표면 | 동일한 클러스터 네트워크 내의 모든 파드 |
| 자격 증명 탈취 | K8s 서비스 계정 및 Databricks 토큰 모두 노출 |
| 수평적 이동 | 탈취한 토큰으로 K8s API 및 Databricks 워크스페이스 접근 가능 |
| 영향을 받는 사용자 | K8s 토큰 교환과 함께 Databricks 제공자를 사용하는 모든 Airflow 배포 |