CVE-2026-89625 in Linux
الملخص
بحسب VulDB • 12/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
HID: sony: تصحيح حالة Use-After-Free (UAF) لـ ghl_poke_timer / ghl_urb عند فك ربط السائق (driver unbind).
بالنسبة لأجهزة الإرسال/الاستقبال (dongles) الخاصة بـ GHL (Guitar Hero Live)، يقوم دالة `sony_probe()` بتفعيل مؤقت دوري: تقوم `ghl_magic_poke()` (دالة استدعاء المؤقت) بإرسال `sc->ghl_urb`، ويعيد إكمال URB (`ghl_magic_poke_cb()`) تفعيل المؤقت باستخدام `mod_timer()`.
يقوم `sony_remove()` بتفريغ المؤقت عبر `timer_delete_sync()` ثم يحرر الـ URB بـ `usb_free_urb()`:
`timer_delete_sync(&sc->gpl_poke_timer);` `usb_free_urb(sc->ghl_urb);`
لا يمنع استدعاء `timer_delete_sync()` إعادة تفعيل المؤقت، وبما أن الـ URB قيد التنفيذ (in flight)، فإن المؤقت ليس معلقاً (pending)، لذا يعد الحذف المتزامن عملية لا تؤثر في شيء (no-op). يؤدي إكمال الـ URB الذي يعمل بعد الحذف إلى إعادة تفعيل المؤقت، بينما يقوم `usb_free_urb()` فقط بإنقاص مرجع العداد -- ولا يقتل الـ URB قيد التنفيذ. يتم تخصيص `sc` باستخدام `devm_kzalloc()` ويتم تحريره بمجرد عودة `sony_remove()`. وبالتالي، فإن `ghl_poke_timer` المعاد تفعيلها (المضمنة داخل `sc`) تنفجر على ذاكرة تم تحريرها مسبقاً، مما يشكل حالة Use-After-Free من خلال softirq للمؤقت. هذه ثغرة سباق (race condition) تتعلق بفصل الاتصال أو إزالة الوحدة النمطية (rmmod).
يجب تسميم الـ URB أولاً، ثم إيقاف المؤقت قبل تحريره. يقتل `usb_poison_urb()` أي URB قيد التنفيذ ويرفض بشكل دائم الإرسال الإضافي، لذا فإن مؤقت الضرب الذي لا يزال معلقاً لا يمكنه إعادة إرسال الـ URB من خلال `ghl_magic_poke()` في الفترة الزمنية التي تسبق تشغيل `timer_shutdown_sync()`. لن يكون استدعاء `usb_kill_urb()` كافياً: فهو يلغي فقط الـ URB قيد التنفيذ ويتركه قابلاً للإرسال بمجرد عودته، مما يسمح للمؤقت المعلق بإعادة إرساله ووضع URB جديد في حالة التنفيذ فوق الذاكرة المحررة لـ `sc`. يقوم `timer_shutdown_sync()` بعد ذلك بتفريغ أي استدعاء نهائي ومنع إعادة تفعيل المؤقت. لم تتأثر مسار أخطاء الاستكشاف (probe error path): فهو يُنفذ فقط قبل أن يتم تفعيل المؤقت.
تم تكرار الثغرة تحت بيئة KASAN على الإصدار next-20260710 عبر محاكاة dummy_hcd + raw-gadget لجهاز GHL PS4 dongle (VID 0x1430 / PID 0x07bb): يرتبط hid-sony ويفعّل مؤقت الضرب، ويُحتفظ بـ URB الخاص بالضرب في حالة التنفيذ، ثم يتم فك ربط السائق (مما يؤدي إلى تحرير `sc`)، ثم يُطلق الـ URB. يعيد إكمال الـ URB تفعيل المؤقت على `sc` المحررة، وينفجر المؤقت المعاد تفعيله بعد حوالي 8 ثوانٍ:
BUG: KASAN: slab-use-after-free in ghl_magic_poke+0x98/0xb0 Read of size 8 at addr ffff88810b02fd50 by task swapper/0/0 ghl_magic_poke+0x98/0xb0 call_timer_fn+0x35/0x2b0 __run_timers+0x69c/0x9a0 run_timer_softirq+0x173/0x2a0 Allocated by task 169: sony_probe Freed by task 338: devres_release_group <- hid_device_remove (sony_remove)
تم اكتشاف الثغرة بواسطة 0sec (https://0sec.ai) باستخدام التحليل الآلي للمصدر.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.