PyYAML में CVE-2020-14343 के लिए नियंत्रित भेद्यता अनुसंधान और पुनरुत्पादन प्रयोगशाला
यह परियोजना एक नियंत्रित और पृथक Docker वातावरण में CVE-2020-14343 का प्रदर्शन करती है।
लैब में दो वातावरण हैं:
yaml.safe_load() का उपयोग करने वाला एक पैच किया गया वातावरणलैब पूर्ण भेद्यता जीवनचक्र का प्रदर्शन करती है:
इस लैब में उपयोग किया गया पुनरुत्पादन पेलोड जानबूझकर हानिरहित है और केवल एक परीक्षण मार्कर प्रिंट करता है।
| गुण | विवरण |
|---|---|
| CVE | CVE-2020-14343 |
| उत्पाद | PyYAML |
| प्रभावित संस्करण | 5.4 से पहले के संस्करण |
| निश्चित संस्करण | 5.4 |
| भेद्यता प्रकार | अनुचित इनपुट सत्यापन (CWE-20) |
| गंभीरता | गंभीर |
| आक्रमण सतह | असुरक्षित लोडिंग कार्यक्षमता का उपयोग करके संसाधित YAML इनपुट |
| CVSS | 9.3 (CVSS v4, GitHub Advisory) |
यह भेद्यता तब होती है जब अविश्वसनीय YAML इनपुट को असुरक्षित PyYAML लोडिंग कार्यक्षमता का उपयोग करके संसाधित किया जाता है।
5.4 से पहले के PyYAML संस्करणों ने विशेष रूप से तैयार किए गए YAML टैग की अनुमति दी, जिनमें Python-विशिष्ट टैग शामिल हैं जैसे:
!!python/object/new
जब FullLoader का उपयोग किया गया था तब ऑब्जेक्ट निर्माण कार्यक्षमता तक पहुँचने के लिए।
इसलिए एक दुर्भावनापूर्ण YAML दस्तावेज़ अनजाने Python कोड निष्पादन का कारण बन सकता है।
यह समस्या पहले की PyYAML कमजोरी के अपूर्ण फिक्स से संबंधित थी।
PyYAML 5.4 ने मनमाने Python टैग को UnsafeLoader में स्थानांतरित करके CVE-2020-14343 को ठीक किया।
अविश्वसनीय YAML को संसाधित करने वाले अनुप्रयोगों के लिए, यह लैब सुरक्षित लोडिंग दृष्टिकोण के रूप में yaml.safe_load() का भी उपयोग करती है।
लैब में दो पृथक Docker सेवाएँ हैं:
Host Machine
|
+------------+------------+
| |
v v
Vulnerable App Patched App
localhost:5000 localhost:5001
| |
PyYAML 5.3.1 PyYAML 5.4
FullLoader SafeLoader
| |
v v
Payload executes Payload rejected
| सेवा | होस्ट पोर्ट | कंटेनर पोर्ट | PyYAML | उद्देश्य |
|---|---|---|---|---|
| vulnerable | 5000 | 5000 | 5.3.1 | असुरक्षित वातावरण |
| patched | 5001 | 5000 | 5.4 | उपचारित वातावरण |
cve-2020-14343-lab/
├── vulnerable/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
├── patched/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
├── exploit/
│ └── reproduce.py
├── detection/
│ └── detect.py
├── screenshots/
│ ├── 01-docker-compose-running.png
│ ├── 02-vulnerable-detection.png
│ ├── 03-patched-detection.png
│ ├── 04a-vulnerable-request.png
│ ├── 04b-vulnerable-execution-log.png
│ └── 05-patched-exploit-blocked.png
├── blog/
│ └── CVE-2020-14343-Technical-Blog.pdf
├── docker-compose.yml
├── README.md
└── .gitignore
| फ़ाइल/निर्देशिका | उद्देश्य |
|---|---|
vulnerable/app.py | कमज़ोर YAML लोडिंग का उपयोग करने वाला Flask एप्लिकेशन |
vulnerable/Dockerfile | कमज़ोर Docker इमेज बनाता है |
vulnerable/requirements.txt | PyYAML को 5.3.1 पर पिन करता है |
patched/app.py | सुरक्षित YAML लोडिंग का उपयोग करने वाला Flask एप्लिकेशन |
patched/Dockerfile | पैच की गई Docker इमेज बनाता है |
patched/requirements.txt | PyYAML को 5.4 पर पिन करता है |
exploit/reproduce.py | नियंत्रित पेलोड का उपयोग करके कमज़ोरी को पुनः उत्पन्न करता है |
detection/detect.py | Docker कंटेनर के अंदर PyYAML संस्करण की जाँच करता है |
docker-compose.yml | दोनों वातावरणों को बनाता और चलाता है |
screenshots/ | लैब के दौरान कैप्चर किए गए साक्ष्य शामिल हैं |
blog/ | 800–1200 शब्दों वाला तकनीकी ब्लॉग PDF शामिल है |
निम्नलिखित सॉफ़्टवेयर आवश्यक है:
लैब शुरू करने से पहले Docker Desktop चल रहा होना चाहिए।
कमज़ोर एप्लिकेशन को जानबूझकर केवल Docker पोर्ट मैपिंग के माध्यम से स्थानीय मशीन पर ही उजागर किया गया है।
प्रोजेक्ट रूट निर्देशिका से, चलाएँ:
docker compose up --build -d
चलाएँ:
docker compose ps
दोनों सेवाओं को Up दिखाना चाहिए।
खोलें:
http://127.0.0.1:5000
No input content was provided in your message. Please send the Markdown chunk you would like translated, and I will return only the translated text.
{
"message": "CVE-2020-14343 vulnerable YAML parser"
}
खोलें:
http://127.0.0.1:5001
No input content was provided in your message. Please send the Markdown chunk you would like translated, and I will return only the translated text.
{
"message": "CVE-2020-14343 patched YAML parser"
}
docker compose up -d
docker compose down
docker compose up --build -d
docker compose ps
docker logs cve-vulnerable
docker logs cve-patched
भेद्य अनुप्रयोग एक /parse एंडपॉइंट प्रदान करता है जो YAML इनपुट स्वीकार करता है।
भेद्य वातावरण निम्नलिखित का उपयोग करता है:
yaml.FullLoaderपुनरुत्पादन स्क्रिप्ट यहाँ स्थित है:
exploit/reproduce.py
कमज़ोर एप्लिकेशन यहाँ उपलब्ध है:
http://127.0.0.1:5000/parse
चलाएँ:
python exploit/reproduce.py
स्क्रिप्ट एक नियंत्रित YAML पेलोड भेजती है जिसमें Python-विशिष्ट YAML टैग होता है।
कमजोर वातावरण में, पेलोड स्वीकार किया जाता है और एप्लिकेशन HTTP 200 प्रतिक्रिया लौटाता है।
नियंत्रित परीक्षण मार्कर:
CVE-2020-14343-TEST
के अंदर निष्पादित किया जाता है।
docker logs cve-vulnerable
अपेक्षित लॉग आउटपुट में शामिल हैं:
CVE-2020-14343-TEST
यह कमज़ोर YAML लोडिंग व्यवहार के माध्यम से कोड निष्पादन को प्रदर्शित करता है।
पुनरुत्पादन पेलोड जानबूझकर हानिरहित है। यह केवल एक परीक्षण मार्कर प्रिंट करता है और होस्ट सिस्टम को संशोधित नहीं करता, क्रेडेंशियल्स तक पहुँच नहीं करता, संवेदनशील डेटा तक पहुँच नहीं करता, बाहरी सिस्टम के साथ इंटरैक्ट नहीं करता, या विनाशकारी क्रियाएँ नहीं करता।
पहचान स्क्रिप्ट यहाँ स्थित है:
detection/detect.py
स्क्रिप्ट निर्दिष्ट Docker कंटेनर के अंदर इंस्टॉल किए गए PyYAML संस्करण की जाँच करती है।
ठीक किया गया संस्करण यह है:
5.4
चलाएं:
python detection/detect.py cve-vulnerable
अपेक्षित परिणाम:
PyYAML installed version: 5.3.1
Fixed version: 5.4
STATUS: VULNERABLE
Reason: PyYAML version is older than 5.4.
चलाएँ:
python detection/detect.py cve-patched
अपेक्षित परिणाम:
PyYAML installed version: 5.4
Fixed version: 5.4
STATUS: PATCHED
Reason: PyYAML version is 5.4 or newer.