
CVE-2026-32794: Bypass de Verificação de Certificado TLS no Apache Airflow Databricks Provider
Palavras-chave: TLS, verificação de certificado, MITM, Kubernetes, Databricks, OAuth, CWE-295, Apache Airflow
O pacote apache-airflow-providers-databricks desativa a verificação de certificados TLS ao se comunicar com o servidor da API Kubernetes durante a troca federada de tokens. Tanto o caminho de código síncrono quanto o assíncrono usam verify=False / ssl=False, permitindo que qualquer atacante com acesso à rede dentro do cluster K8s realize um MITM na conexão e roube tanto o JWT da conta de serviço in-cluster quanto o token OAuth do Databricks.
Os comentários no código afirmam que "o K8s in-cluster usa certificados autoassinados", mas isso está incorreto. O Kubernetes fornece um pacote de CAs em /var/run/secrets/kubernetes.io/serviceaccount/ca.crt especificamente para esse fim.
Linha 699 (caminho síncrono) - _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,
)
Linha 764 (caminho assíncrono) - _a_get_k8s_token_request_api():
async with self._session.post(
token_request_url,
...
ssl=False, # K8s in-cluster uses self-signed certs
)
O comentário afirma que "o K8s in-cluster usa certificados autoassinados", mas o Kubernetes fornece um pacote de CAs confiável em um caminho bem conhecido. A abordagem correta é usar esse pacote de CAs para verificação em vez de desabilitar o TLS por completo.
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 de Correção: apache/airflow#63704
A correção substitui verify=False por verify=K8S_CA_CERT_PATH usando o pacote de CAs padrão in-cluster do Kubernetes e substitui ssl=False por um contexto SSL configurado corretamente.
| Data | Evento |
|---|---|
| 2026-03-15 | Vulnerabilidade reportada para [email protected] |
| 2026-03-15 | Jarek Potiuk (committer do Airflow) reconheceu o relato |
| 2026-03-16 | CVE-2026-32794 alocado; PR de correção #63704 aberto |
Este aviso é publicado para fins educacionais e de defesa, de acordo com os princípios de divulgação responsável. As informações fornecidas têm o objetivo de ajudar desenvolvedores e equipes de segurança a entender e corrigir a vulnerabilidade. Não use estas informações para testes não autorizados ou fins maliciosos.
O writeup completo deste projeto, a metodologia e as pesquisas relacionadas estão em:
Criado por Kai Aizen — pesquisador independente de segurança ofensiva.
snailsploit.com · Research · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Mesmo ataque. Substrato diferente.
| Campo | Valor |
|---|
| CVE | CVE-2026-32794 |
| CWE | CWE-295: Validação de Certificado Incorreta |
| Pacote | apache-airflow-providers-databricks (pip) |
| Versões Afetadas | Todas as versões com troca de tokens K8s |
| Versão Corrigida | Pendente (PR #63704) |
| Componente | providers/databricks/src/airflow/providers/databricks/hooks/databricks_base.py |
| Aspecto | Descrição |
|---|
| Impacto Direto | Interceptação MITM dos tokens JWT do K8s e OAuth do Databricks |
| Superfície de Ataque | Qualquer pod dentro da rede do mesmo cluster |
| Roubo de Credenciais | Tokens da conta de serviço do K8s e do Databricks expostos |
| Movimento Lateral | Tokens roubados permitem acesso à API do K8s e ao workspace do Databricks |
| Usuários Afetados | Qualquer implantação do Airflow que use o provider Databricks com troca de tokens K8s |