Apache Airflow Security
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Apache Airflow serve como uma plataforma para orquestrar e agendar pipelines de dados ou fluxos de trabalho. O termo "orquestração" no contexto de pipelines de dados significa o processo de organizar, coordenar e gerenciar fluxos de trabalho de dados complexos que se originam de várias fontes. O principal objetivo desses pipelines de dados orquestrados é fornecer conjuntos de dados processados e consumíveis. Esses conjuntos de dados são amplamente utilizados por uma infinidade de aplicações, incluindo, mas não se limitando a ferramentas de inteligência de negócios, ciência de dados e modelos de aprendizado de máquina, todos os quais são fundamentais para o funcionamento de aplicações de big data.
Basicamente, o Apache Airflow permitirá que você agende a execução de código quando algo (evento, cron) acontecer.
Você pode usar o arquivo de configuração docker-compose de https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml para lançar um ambiente docker completo do apache airflow. (Se você estiver no MacOS, certifique-se de dar pelo menos 6GB de RAM para a VM do docker).
Uma maneira fácil de executar o apache airflow é executá-lo com minikube:
O Airflow pode armazenar informações sensíveis em sua configuração ou você pode encontrar configurações fracas em vigor:
Antes de começar a atacar o Airflow, você deve entender como as permissões funcionam:
Se você tiver acesso ao console web, pode ser capaz de acessar algumas ou todas as seguintes informações:
Variáveis (Informações sensíveis personalizadas podem ser armazenadas aqui)
Conexões (Informações sensíveis personalizadas podem ser armazenadas aqui)
Acesse-as em http://<airflow>/connection/list/
Configuração (Informações sensíveis como secret_key
e senhas podem ser armazenadas aqui)
Liste usuários e funções
Código de cada DAG (que pode conter informações interessantes)
As variáveis podem ser armazenadas no Airflow para que os DAGs possam acessar seus valores. É semelhante a segredos de outras plataformas. Se você tiver permissões suficientes, pode acessá-las na GUI em http://<airflow>/variable/list/
.
O Airflow, por padrão, mostrará o valor da variável na GUI, no entanto, de acordo com isso, é possível definir uma lista de variáveis cujo valor aparecerá como asteriscos na GUI.
No entanto, esses valores ainda podem ser recuperados via CLI (você precisa ter acesso ao DB), execução de DAG arbitrário, API acessando o endpoint de variáveis (a API precisa ser ativada) e até mesmo a própria GUI! Para acessar esses valores pela GUI, basta selecionar as variáveis que você deseja acessar e clicar em Ações -> Exportar. Outra maneira é realizar um bruteforce no valor oculto usando o filtro de pesquisa até obtê-lo:
Se a configuração expose_config
estiver definida como True, a partir da função Usuário e acima, pode-se ler a configuração na web. Nessa configuração, a secret_key
aparece, o que significa que qualquer usuário com isso válido pode criar seu próprio cookie assinado para se passar por qualquer outra conta de usuário.
Se você tiver acesso de escrita ao local onde os DAGs são salvos, você pode simplesmente criar um que enviará para você um reverse shell. Observe que este reverse shell será executado dentro de um container de trabalhador airflow:
Se você definir algo para ser executado na raiz do código, no momento da escrita deste texto, ele será executado pelo agendador após alguns segundos depois de colocá-lo dentro da pasta do DAG.
Se você conseguir comprometer uma máquina dentro do cluster DAG, pode criar novos scripts de DAG na pasta dags/
e eles serão replicados no restante das máquinas dentro do cluster DAG.
Quando você executa um DAG pela GUI, pode passar argumentos para ele. Portanto, se o DAG não estiver devidamente codificado, ele pode ser vulnerável a Injeção de Comando. Foi isso que aconteceu neste CVE: https://www.exploit-db.com/exploits/49927
Tudo o que você precisa saber para começar a procurar por injeções de comando em DAGs é que parâmetros são acessados com o código dag_run.conf.get("param_name")
.
Além disso, a mesma vulnerabilidade pode ocorrer com variáveis (note que com privilégios suficientes você poderia controlar o valor das variáveis na GUI). Variáveis são acessadas com:
Se forem usados, por exemplo, dentro de um comando bash, você pode realizar uma injeção de comando.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)