
تحليل تقني لـ CVE-2025-37899: ثغرة من نوع use-after-free في وحدة ksmbd SMB لنواة لينكس تمكن من تنفيذ التعليمات البرمجية عن بُعد. يتضمن نواقل الهجوم، تقييم الأثر، وإرشادات التصحيح.
تم اكتشاف ثغرة من نوع الاستخدام بعد التحرير في وحدة ksmbd لنواة لينكس، المسؤولة عن تنفيذ بروتوكول SMB (Server Message Block) لمشاركة الملفات عبر الشبكة. قد تسمح هذه الثغرة، المعروفة باسم CVE-2025-37899، بتنفيذ كود عن بعد بامتيازات مرتفعة.
تم الاكتشاف بواسطة الباحث Sean Heelan باستخدام نموذج o3 من OpenAI، مما يوضح إمكانات الذكاء الاصطناعي في تحديد الثغرات المعقدة. تكمن الثغرة في معالجة أمر logoff الخاص بـ SMB2/3 ويمكن استغلالها في ظل ظروف معينة من التزامن.
تحدث ثغرة الاستخدام بعد التحرير عندما يقوم مؤشر ترابط (thread) بتحرير الذاكرة المرتبطة بالكائن sess->user أثناء معالجة أمر logoff. إذا حاول مؤشر ترابط آخر الوصول إلى هذا الكائن المحرر، يحدث حالة تسابق (race condition) قد تؤدي إلى فساد الذاكرة، وربما تنفيذ كود تعسفي.
يوجد الكود الضعيف في الدالة smb2_session_logoff داخل وحدة ksmbd. يؤدي عدم وجود مزامنة مناسبة في الوصول إلى الكائن sess->user إلى إمكانية تحرير الذاكرة بينما لا تزال قيد الاستخدام من قبل مؤشر ترابط آخر.
// Ejemplo simplificado del código vulnerable
void smb2_session_logoff(struct ksmbd_work *work) {
struct smb_session *sess = work->session;
if (sess->user) {
ksmbd_free_user(sess->user); // Liberación de la memoria
sess->user = NULL;
}
}
// Otro hilo podría acceder a sess->user aquí, después de la liberación
يمكن للمهاجم عن بعد استغلال هذه الثغرة عن طريق إرسال سلسلة من أوامر SMB2/3 مصممة لإنشاء حالة تسابق في الوصول إلى الكائن sess->user. يمكن تحقيق ذلك من خلال إنشاء اتصالات SMB متعددة والتلاعب بإنهاء الجلسة ليتزامن مع الوصول المتزامن إلى الكائن.
قد يسمح الاستغلال الناجح لهذه الثغرة للمهاجم بما يلي:
التصحيحات يوصى بتطبيق تصحيحات الأمان المقدمة من توزيعة لينكس الخاصة بك في أقرب وقت ممكن. تعمل التوزيعات الرئيسية بالفعل على نشر التحديثات.
// Después (arreglado)
void smb2_session_logoff(struct ksmbd_work *work) {
struct smb_session *sess = work->session;
spin_lock(&sess->user_lock); // Lock para proteger el acceso concurrente
if (sess->user) {
ksmbd_free_user(sess->user);
sess->user = NULL;
}
spin_unlock(&sess->user_lock); // Unlock después de la operación
}
أيضًا، في الدوال التي تصل إلى sess->user، يجب حمايتها أيضًا:
// Ejemplo de acceso seguro en otra función
void smb2_check_user_session(struct smb_session *sess) {
spin_lock(&sess->user_lock);
if (sess->user) {
// Acceso seguro a sess->user
// ...
}
spin_unlock(&sess->user_lock);
}
في حال عدم القدرة على تطبيق التصحيحات فورًا، يوصى بما يلي:
ksmbd إذا لم تكن ضرورية.الشكر لـ Sean Heelan على الاكتشاف ولمجتمع الأمن السيبراني على تعاونهم في تخفيف هذه الثغرة.