PyYAML में CVE-2020-14343 के लिए नियंत्रित भेद्यता अनुसंधान और पुनरुत्पादन प्रयोगशाला
यह परियोजना एक नियंत्रित और पृथक Docker वातावरण में CVE-2020-14343 को प्रदर्शित करती है।
लैब में दो वातावरण हैं:
yaml.safe_load() का उपयोग करने वाला एक पैच किया गया वातावरणलैब पूर्ण भेद्यता जीवनचक्र को प्रदर्शित करती है:
इस लैब में उपयोग किया गया पुनरुत्पादन पेलोड जानबूझकर हानिरहित है और केवल एक परीक्षण मार्कर प्रिंट करता है।
| Property | Details |
|---|
| CVE | CVE-2020-14343 |
| Product | PyYAML |
| Affected versions | Versions before 5.4 |
| Fixed version | 5.4 |
| Vulnerability type | Improper Input Validation (CWE-20) |
| Severity | Critical |
| Attack surface | YAML input processed using vulnerable loading functionality |
यह भेद्यता तब होती है जब अविश्वसनीय YAML इनपुट को भेद्य PyYAML लोडिंग कार्यक्षमता का उपयोग करके संसाधित किया जाता है।
PyYAML 5.4 से पहले के संस्करणों ने विशेष रूप से तैयार किए गए 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
| Service | Host Port | Container Port | PyYAML | Purpose |
|---|---|---|---|---|
| vulnerable | 5000 | 5000 | 5.3.1 | Vulnerable environment |
| patched | 5001 | 5000 | 5.4 | Remediated environment |
cve-2020-14343-lab/
│
├── vulnerable/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
│
├── patched/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
│
├── exploit/
│ └── reproduce.py
│
├── detection/
│ └── detect.py
│
├── docker-compose.yml
└── README.md
| File/Directory | Purpose |
|---|---|
vulnerable/app.py | Flask application using vulnerable YAML loading |
vulnerable/Dockerfile | Builds the vulnerable Docker image |
vulnerable/requirements.txt | Pins PyYAML to 5.3.1 |
patched/app.py | Flask application using secure YAML loading |
patched/Dockerfile | Builds the patched Docker image |
patched/requirements.txt | Pins PyYAML to 5.4 |
exploit/reproduce.py | Reproduces the vulnerability using a controlled payload |
detection/detect.py | Checks the PyYAML version inside a Docker container |
docker-compose.yml | Builds and runs both environments |
निम्नलिखित सॉफ़्टवेयर आवश्यक है:
लैब शुरू करने से पहले Docker Desktop चल रहा होना चाहिए।
भेद्य एप्लिकेशन जानबूझकर केवल Docker पोर्ट मैपिंग के माध्यम से स्थानीय मशीन पर उजागर किया गया है।
प्रोजेक्ट रूट निर्देशिका से, चलाएँ:
docker compose up --build -d
चलाएँ:
docker compose ps
दोनों सेवाओं को Up दिखाना चाहिए।
खोलें:
http://127.0.0.1:5000
अपेक्षित प्रतिक्रिया:
{
"message": "CVE-2020-14343 vulnerable YAML parser"
}
खोलें:
http://127.0.0.1:5001
अपेक्षित प्रतिक्रिया:
{
"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.
Docker Container
|
v
docker exec
|
v
Import PyYAML
|
v
Read yaml.__version__
|
v
Compare with 5.4
|
+----------------------+
| |
< 5.4 >= 5.4
| |
v v
VULNERABLE PATCHED
स्क्रिप्ट लक्ष्य कंटेनर से स्थापित PyYAML संस्करण को क्वेरी करती है।
भेद्य वातावरण उपयोग करता है:
PyYAML==5.3.1
पैच किया गया वातावरण उपयोग करता है:
PyYAML==5.4
पैच किया गया एप्लिकेशन इसके बजाय:
yaml.safe_load(yaml_input)
का उपयोग करता है:
yaml.load(yaml_input, Loader=yaml.FullLoader)
yaml.safe_load() का उपयोग करें।वही एक्सप्लॉइट पेलोड पैच किए गए एप्लिकेशन के विरुद्ध परीक्षण किया जाता है।
पैच किया गया एप्लिकेशन यहाँ चलता है:
http://127.0.0.1:5001/parse
चलाएँ:
python exploit/reproduce.py http://127.0.0.1:5001/parse
इस लैब में देखा गया परिणाम:
HTTP Status: 400
Server Response:
{"message":"could not determine a constructor for the tag 'tag:yaml.org,2002:python/object/new:tuple' ...","status":"error"}
Python-विशिष्ट YAML टैग पैच किए गए एप्लिकेशन द्वारा अस्वीकार कर दिया जाता है।
नियंत्रित परीक्षण मार्कर पैच किए गए एप्लिकेशन में निष्पादित नहीं होता है।
| Test | Vulnerable Environment | Patched Environment |
|---|---|---|
| PyYAML version | 5.3.1 | 5.4 |
| Detection | VULNERABLE | PATCHED |
| Exploit request | HTTP 200 | HTTP 400 |
| Python-specific YAML tag | Accepted | Rejected |
| Test marker execution | Observed in container logs | Not executed |
सुनिश्चित करें कि Docker Desktop चल रहा है और सत्यापित करें:
docker version
जाँचें:
docker ps -a
यदि आवश्यक हो तो पुराने कंटेनर हटाएँ:
docker rm cve-vulnerable cve-patched
फिर:
docker compose up --build -d
docker compose ps
docker logs cve-vulnerable
docker logs cve-patched
docker compose up --build -d
स्वच्छ पुनर्निर्माण के लिए:
docker compose build --no-cache
docker compose up -d
यह परियोजना एक नियंत्रित प्रूफ-ऑफ-कॉन्सेप्ट लैब है और उत्पादन तैनाती का प्रतिनिधित्व नहीं करती है।
सीमाओं में शामिल हैं:
परियोजना सबमिशन के लिए निम्नलिखित साक्ष्य एकत्र किए जाने चाहिए:
STATUS: VULNERABLE दिखा रहा है।CVE-2020-14343-TEST मार्कर।STATUS: PATCHED दिखा रहा है।स्क्रीनशॉट यहाँ संग्रहीत किए जा सकते हैं:
screenshots/
इस रिपॉजिटरी में सभी पुनरुत्पादन कोड और दस्तावेज़ विशेष रूप से इस लैब के लिए विकसित किए गए थे।
यह लैब CVE-2020-14343 को पहचान से उपचार तक प्रदर्शित करती है।
भेद्य वातावरण PyYAML 5.3.1 का उपयोग करता है और एक तैयार किए गए YAML पेलोड के माध्यम से नियंत्रित कोड निष्पादन प्रदर्शित करता है।
पता लगाने की स्क्रिप्ट भेद्य निर्भरता संस्करण की पहचान करती है।
उपचारित वातावरण PyYAML को 5.4 में अपग्रेड करता है और अविश्वसनीय YAML को संसाधित करने के लिए yaml.safe_load() का उपयोग करता है।
वही पुनरुत्पादन पेलोड फिर पैच किए गए एप्लिकेशन द्वारा अस्वीकार कर दिया जाता है, जो उपचार का पहले-और-बाद का साक्ष्य प्रदान करता है।
संपूर्ण वातावरण Docker Compose का उपयोग करके पुन: उत्पन्न किया जा सकता है।