
شرح تقني وإثبات مفهوم (PoC) لثغرة CVE-2026-24009، يوضح تحميل YAML غير الآمن في docling-core ومسارات التخفيف العملية.
يحتوي هذا المستودع على إثبات للمفهوم (PoC) وماسح ضوئي بسيط يوضح CVE-2026-24009، حيث يمكن لـ docling-core تمكين تنفيذ التعليمات البرمجية عند تحميل YAML يتحكم فيه المهاجم في ظل شروط تبعية محددة.
التأثير: تنفيذ تعليمات برمجية عن بُعد (RCE) محتمل أثناء تحليل YAML السلسلة القابلة للاستغلال (كلها مطلوبة):
docling-core >= 2.21.0 و < 2.48.4PyYAML < 5.4 (سلوك المنبع المرتبط بـ CVE-2020-14343)DoclingDocument.load_from_yaml(...) على YAML غير موثوقالإصلاح: ترقية docling-core إلى >= 2.48.4 (التبديل إلى yaml.SafeLoader)
ترقية إلى
PyYAMLيقوم DoclingDocument.load_from_yaml() بإلغاء تسلسل مستند DoclingDocument مُسلسل بصيغة YAML. في الإصدارات القابلة للاستغلال، يقوم بتحميل YAML باستخدام محمّل غير آمن (yaml.FullLoader) عندما يكون PyYAML قابلاً للاستغلال، مما يسمح لمنشئات YAML الخبيثة بتنفيذ التعليمات البرمجية أثناء التحليل (راجع CVE-2020-14343 لمزيد من المعلومات).
docling-core: 2.48.3 (قابل للاستغلال)PyYAML: 5.3.1 (قابل للاستغلال)python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install "docling-core==2.48.3" "PyYAML==5.3.1"
قم بتشغيل:
python check_loader.py
في الإصدارات القابلة للاستغلال، يستخدم load_from_yaml():
data = yaml.load(f, Loader=yaml.FullLoader)
python repro_docling_load.py
السلوك المتوقع:
repro_docling_load.py خطأ ValidationError (متوقع)/tmp/docling_cve_poc_markerيوضح هذا أن التنفيذ حدث أثناء تحليل YAML، قبل فشل DoclingDocument.model_validate(...).
docling-core (موصى به)python -m pip install --upgrade "docling-core==2.48.4"
python check_loader.py
python repro_docling_load.py
المتوقع:
check_loader.py yaml.SafeLoaderPyYAMLترقية PyYAML إلى >= 5.4 تخفف من سلوك المنبع المرتبط بـ CVE-2020-14343.
إذا لم تكن الترقية ممكنة، تجنب تحميل YAML غير الموثوق باستخدام محمّلات غير آمنة. فرض yaml.SafeLoader عند إلغاء تسلسل YAML غير الموثوق.
docling النهائي (تخطيط التبعيات)بينما توجد هذه الثغرة في docling-core، فإن المستهلك الأكثر شيوعًا هو docling. نطاق التبعية الواسع في docling لا يثبت الثغرة بحد ذاته؛ ما يهم هو البيئة المُحلّة (ملفات القفل / الحزم المثبتة) وما إذا كانت مسارات استيراد YAML مستخدمة.
يتضمن هذا المستودع collect_versions.py، الذي يخطط:
docling-core المُعلنة من pyproject.tomldocling-core المثبتة من uv.lock (أو poetry.lock في العلامات الأقدم)من البيانات المستخرجة، فإن إصدارات docling القابلة للاستغلال المحتملة (القيود تسمح بالقابل للاستغلال + القفل يثبت القابل للاستغلال) هي:
>= v2.27.0 و <= v2.57.0هذا مؤشر على حل التبعيات، وليس دليلاً على أن سير عمل
doclingالافتراضي يصل إلىload_from_yaml()على مدخلات غير موثوقة.
repro_docling_load.py — مشغّل PoC بسيطcheck_loader.py — يطبع محمّل YAML المستخدم بواسطة load_from_yaml()scanner/ — ماسح ضوئي بسيط قائم على التبعيات (فحص نقطة النهاية المباشر اختياري)collect_versions.py — أداة مساعدة لربط علامات docling بإصدارات docling-core المثبتة