مختبر بحث واستنساخ الثغرات الأمنية المُتحكَّم به لـ CVE-2020-14343 في PyYAML
يوضح هذا المشروع الثغرة CVE-2020-14343 في بيئة Docker معزولة وخاضعة للتحكم.
يحتوي المختبر على بيئتين:
yaml.safe_load()يوضح المختبر دورة حياة الثغرة الكاملة:
حمولة إعادة الإنتاج المستخدمة في هذا المختبر غير ضارة عمدًا وتطبع فقط علامة اختبار.
| الخاصية | التفاصيل |
|---|---|
| CVE | CVE-2020-14343 |
| المنتج | PyYAML |
| الإصدارات المتأثرة | الإصدارات الأقدم من 5.4 |
| الإصدار المُصحّح | 5.4 |
| نوع الثغرة | التحقق غير السليم من المدخلات (CWE-20) |
| الخطورة | حرجة |
| سطح الهجوم | مدخلات YAML تتم معالجتها باستخدام وظيفة التحميل المصابة |
| CVSS | 9.3 (CVSS v4، GitHub Advisory) |
تحدث الثغرة عندما تتم معالجة مدخلات YAML غير موثوقة باستخدام وظيفة تحميل PyYAML المصابة.
سمحت إصدارات PyYAML الأقدم من 5.4 بوسوم YAML مصممة خصيصًا، بما في ذلك وسوم خاصة بـ Python مثل:
!!python/object/new
لتحقيق وظيفة إنشاء الكائنات عند استخدام FullLoader.
لذلك، يمكن لمستند YAML ضار أن يتسبب في تنفيذ غير مقصود لكود Python.
كانت المشكلة مرتبطة بإصلاح غير مكتمل لثغرة سابقة في PyYAML.
أصلح PyYAML 5.4 الثغرة CVE-2020-14343 عن طريق نقل وسوم Python التعسفية إلى UnsafeLoader.
بالنسبة للتطبيقات التي تعالج 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 | تطبيق Flask يستخدم تحميل YAML غير الآمن |
vulnerable/Dockerfile | يبني صورة Docker غير الآمنة |
vulnerable/requirements.txt | يثبّت PyYAML على الإصدار 5.3.1 |
patched/app.py | تطبيق Flask يستخدم تحميل YAML الآمن |
patched/Dockerfile | يبني صورة Docker المُرقّعة |
patched/requirements.txt | يثبّت PyYAML على الإصدار 5.4 |
exploit/reproduce.py | يعيد إنتاج الثغرة باستخدام حمولة مُتحكَّم بها |
detection/detect.py | يتحقق من إصدار PyYAML داخل حاوية Docker |
docker-compose.yml | يبني ويشغّل كلا البيئتين |
screenshots/ | يحتوي على الأدلة التي جُمعت أثناء المختبر |
blog/ | يحتوي على ملف PDF للمدونة التقنية من 800 إلى 1200 كلمة |
البرمجيات التالية مطلوبة:
يجب أن يكون Docker Desktop قيد التشغيل قبل بدء المختبر.
التطبيق غير الآمن مكشوف عمدًا على الجهاز المحلي فقط عبر تعيينات منافذ Docker.
من الدليل الجذر للمشروع، شغّل:
docker compose up --build -d
شغّل:
docker compose ps
يجب أن يُظهر كلا الخدمتين حالة Up.
افتح:
http://127.0.0.1:5000
لا يوجد محتوى نصي مُرفق في رسالتك لترجمته. يرجى إرسال الجزء الثالث عشر (13/89) من محتوى أداة Kitploit المطلوب ترجمته إلى العربية.
{
"message": "CVE-2020-14343 vulnerable YAML parser"
}
افتح:
http://127.0.0.1:5001
لا يوجد محتوى نصي مُرفق في رسالتك لترجمته. يرجى إرسال الجزء الثالث عشر (13/89) من محتوى أداة Kitploit المطلوب ترجمته إلى العربية.
{
"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 مُتحكَّمًا بها تحتوي على وسم YAML خاص بـ Python.
في البيئة القابلة للاستغلال، تُقبل الحمولة ويُعيد التطبيق استجابة HTTP 200.
علامة الاختبار المُتحكَّم بها:
CVE-2020-14343-TEST
يُنفَّذ داخل حاوية التطبيق المعرّضة للثغرة.
يمكن التحقق من التنفيذ باستخدام:
docker logs cve-vulnerable
يتضمن مخرجات السجل المتوقعة:
CVE-2020-14343-TEST
هذا يوضح تنفيذ الشيفرة من خلال سلوك تحميل YAML القابل للاستغلال.
حمولة إعادة الإنتاج غير ضارة عمدًا. فهي تطبع علامة اختبار فقط ولا تعدّل نظام المضيف، ولا تصل إلى بيانات الاعتماد، ولا تصل إلى البيانات الحساسة، ولا تتفاعل مع أنظمة خارجية، ولا تنفّذ إجراءات مدمّرة.
يقع سكربت الكشف في:
detection/detect.py
يتحقق السكربت من إصدار PyYAML المثبّت داخل حاوية Docker المحددة.
الإصدار المُصلَّح هو:
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)