
CVE-2026-25604 को प्रदर्शित करने के लिए एक PoC
Apache Airflow के AWS Auth Manager में Host Header Injection से SAML प्रमाणीकरण बायपास
एक हमलावर SAML लॉगिन प्रवाह में दुर्भावनापूर्ण Host हेडर इंजेक्ट कर सकता है, जिससे Assertion Consumer Service (ACS) URL हमलावर के नियंत्रण वाले सर्वर की ओर इंगित हो जाता है। इससे हमलावर मान्य SAML प्रतिक्रियाओं को कैप्चर कर सकता है और उन्हें रीप्ले करके पीड़ित के Airflow इंस्टेंस तक अनधिकृत पहुँच प्राप्त कर सकता है — या विभिन्न एक्सेस नियंत्रणों वाले विभिन्न Airflow इंस्टेंसों में टोकन का पुन: उपयोग कर सकता है।
| पैकेज | प्रभावित | स्थिर (Fixed) |
|---|---|---|
apache-airflow-providers-amazon | 8.0.0 – 9.21.x | 9.22.0 |
CVE-2026-25604: AWS Auth Manager में Origin Validation Error (CWE-346)
AWS Auth Manager में, SAML प्रमाणीकरण का मूल (origin) क्लाइंट द्वारा प्रदान किया गया मान लिया जाता था और वास्तविक इंस्टेंस URL के विरुद्ध सत्यापित नहीं किया जाता था। इससे अन्य इंस्टेंसों से SAML प्रतिक्रिया का पुन: उपयोग करके विभिन्न एक्सेस नियंत्रणों वाले विभिन्न इंस्टेंसों तक पहुँच प्राप्त करना संभव हो गया।
— NVD
| स्रोत | लिंक |
|---|---|
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-25604 |
| Fix PR | https://github.com/apache/airflow/pull/61368 |
Apache Airflow का AWS Auth Manager प्रमाणीकरण के लिए AWS IAM Identity Center के माध्यम से SAML 2.0 का उपयोग करता है। SAML प्रमाणीकरण अनुरोध का निर्माण करते समय, _prepare_flask_request() विधि ACS कॉलबैक URL बनाने के लिए सीधे आने वाले HTTP अनुरोध से Host हेडर पढ़ती है:
# Vulnerable code in aws_auth_manager.py
def _prepare_flask_request(req):
host = req.headers.get("Host", req.host) # <-- Attacker-controlled
if ":" in host:
hostname, port = host.rsplit(":", 1)
else:
hostname = host
port = "443" if req.scheme == "https" else "80"
return {
"http_host": hostname, # Used to build ACS URL
"server_port": port,
...
}
परिणामी http_host और server_port का उपयोग SAML AssertionConsumerService URL बनाने के लिए किया जाता है। चूँकि Identity Provider (IdP) इस URL पर भरोसा करता है, यह प्रमाणित उपयोगकर्ता को — हस्ताक्षरित SAML प्रतिक्रिया के साथ — उस स्थान पर पुनर्निर्देशित करता है जहाँ Host हेडर इंगित करता है।
┌──────────┐ ┌──────────────┐ ┌─────────────┐
│ Attacker │ │ Victim │ │ AWS IAM │
│ │ │ Airflow │ │ Identity │
│ │ │ Instance │ │ Center │
└────┬─────┘ └──────┬───────┘ └──────┬──────┘
│ │ │
│ 1. GET /login │ │
│ Host: evil.com:8080 │ │
│─────────────────────>│ │
│ │ │
│ │ 2. SAML AuthnRequest │
│ │ ACS URL = │
│ │ evil.com:8080/ │
│ │ login_callback │
│ │───────────────────────>│
│ │ │
│ │ 3. User authenticates │
│ │ at IdP login page │
│ │ │
│ 4. IdP redirects │ │
│ SAMLResponse to │<───────────────────────│
│ evil.com:8080 │ │
│<─────────────────────│ │
│ │ │
│ 5. Attacker captures │ │
│ valid SAMLResponse│ │
│ │ │
│ 6. Replay to victim │ │
│ POST /login_callback │
│ with captured │ │
│ SAMLResponse │ │
│─────────────────────>│ │
│ │ │
│ 7. Authenticated! │ │
│<─────────────────────│ │
└──────────────────────┴────────────────────────┘
परिदृश्य A — फ़िशिंग के माध्यम से टोकन चोरी: एक हमलावर एक वैध उपयोगकर्ता को (रिवर्स प्रॉक्सी के माध्यम से स्पूफ़ किए गए Host हेडर के साथ) एक निर्मित लॉगिन लिंक भेजता है। उपयोगकर्ता के IAM Identity Center के साथ प्रमाणित होने के बाद, SAML प्रतिक्रिया हमलावर के सर्वर पर पुनर्निर्देशित हो जाती है। हमलावर इसे वास्तविक Airflow इंस्टेंस के विरुद्ध रीप्ले करता है।
परिदृश्य B — क्रॉस-इंस्टेंस टोकन पुन: उपयोग: मल्टी-टेनेंट या मल्टी-इंस्टेंस Airflow वातावरण में, इंस्टेंस A से एक मान्य SAML प्रतिक्रिया इंस्टेंस B पर रीप्ले की जा सकती है। चूँकि मूल (origin) को वास्तविक इंस्टेंस URL के विरुद्ध कभी सत्यापित नहीं किया जाता, इंस्टेंस B पर विभिन्न एक्सेस नियंत्रण बायपास हो जाते हैं।
CVE-2026-25604-PoC/
├── README.md # This file
└── mock_airflow.py # Mock vulnerable Airflow server
pip install flask python3-saml
AWS Auth Manager दस्तावेज़ीकरण के अनुसार AWS IAM Identity Center में एक SAML 2.0 एप्लिकेशन सेट अप करें:
http://<airflow-host>:<port>/login_callbackaws-auth-manager-saml-clientpython mock_airflow.py <SAML_METADATA_URL> [PORT]
उदाहरण के लिए:
python mock_airflow.py https://portal.sso.us-east-1.amazonaws.com/saml/metadata/XXXX 8080
एक अलग टर्मिनल में, हेरफेर किए गए Host हेडर के साथ SAML लॉगिन आरंभ करें:
curl -v -H "Host: attacker.com:9090" http://127.0.0.1:8080/login
सर्वर AWS IAM Identity Center लॉगिन पृष्ठ पर 302 Redirect के साथ प्रतिक्रिया देता है। SAML AuthnRequest का निरीक्षण करें — AssertionConsumerService URL वैध सर्वर के बजाय attacker.com:9090/login_callback की ओर इंगित करेगा।
नकली Airflow सर्वर कंसोल पर:
[LOGIN] Host header: attacker.com:9090
[DEBUG] http_host=attacker.com, server_port=9090
SAML AuthnRequest अब IdP को निर्देश देता है कि प्रमाणित SAML प्रतिक्रिया attacker.com:9090 पर पहुँचाई जाए, जिससे हमलावर को रीप्ले करने के लिए एक मान्य टोकन मिल जाता है।
airflow/providers/amazon/aws/auth_manager/aws_auth_manager.py — _prepare_flask_request() विधि:
host = request.headers.get("Host", request.host)
यह पंक्ति क्लाइंट द्वारा प्रदान किए गए Host हेडर पर भरोसा करती है, बिना इसे कॉन्फ़िगर किए गए Airflow बेस URL (AIRFLOW__API__BASE_URL) के विरुद्ध सत्यापित किए।
फिक्स (PR #61368, 3 फ़रवरी 2026 को मर्ज) अनुरोध से प्राप्त होस्ट को Airflow कॉन्फ़िगरेशन के मान से प्रतिस्थापित करता है:
- host = request.headers.get("Host", request.host)
+ host = conf.get("api", "base_url")
यह सुनिश्चित करता है कि ACS URL हमेशा प्रशासक द्वारा कॉन्फ़िगर किए गए वास्तविक इंस्टेंस URL से मेल खाता है, भले ही क्लाइंट कोई भी Host हेडर भेजे।
यह proof-of-concept केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण उद्देश्यों के लिए प्रदान किया गया है। इसका उपयोग जिम्मेदारी से और केवल उन्हीं प्रणालियों के विरुद्ध करें जिनके स्वामी आप हैं या जिनके परीक्षण की आपके पास स्पष्ट अनुमति है।
| Fix Commit |
1a86aec |