CVE-2026-63803 in Linuxالمعلومات

الملخص

بحسب VulDB • 19/07/2026

في نواة لينكس، تم حل الثغرة التالية:

hdlc_ppp: مزامنة مؤقتات كل بروتوكول قبل تحرير حالة HDLC

يسجل كل بروتوكول تحكم PPP (LCP/IPCP/IPv6CP) المضمن في البنية `struct ppp` مؤقتًا عبر دالة `timer_setup()`. وتُعد هذه البنية `struct ppp` هي تخصيص ذاكرة لـ `hdlc->state`، والذي تقوم الدالة `detach_hdlc_protocol()` بتحريره باستخدام `kfree()` في كلا مسارَي الإنهاء: `unregister_hdlc_device()` والربط مجددًا داخل `attach_hdlc_protocol()`.

لم يسجل بروتوكول PPP مطلقًا استدعاءً منفصلًا للإفلات (.detach callback)، لذا فإن الدالة `detach_hdlc_protocol()` لا تقوم بمزامنة المؤقتات قبل تنفيذ `kfree()`. عملية الإلغاء الوحيدة، وهي `timer_delete(&proto->timer)` في دالة `ppp_cp_event()`، هي عملية جزئية (لا تنتظر انتهاء استدعاء قيد التنفيذ) ولا تعمل إلا عند الانتقال إلى الحالة ->CLOSED؛ كما أن الدالتان `ppp_stop()/ppp_close()` لا تقومان بالمزامنة أيضًا. يبقى استدعاء مؤقت PPP (`ppp_timer`) الذي كان يعمل بالفعل (مقفلًا على قفل ppp->lock) ساري المفعول بعد تنفيذ `kfree`، ومن ثم يحاول الوصول إلى `proto->state / ppp->lock` في ذاكرة تم تحريرها مسبقًا، مما يؤدي إلى ثغرة استخدام-after-free.

تم إصلاح هذا الخلل بإضافة مساعد .detach يقوم باستدعاء `timer_shutdown_sync()` على كل مؤقت خاص بالبروتوكول. تستدعي الدالة `detach_hdlc_protocol()` الآن `proto->detach(dev)` قبل تنفيذ `kfree(hdlc->state)`، بحيث تعمل `timer_shutdown_sync()` في كلا مسارَي التحرير. تم استخدام `timer_shutdown_sync()` بدلاً من `timer_delete_sync()` لأن مسار الحفاظ على الاتصال (keepalive) يعيد ضبط المؤقت عبر `add_timer()/mod_timer()`, والإيقاف يمنع أي إعادة تنشيط أثناء عملية الإنهاء.

تم تهيئة مؤقتات كل بروتوكول في دالة `ppp_ioctl()` عند ربط البروتوكول، وتم إزالة استدعاء `timer_setup()` الذي لم يعد ضروريًا من دالة `ppp_start()`، بحيث يتم تهيئة المؤقتات مرة واحدة فقط وقت الربط، ولا تعمل الدالة `ppp_timer_release()` أبدًا على هياكل قائمة مؤقت غير مهيأة. نظرًا لأن `attach_hdlc_protocol()` تستخدم `kmalloc()` (وليس `kzalloc`)، فإن بروتوكولات البنية `struct ppp` (`protos[i].timer`) تكون في حالة بيانات عشوائية وغير مهيئة حتى أول استدعاء لـ `timer_setup()`؛ وبدون هذا التهيئة عند الربط، سيؤدي ربط بروتوكول PPP دون رفع الجهاز إلى تشغيل `timer_shutdown_sync()` على ذاكرة غير مهيأة داخل .detach. ونقل عملية التهيئة من دالة `ppp_start()` (التي تعمل فقط عند حدث NETDEV_UP) إلى مسار الربط يجعل التهيئة شرطًا دائمًا ويتجنب تهيئة نفس قائمة المؤقتات مرتين.

تم اكتشاف هذا الخلل باستخدام التحليل الثابت للكود (static analysis).

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

مسؤول

Linux

حجز

19/07/2026

إفشاء

19/07/2026

الاعتدال

تمت الموافقة

إدخال

VDB-380146

EPSS

0.00000

KEV

لا

النشاطات

منخفض

المصادر

Want to stay up to date on a daily basis?

Enable the mail alert feature now!