Apache Airflow Security
Informações Básicas
Apache Airflow atua como uma plataforma para orquestar e agendar pipelines ou fluxos de dados. O termo "orquestração" no contexto de pipelines de dados significa o processo de organizar, coordenar e gerenciar fluxos de trabalho de dados complexos originados de várias fontes. O objetivo principal 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 aplicativos, 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 aplicativos de big data.
Basicamente, o Apache Airflow permitirá que você agende a execução de código quando algo (evento, cron) acontece.
Laboratório Local
Docker-Compose
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 iniciar um ambiente completo do Apache Airflow com Docker. (Se estiver no MacOS, certifique-se de fornecer pelo menos 6GB de RAM para a máquina virtual do Docker).
Minikube
Uma maneira fácil de executar o Apache Airflow é executá-lo com o minikube:
Configuração do Airflow
O Airflow pode armazenar informações sensíveis em sua configuração ou você pode encontrar configurações fracas em vigor:
Airflow ConfigurationRBAC do Airflow
Antes de começar a atacar o Airflow, você deve entender como funcionam as permissões:
Airflow RBACAtaques
Enumeração do Console Web
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 em
http://<airflow>/connection/list/
Configuração (Informações sensíveis como a
secret_key
e senhas podem ser armazenadas aqui)Listar usuários e funções
Código de cada DAG (que pode conter informações interessantes)
Recuperar Valores de Variáveis
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á-los na GUI em http://<airflow>/variable/list/
.
Por padrão, o Airflow mostrará o valor da variável na GUI, no entanto, de acordo com este é 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 (é necessário ter acesso ao BD), execução de DAG arbitrário, API acessando o endpoint de variáveis (a API precisa estar ativada) e até mesmo a própria GUI! Para acessar esses valores na GUI, basta selecionar as variáveis que deseja acessar e clicar em Ações -> Exportar. Outra maneira é realizar um bruteforce para o valor oculto usando o filtro de pesquisa até encontrá-lo:
Escalação de Privilégios
Se a configuração expose_config
estiver definida como True, a partir da função de Usuário e acima pode ler a configuração na web. Nesta 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.
Backdoor do DAG (RCE no worker do Airflow)
Se você tem acesso de escrita ao local onde os DAGs são salvos, você pode simplesmente criar um que irá enviar a você um shell reverso. Observe que este shell reverso será executado dentro de um container do worker do airflow:
Backdoor do DAG (RCE no agendador do Airflow)
Se você definir algo para ser executado na raiz do código, no momento desta escrita, ele será executado pelo agendador após alguns segundos após ser colocado dentro da pasta do DAG.
Criação de DAG
Se você conseguir comprometer uma máquina dentro do cluster DAG, você pode criar novos scripts DAGs na pasta dags/
e eles serão replicados no restante das máquinas dentro do cluster DAG.
Injeção de Código DAG
Ao executar um DAG a partir da GUI, você pode passar argumentos para ele. Portanto, se o DAG não estiver codificado corretamente, ele poderá ser vulnerável à Injeção de Comandos. Foi o que aconteceu neste CVE: https://www.exploit-db.com/exploits/49927
Tudo o que você precisa saber para começar a procurar injeções de comandos em DAGs é que os parâmetros são acessados com o código dag_run.conf.get("nome_do_parametro")
.
Além disso, a mesma vulnerabilidade pode ocorrer com variáveis (observe que, com privilégios suficientes, você poderia controlar o valor das variáveis na GUI). As variáveis são acessadas com:
Se forem usados, por exemplo, dentro de um comando bash, você poderia realizar uma injeção de comando.
Last updated