Apache Airflow Security
Podstawowe informacje
Apache Airflow służy jako platforma do orkiestracji i harmonogramowania potoków danych lub prac. Termin "orkiestracja" w kontekście potoków danych oznacza proces organizowania, koordynowania i zarządzania złożonymi potokami danych pochodzącymi z różnych źródeł. Głównym celem tych zorchestrowanych potoków danych jest dostarczanie przetworzonych i konsumowalnych zbiorów danych. Te zbiory danych są szeroko wykorzystywane przez szereg aplikacji, w tym między innymi narzędzia do inteligencji biznesowej, modele nauki danych i uczenia maszynowego, które są podstawą działania aplikacji big data.
W skrócie, Apache Airflow pozwoli Ci harmonogramować wykonanie kodu, gdy coś (zdarzenie, cron) się dzieje.
Lokalne laboratorium
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 dockerowe Apache Airflow. (Jeśli korzystasz z systemu MacOS, upewnij się, że przypisujesz co najmniej 6 GB pamięci RAM do maszyny wirtualnej docker).
Minikube
Jednym prostym sposobem uruchomienia Apache Airflow jest uruchomienie go z minikube:
Konfiguracja Airflow
Airflow może przechowywać informacje poufne w swojej konfiguracji lub można znaleźć słabe konfiguracje:
pageAirflow ConfigurationRBAC Airflow
Zanim zaczniesz atakować Airflow, powinieneś zrozumieć jak działają uprawnienia:
pageAirflow RBACAtaki
Wyliczanie Konsoli Sieciowej
Jeśli masz dostęp do konsoli sieciowej, możesz mieć dostęp do niektórych lub wszystkich następujących informacji:
Zmienne (Tutaj mogą być przechowywane niestandardowe informacje poufne)
Połączenia (Tutaj mogą być przechowywane niestandardowe informacje poufne)
Dostęp do nich pod adresem
http://<airflow>/connection/list/
Konfiguracja (Informacje poufne, takie jak
secret_key
i hasła, mogą być przechowywane tutaj)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 DAGi mogły uzyskać dostęp do ich wartości. Jest to podobne do tajemnic innych platform. Jeśli masz wystarczające uprawnienia, możesz uzyskać do nich dostęp w interfejsie graficznym pod adresem http://<airflow>/variable/list/
.
Domyślnie Airflow pokaże wartość zmiennej w interfejsie graficznym, jednak, zgodnie z tym, można ustawić listę 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), wykonania arbitralnego DAGa, dostępu do API poprzez dostęp do punktu końcowego zmiennych (API musi być aktywowane), a nawet samemu GUI! Aby uzyskać dostęp do tych wartości z GUI, po prostu wybierz zmienne, do których chcesz uzyskać dostęp, i kliknij Akcje -> Eksport. Innym sposobem jest wykonanie bruteforce do ukrytej wartości, korzystając z filtracji wyszukiwania, aż ją znajdziesz:
Eskalacja Uprawnień
Jeśli konfiguracja expose_config
jest ustawiona na True, od roli Użytkownik i wyżej mogą odczytać konfigurację w sieci. W tej konfiguracji pojawia się secret_key
, co oznacza, że każdy użytkownik z tą ważną wartością może utworzyć własne podpisane ciasteczko, aby podszyć się pod dowolne inne konto użytkownika.
Tylnie drzwi DAG (RCE w Airflow worker)
Jeśli masz dostęp do zapisu w miejscu, gdzie są zapisywane DAGi, możesz po prostu utworzyć taki, który wyśle do Ciebie odwrotną powłokę. Zauważ, że ta odwrotna powłoka zostanie wykonana wewnątrz kontenera airflow worker:
Tylnie drzwi DAG (RCE w harmonogramie Airflow)
Jeśli ustawisz coś do wykonania w głównym katalogu kodu, w chwili pisania tego tekstu, zostanie to wykonane przez harmonogram po kilku sekundach od umieszczenia go wewnątrz folderu DAG.
Tworzenie DAG
Jeśli uda ci się skompromitować maszynę w klastrze DAG, możesz tworzyć nowe skrypty DAG w folderze dags/
, a następnie zostaną one skopiowane na pozostałe maszyny w klastrze DAG.
Wstrzykiwanie Kodu DAG
Podczas wykonywania DAG z interfejsu graficznego, możesz przekazywać do niego argumenty. Dlatego, jeśli DAG nie jest poprawnie napisany, może być podatny na Wstrzykiwanie Poleceń. Tak właśnie stało się w przypadku tego CVE: https://www.exploit-db.com/exploits/49927
Wszystko, co musisz wiedzieć, aby rozpocząć poszukiwania wstrzykiwania poleceń w DAG, to to, że parametry są odczytywane za pomocą kodu dag_run.conf.get("nazwa_parametru")
.
Co więcej, ta sama podatność może wystąpić w przypadku zmiennych (zauważ, że posiadając wystarczające uprawnienia, możesz kontrolować wartość zmiennych w interfejsie graficznym). Zmienne są odczytywane za pomocą:
Jeśli są używane na przykład w poleceniu bash, można przeprowadzić wstrzyknięcie poleceń.
Last updated