Apache Airflow Security
Basic Information
Apache Airflow służy jako platforma do orkiestrowania i planowania potoków danych lub przepływów pracy. Termin "orkiestracja" w kontekście potoków danych oznacza proces aranżowania, koordynowania i zarządzania złożonymi przepływami danych pochodzącymi z różnych źródeł. Głównym celem tych orkiestrujących potoków danych jest dostarczenie przetworzonych i nadających się do użycia zbiorów danych. Zbiory te są szeroko wykorzystywane przez wiele aplikacji, w tym, ale nie tylko, narzędzia do analizy biznesowej, modele nauki o danych i uczenia maszynowego, które są podstawą funkcjonowania aplikacji big data.
W zasadzie, Apache Airflow pozwoli Ci zaplanować wykonanie kodu, gdy coś (zdarzenie, cron) się wydarzy.
Local Lab
Docker-Compose
Możesz użyć pliku konfiguracyjnego docker-compose z https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml, aby uruchomić kompletną środowisko docker apache airflow. (Jeśli jesteś na MacOS, upewnij się, że przydzielisz co najmniej 6 GB RAM dla VM docker).
Minikube
Jednym z łatwych sposobów na uruchomienie apache airflow jest uruchomienie go z minikube:
Konfiguracja Airflow
Airflow może przechowywać wrażliwe informacje w swojej konfiguracji lub możesz znaleźć słabe konfiguracje:
Airflow ConfigurationAirflow RBAC
Zanim zaczniesz atakować Airflow, powinieneś zrozumieć jak działają uprawnienia:
Airflow RBACAtaki
Enumeracja konsoli internetowej
Jeśli masz dostęp do konsoli internetowej, możesz uzyskać dostęp do niektórych lub wszystkich następujących informacji:
Zmienne (Własne wrażliwe informacje mogą być tutaj przechowywane)
Połączenia (Własne wrażliwe informacje mogą być tutaj przechowywane)
Uzyskaj do nich dostęp w
http://<airflow>/connection/list/
Konfiguracja (Wrażliwe informacje, takie jak
secret_key
i hasła mogą być tutaj przechowywane)Lista użytkowników i ról
Kod każdego DAG (który może zawierać interesujące informacje)
Pobieranie wartości zmiennych
Zmienne mogą być przechowywane w Airflow, aby DAG mogły uzyskać ich wartości. Jest to podobne do sekretów innych platform. Jeśli masz wystarczające uprawnienia, możesz uzyskać do nich dostęp w GUI w http://<airflow>/variable/list/
.
Airflow domyślnie pokaże wartość zmiennej w GUI, jednak zgodnie z tym możliwe jest ustawienie listy zmiennych, których wartość będzie wyświetlana jako gwiazdki w GUI.
Jednak te wartości mogą być nadal pobrane za pomocą CLI (musisz mieć dostęp do bazy danych), wykonywania dowolnego DAG, API uzyskującego dostęp do punktu końcowego zmiennych (API musi być aktywowane) i nawet samego GUI! Aby uzyskać dostęp do tych wartości z GUI, po prostu wybierz zmienne, do których chcesz uzyskać dostęp i kliknij na Akcje -> Eksportuj. Innym sposobem jest przeprowadzenie bruteforce na ukrytej wartości za pomocą filtrowania wyszukiwania, aż ją uzyskasz:
Eskalacja uprawnień
Jeśli konfiguracja expose_config
jest ustawiona na True, z rolą Użytkownika i wyżej można czytać konfigurację w sieci. W tej konfiguracji pojawia się secret_key
, co oznacza, że każdy użytkownik z tym ważnym kluczem może utworzyć własny podpisany cookie, aby podszyć się pod inne konto użytkownika.
DAG Backdoor (RCE w Airflow worker)
Jeśli masz uprawnienia do zapisu w miejscu, gdzie DAGi są zapisywane, możesz po prostu stworzyć jeden, który wyśle ci reverse shell. Zauważ, że ten reverse shell będzie wykonywany wewnątrz kontenera airflow worker:
DAG Backdoor (RCE w harmonogramie Airflow)
Jeśli ustawisz coś do wykonania w katalogu głównym kodu, w momencie pisania tego tekstu, zostanie to wykonane przez harmonogram po kilku sekundach od umieszczenia go w folderze DAG.
Tworzenie DAG
Jeśli uda ci się skompromentować maszynę w klastrze DAG, możesz stworzyć nowe skrypty DAG w folderze dags/
, a one będą replikowane w pozostałych maszynach w klastrze DAG.
Wstrzykiwanie kodu DAG
Kiedy wykonujesz DAG z GUI, możesz przekazać argumenty do niego. Dlatego, jeśli DAG nie jest odpowiednio zakodowany, może być vulnerable to Command Injection. To właśnie wydarzyło się w tym CVE: https://www.exploit-db.com/exploits/49927
Wszystko, co musisz wiedzieć, aby zacząć szukać wstrzyknięć poleceń w DAGach, to że parametry są dostępne za pomocą kodu dag_run.conf.get("param_name")
.
Ponadto, ta sama podatność może wystąpić z zmiennymi (zauważ, że przy wystarczających uprawnieniach możesz kontrolować wartość zmiennych w GUI). Zmienne są dostępne za pomocą:
Jeśli są używane na przykład wewnątrz polecenia bash, możesz wykonać wstrzyknięcie polecenia.
Last updated