CVE-2026-74677 in Linux
الملخص
بحسب VulDB • 22/08/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
net: usb: ipheth: تصحيح استخدام الذاكرة بعد تحريرها (Use-After-Free) في carrier_work عند فصل الاتصال.
تعيد دالة `ipheth_sndbulk_callback()` جدولة عمل فحص الناقل (`carrier-check work`) لأي حالة URB غير صفرية:
```c else schedule_delayed_work(&dev->carrier_work, 0); ```
لا يوجد ما يربط ذلك بكون الواجهة نشطة (up)، لذا يمكن إعادة تفعيل العمل بعد أن يكون `ipheth_close()` قد قام بتفريغه بالفعل، ويبقى مفعلاً حتى يتم تحرير منطقة البيانات الخاصة لـ netdev التي تضمه.
عند فصل الجهاز مع وجود TX URB قيد التنفيذ، يقوم `ipheth_disconnect()` بتفريغ العمل من خلال سلسلة الاستدعاءات: `unregister_netdev()` -> `ipheth_close()` -> `cancel_delayed_work_sync()`. وبعد ذلك فقط يتم استدعاء `ipheth_kill_urbs()`. تُكمل دالة `usb_kill_urb()` TX URB قيد التنفيذ بإرجاع قيمة `-ENOENT`، مما يؤدي إلى تشغيل `ipheth_sndbulk_callback()` بعد عملية التفريغ وإعادة تفعيل `carrier_work`.
يؤدي نفس الإكمال (completion) أيضًا إلى إعادة تفعيل العمل إذا تم إيقاف الواجهة فقط أثناء وجود TX URB قيد التنفيذ، وبعدها تستمر دالة `ipheth_carrier_check_work()` في جدولة نفسها مرة كل ثانية. لا تقوم `unregister_netdev()` باستدعاء `ipheth_close()` لواجهة تكون بالفعل متوقفة (down)، لذا فلا يوجد ما يقوم بتفريغها عند فصل الجهاز لاحقًا أيضًا.
في الحالتين، يتم تحرير netdev بواسطة `free_netdev()` بينما لا يزال `carrier_work` معلقاً (pending)، وتقوم دالة `ipheth_carrier_check_work()` بالإشارة إلى ذاكرة تم تحريرها بالفعل (dereferences freed memory).
تم ربط العمل بحالة الواجهة بدلاً من متابعة الإكمال: تعطيله في `ipheth_close()` وتمكينه في `ipheth_open()`، بحيث تكون أي استدعاء لـ `schedule_delayed_work()` ناتج عن إكمال URB بلا فائدة (no-op) كلما لم تكن الواجهة نشطة. كما أن `disable_delayed_work_sync()` تنتظر أيضاً مثيلاً قيد التشغيل، لذا فهي تحل محل `cancel_delayed_work_sync()` التي تستبدله تماماً. يبدأ العمل وهو معطل في `ipheth_probe()` بحيث تتوازن عمليات التمكين/التعطيل منذ أول فتح للواجهة.
تم إعادة إنتاج المشكلة باستخدام KASAN على linux-next (الإصدار next-20260731) مع استخدام dummy_hcd و raw-gadget كبديل للجهاز، مما دفع المسار الثاني المذكور أعلاه (حيث تكون الواجهة متوقفة بالفعل، لذا لا يستدعي `unregister_netdev()` دالة `ipheth_close()`): أفاد 15 من أصل 15 عملية إقلاع بدون التصحيح بوجود استخدام للذاكرة بعد تحريرها (slab-use-after-free) في `__run_timers()`، تم تحريرها بواسطة `ipheth_disconnect()` وإعادة تفعيلها من خلال `ipheth_sndbulk_callback()` عبر `queue_delayed_work_on()`. وأبلغ نفس المحفز على نواة تختلف فقط عن طريق هذا التصحيح عن 0 من أصل 15 عملية إقلاع، ولا تزال وظيفة فحص الناقل تعمل بشكل صحيح عبر دورات الفتح/الإغلاق.
يتطلب برنامج إعادة الإنتاج جهاز USB موصولاً يتوقف عن تفريغ bulk OUT، بالإضافة إلى انقطاع الرابط وفصل الجهاز، ويتم تشغيله بصلاحيات الجذر (root). لا يمثل هذا اختراقاً لحدود الامتياز (privilege boundary crossing)، ولم يتم تطوير أي primitive للاستغلال.
اكتُبت بواسطة 0sec (https://0sec.ai).
Once again VulDB remains the best source for vulnerability data.