
# SpeechBrain < 1.1.1 — تنفيذ التعليمات البرمجية عن بُعد (RCE) عبر بيانات نقاط التحقق (checkpoint metadata) من خلال تحليل غير آمن لملف CKPT.yaml بواسطة PyYAML.
الخطورة: عالية، CVSS 4.0 8.7، CVSS 3.1 8.8 (مُعيَّنة بواسطة VulnCheck، الجهة المانحة لمعرّفات CVE)
المتجه (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
المتجه (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
المتأثر: SpeechBrain < 1.1.1
تم الإصلاح في: 1.1.1 / الالتزام 22a6166
CWE: CWE-502 (إلغاء تسلسل البيانات غير الموثوقة)
تم اكتشافه والإبلاغ عنه بواسطة: Sai Teja Erukude
تاريخ النشر: 27 أغسطس 2026
يستخدم SpeechBrain قبل الإصدار 1.1.1 محمّل PyYAML غير الآمن عند تحليل بيانات
وصف نقطة الاستعادة (checkpoint) الخاصة بـ CKPT.yaml أثناء استعادة نقاط الاستعادة.
يمكن للمهاجم القادر على توفير أو تعديل دليل نقطة استعادة SpeechBrain أن يضع
ملف CKPT.yaml خبيثًا داخل دليل نقطة استعادة CKPT*. عندما تستدعي الضحية
Checkpointer.recover_if_possible()، يقوم SpeechBrain بسرد مرشّحات نقاط الاستعادة
ويحلّل بيانات وصف كل مرشّح باستخدام:
yaml.load(fi, Loader=yaml.Loader)
نظرًا لأن yaml.Loader يدعم وسوم إنشاء كائنات Python مثل
!!python/object/apply، فإن بيانات تعريف نقاط التحقق (checkpoint metadata) التي يتحكم فيها المهاجم يمكنها تنفيذ
كود Python أثناء اكتشاف نقاط التحقق.
لا يلزم تحديد نقطة التحقق الخبيثة أو استعادتها. يحدث تنفيذ الكود أثناء قيام SpeechBrain بتعداد مرشحي نقاط التحقق.
قد ينفذ المهاجم كود Python عشوائيًا في سياق عملية Python التي تشغّل SpeechBrain.
قد يؤثر ذلك على سير العمل حيث يقوم المستخدمون بتنزيل أو فك ضغط أو استئناف أو تشغيل التدريب/الاستدلال من أدلة نقاط تحقق غير موثوقة، أو مخرجات النماذج، أو الأرشيفات.
اعتمادًا على العملية المضيفة، قد يسمح ذلك بما يلي:
المكوّن المتأثر هو تدفق استرداد/سرد نقاط التحقق في SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
أثناء سرد نقاط التحقق، يقوم SpeechBrain بفحص الدلائل الفرعية المسماة CKPT* التي تحتوي على CKPT.yaml. يتم تحليل كل ملف بيانات وصفية مرشح قبل الاختيار النهائي لنقطة التحقق.
يحدث التحليل غير الآمن في speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
ينشئ PoC نقطتي تحقق:
CKPT+poisoned-metadata: نقطة تحقق خبيثة أقدم تحتوي CKPT.yaml
الخاصة بها على حمولة PyYAML object-apply.CKPT+benign-newer: نقطة تحقق حديثة حميدة يُفترض أن يتم اختيارها
حسب الأحدثية.يتم اختيار نقطة التحقق الحميدة، لكن بيانات التعريف الخاصة بنقطة التحقق الخبيثة لا تزال تُنفَّذ أثناء سرد المرشحات. يوضح هذا تنفيذ الشيفرة في وقت تحليل بيانات التعريف بشكل مستقل عن استعادة نقطة التحقق.
package_builder.py ينشئ تخطيط نقطة التحقق
الخاضع لسيطرة المهاجم.
run_poc.py يشغّل التحقق، ويستدعي
Checkpointer.recover_if_possible()، ويطبع أدلة التنفيذ.
شغّل في بيئة اختبار محلية فقط:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
الأدلة المتوقعة على الإصدارات القابلة للاستغلال:
speechbrain_version: 1.1.0
installed_package: True
recovery_error: None
benign_checkpoint_selected: True
marker_before_recovery: False
marker_after_recovery: True
marker_contents:
speechbrain_checkpoint_yaml_loader_rce_triggered
success: True
الدليل المهم هو أن benign_checkpoint_selected: True و
marker_after_recovery: True يظهران معًا. هذا يُظهر أن نقطة التحقق الأقدم الخبيثة لم يتم اختيارها للاستعادة، لكن بياناتها الوصفية (metadata) تم تحليلها وتنفيذها رغم ذلك أثناء قيام SpeechBrain بسرد مرشحات نقاط التحقق.
الحمولة غير ضارة عن قصد. فهي تكتب فقط سلسلة العلامة المحلية هذه:
speechbrain_checkpoint_yaml_loader_rce_triggered
إنه لا يُنشئ صدفة (shell)، ولا يتصل بخدمة شبكية، ولا يقرأ أسرارًا، ولا يحذف بيانات، ولا يعدّل ملفات خارج دليل PoC.
قم بالترقية إلى SpeechBrain 1.1.1 أو أحدث.
الإصلاح البرمجي الدائم هو استخدام المُحمّل الآمن (safe loader) الخاص بـ PyYAML لبيانات وصفية خاصة بنقاط التحقق (checkpoint metadata):
yaml.safe_load(fi)
أو:
yaml.load(fi, Loader=yaml.SafeLoader)
بيانات وصفية لنقطة التحقق تحتاج فقط إلى قيم قياسية مثل unixtime و
end-of-epoch، لذلك لا ينبغي تمكين إنشاء كائنات Python لمسار
التحليل هذا.
إذا لم يتوفر تصحيح أو ترقية فورية:
CKPT.yaml أو ارفضها.تم اكتشافه والإبلاغ عنه بواسطة Sai Teja Erukude.
تم تنسيق الإفصاح من خلال VulnCheck.
exploit_walkthrough.md