Apache Airflow Security
Основна інформація
Apache Airflow служить платформою для оркестрування та планування потоків даних або робочих процесів. Термін "оркестрування" в контексті потоків даних означає процес організації, координації та управління складними потоками даних, що походять з різних джерел. Основна мета цих оркестрованих потоків даних - забезпечити оброблені та споживні набори даних. Ці набори даних широко використовуються безліччю додатків, включаючи, але не обмежуючись, засоби бізнес-аналітики, моделі науки про дані та машинного навчання, які є основою функціонування додатків для великих обсягів даних.
Основна ідея полягає в тому, що Apache Airflow дозволить вам планувати виконання коду, коли відбувається щось (подія, cron).
Локальна лабораторія
Docker-Compose
Ви можете використовувати файл конфігурації docker-compose з https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml для запуску повноцінного середовища Apache Airflow у контейнері Docker. (Якщо ви в MacOS, переконайтеся, що ви надали принаймні 6 ГБ оперативної пам'яті віртуальній машині Docker).
Minikube
Один з простих способів запустити Apache Airflow - це запустити його за допомогою minikube:
Налаштування Airflow
Airflow може зберігати чутливу інформацію у своїй конфігурації або ви можете знайти слабкі налаштування:
pageAirflow ConfigurationAirflow RBAC
Перед тим як атакувати Airflow, вам слід зрозуміти як працюють дозволи:
pageAirflow RBACАтаки
Перелік веб-консолі
Якщо у вас є доступ до веб-консолі, ви можете мати доступ до наступної інформації:
Змінні (Тут може бути збережена користувацька чутлива інформація)
Підключення (Тут може бути збережена користувацька чутлива інформація)
Доступ до них за адресою
http://<airflow>/connection/list/
Конфігурація (Чутлива інформація, така як
secret_key
та паролі, може бути збережена тут)Список користувачів та ролей
Код кожного DAG (який може містити цікаву інформацію)
Отримання значень змінних
Змінні можуть бути збережені в Airflow, щоб DAGs могли отримувати їх значення. Це схоже на секрети інших платформ. Якщо у вас є достатньо дозволів, ви можете отримати до них доступ у GUI за адресою http://<airflow>/variable/list/
.
За замовчуванням Airflow покаже значення змінної у GUI, однак, згідно з цим, можна встановити список змінних, значення яких буде відображатися у вигляді зірочок у GUI.
Однак ці значення все ще можна отримати через CLI (потрібен доступ до БД), довільне виконання DAG, API, звертаючись до кінцевої точки змінних (API повинен бути активований), і навіть сам GUI! Щоб отримати доступ до цих значень з GUI, просто виберіть змінні, до яких ви хочете отримати доступ, і натисніть Дії -> Експорт. Інший спосіб - виконати bruteforce для прихованого значення, використовуючи пошукове фільтрування, поки ви його не отримаєте:
Підвищення привілеїв
Якщо конфігурація expose_config
встановлена в True, від ролі Користувач та вище можуть читати конфігурацію у веб-інтерфейсі. У цій конфігурації з'являється secret_key
, що означає, що будь-який користувач з цим валідним ключем може створити свій власний підписаний кукі для імітації облікового запису будь-якого іншого користувача.
Задній двері DAG (RCE в робочому процесі Airflow)
Якщо у вас є доступ на запис до місця, де зберігаються DAG, ви можете просто створити один, який буде надсилати вам зворотний shell. Зверніть увагу, що цей зворотний shell буде виконуватися всередині контейнера робочого процесу Airflow:
Задній двері DAG (RCE в планувальнику Airflow)
Якщо ви встановите щось для виконання в корені коду, на момент написання цього, це буде виконано планувальником через кілька секунд після розміщення його в папці DAG.
Створення DAG
Якщо вам вдалося зламати машину всередині кластера DAG, ви можете створити нові скрипти DAG у папці dags/
, і вони будуть репліковані на решті машин всередині кластера DAG.
Впровадження коду DAG
Коли ви виконуєте DAG з GUI, ви можете передавати аргументи до нього. Отже, якщо DAG не правильно закодований, він може бути уразливим для Впровадження Команд. Так сталося у цьому CVE: https://www.exploit-db.com/exploits/49927
Все, що вам потрібно знати, щоб почати шукати впровадження команд в DAG, це те, що параметри доступні за допомогою коду dag_run.conf.get("param_name")
.
Більше того, така ж уразливість може виникнути з змінними (зверніть увагу, що за достатньо привілеїв ви можете контролювати значення змінних в GUI). Змінні доступні за допомогою:
Якщо вони використовуються, наприклад, всередині команди bash, ви можете виконати впровадження команд.
Last updated