
CVE-2021-3156 (Baron Samedit) تقرير وبحث
المؤلف: IJ Baig
التاريخ: 7 يوليو 2026
1.8.2 إلى 1.8.31p2، والإصدارات المستقرة 1.9.0 إلى 1.9.5p1.1.9.5p1لتحليل هذه الثغرة بأمان، تم تجميع إصدار Sudo المعرّض للثغرة داخل بيئة معزولة وغير إنتاجية.

تم تنزيل الكود المصدري لإصدار Sudo 1.9.5p1 وتجميعه محليًا باستخدام أدوات make القياسية. تم الحرص على تشغيل ذلك من دليل محلي حتى لا يستبدل ثنائي sudo الأصلي المحدّث في النظام المضيف.

تأكيد البناء: بعد التجميع، تم تنفيذ الثنائي المخصص للتحقق من أن الإصدار المعرّض للثغرة الصحيح قد تم بناؤه.


plugins/sudoers/sudoers.cset_cmnd() (حوالي السطر 864 في الإصدار 1.9.5p1)
تخيّل أن لديك مساعدًا وظيفته إزالة أحرف الهروب (الشرطات المائلة للخلف) من قائمة الكلمات قبل وضعها في صندوق تخزين مخصّص حديثًا (مخزن مؤقت في الكومة). يفترض المساعد افتراضًا أعمى أن كل شرطة مائلة للخلف دائمًا يليها حرف صالح، لذلك كلما رأى شرطة مائلة للخلف، يتخطّاها وينسخ الحرف التالي.
ومع ذلك، يوجد خلل في كيفية تعامل البرنامج مع الوسائط عند تشغيل sudoedit -s. فهو يسمح للمستخدم بإدخال كلمة تنتهي تمامًا بشرطة مائلة للخلف واحدة (\)، يليها مباشرة علامة نهاية الكلمة غير المرئية (فاصل فارغ، \0).
عندما يصل كود المساعد إلى هذه الشرطة المائلة للخلف في النهاية، يتخطّاها وينظر إلى الحرف التالي — الفاصل الفارغ. بدلاً من التوقف، يجبر منطق عبارة if المساعد على تخطي الفاصل الفارغ أيضًا. تستمر الحلقة في النسخ، وتنسخ أي ذاكرة عشوائية خارج النطاق تأتي بعد ذلك إلى صندوق التخزين. هذا النسخ المستمر بما يتجاوز طول الكلمة المقصود يفيض على المخزن المؤقت المخصص، مما يؤدي إلى تجاوز سعة مخزن مؤقت شديد في الكومة.
مقتطف الكود المعرّض للثغرة:
/* Unescape characters, skipping over backslashes */
for (to = user_args, av = NewArgv + 1; (from = *av); av++) {
while (*from) {
// VULNERABILITY: If from[0] is '\' and from[1] is '\0',
// the loop evaluates to true, increments 'from', skipping the null terminator.
if (from[0] == '\\' && !isspace((unsigned char)from[1]))
from++;
*to++ = *from++;
}
*to++ = ' ';
}
*--to = '\0';
أصلح مطوّرو Sudo هذا الخطأ المنطقي في الإصدار 1.9.5p2 بإضافة فحص صارم للحدود. يضمن الكود الآن صراحةً أن الحرف الذي يلي الشرطة المائلة للخلف ليس الفاصل الفارغ قبل محاولة إلغاء هربه.
فرق التصحيح:
- if (from[0] == '\\' && !isspace((unsigned char)from[1]))
+ if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))
لماذا يصلح هذا السبب الجذري:
إضافة from[1] != '\0' توقف فورًا القراءة خارج النطاق. الآن، إذا واجه الكود شرطة مائلة للخلف في نهاية السلسلة تمامًا (بمعنى أن from[1] هو الفاصل الفارغ)، يتم تقييم عبارة if على أنها خاطئة. لا يتم زيادة المؤشر قبل الأوان، ويُعالَج الفاصل الفارغ بشكل صحيح كنهاية للسلسلة، وتنتهي الحلقة بأمان دون تجاوز سعة الكومة.
لإعادة الإنتاج هذه، تم استخدام استغلال Python المعترف به على نطاق واسع والذي طوّره باحث الأمن Worawit (تحديدًا نسخة exploit_nss.py).
قبل تنفيذ PoC، من الضروري فهم آليته. لا يقوم السكربت ببساطة بتعطيل البرنامج؛ بل ينظّم تلاعبًا دقيقًا للغاية بالذاكرة لتحقيق تنفيذ الكود.
فيما يلي تفصيل خطوة بخطوة لعمليات PoC:
.so). صُمّمت هذه الحمولة لتنفيذ /bin/sh كجذر.LC_ALL وLANG وTZ). ولأن Sudo يقوم بتحميل متغيرات البيئة إلى الكومة عند بدء التشغيل، يحسب السكربت الأحجام الدقيقة اللازمة لترتيب الكومة بتخطيط قابل للتنبؤ.sudoedit -s ويمرر وسيط سطر أوامر ينتهي بشرطة مائلة للخلف واحدة. يؤدي هذا إلى تشغيل ثغرة الإزاحة بواحد التي نوقشت في القسم 2، مما يسبب كتابة خارج النطاق.service_user. تُستخدم هذه البنية من قبل مبدّل خدمة الأسماء (NSS) للبحث عن معلومات النظام.service_user لتشير إلى مكتبة .so الخبيثة التي جُمعت في الخطوة 1. عندما يحاول Sudo البحث عن صلاحيات المستخدم، يقوم بتحميل وتنفيذ مكتبة المهاجم بشكل أعمى، مما يمنح شل جذر.أولاً، تم إجراء اختبار تعطل أساسي لإثبات وجود الثغرة دون تسليحها.

بعد ذلك، تم تنفيذ سكربت Worawit الكامل exploit_nss.py ضد الثنائي المعرّض للثغرة.

للتحقق من الإصلاح الرسمي، تم تنفيذ نفس مشغّل PoC بالضبط ضد ثنائي Sudo المحدّث.
sudoedit -s '\' 2>&1 | grep -q "sudoedit:" && echo "Vulnerable" || echo "Not vulnerable"

Sudo، برنامج إداري قياسي يُستخدم عبر خوادمنا، يحتوي على خلل خطير في كيفية معالجة مدخلات النص التي تحتوي على شرطات مائلة للخلف. من خلال إرسال أمر مشوّه بعناية، يمكن لمهاجم يملك وصول مستخدم أساسي خداع النظام لكتابة بيانات خارج منطقة الذاكرة المخصصة لها. يسمح هذا الخطأ بتجاوز ضوابط الأمان تمامًا والحصول على تحكم إداري كامل وغير مصرح به على الجهاز دون الحاجة إلى كلمة مرور.
التحديات: كان أحد التحديات الأساسية هو هشاشة التلاعب بالكومة. غالبًا ما تفشل حمولات الاستغلال الموجهة لإصدارات معينة من أنظمة التشغيل على أنظمة أخرى لأن مكتبة C القياسية الأساسية (glibc) تدير كتل الذاكرة بشكل مختلف. تطلّب تسليح هذه الثغرة بنجاح فهمًا دقيقًا لمحاذاة الذاكرة وتخطيطات متغيرات البيئة (Heap Feng Shui) الخاصة بالبيئة المستهدفة.
الدروس المستفادة: من منظور الدفاع وعمليات الأمن، عزّز هذا الغوص العميق عدة مفاهيم حرجة:
sudoedit -s المشبوهة التي تنتهي بأحرف هروب يمكن أن تسمح لفريق مركز العمليات الأمنية (SOC) باكتشاف محاولات الاستغلال قبل نشر التصحيح بالكامل عبر البنية التحتية.CVE موازٍ: CVE-2019-14287 (تجاوز أمان Sudo)
ثغرة بارزة أخرى داخل قاعدة كود Sudo نفسها تشترك في نمط سبب جذري مشابه: التحليل والتحقق غير السليمين من مدخلات المستخدم. في CVE-2019-14287، سمح خلل منطقي في كيفية تحليل Sudo لمعرّف المستخدم (UID) للمهاجم بتنفيذ أوامر كجذر بتحديد معرّف المستخدم -1 أو 4294967295.
التوازي: بينما تُعد Baron Samedit (CVE-2021-3156) خلل تلف الذاكرة وCVE-2019-14287 تجاوزًا للتفويض، فإن السبب الجذري في كلتا الحالتين هو فشل في منطق تحليل الوسائط الأولي. تنبع كلتا الثغرات من ثقة Sudo غير الصحيحة وسوء معالجته لوسائط سطر الأوامر في الحالات الحدّية (الشرطات المائلة للخلف اللاحقة مقابل التفافات الأعداد الصحيحة غير المتوقعة) قبل تنفيذ وظائفه المميزة الأساسية.
إعلان السلامة والأخلاقيات: جميع عمليات الاستغلال والاختبار الموضحة في هذا التقرير أُجريت بالكامل داخل جهاز افتراضي محلي معزول ومصرح به. لم يتم استهداف أو التفاعل مع أي أنظمة إنتاج أو شبكات غير مصرح بها أثناء هذا التمرين.