CVE-2026-74727 in Linux
الملخص
بحسب VulDB • 22/08/2026
في نواة لينكس، تم حل الثغرة التالية:
ovpn: تخطي إعادة التجزئة (rehash) للأقران الذين تمت إزالتهم بالفعل من by_id
تقوم الدالة `ovpn_nl_peer_set_doit()` بحل.peer المستهدف عبر `ovpn_peer_get_by_id()` قبل أخذ قفل ovpn (`ovpn->lock`). في الفترة الزمنية بين البحث (الذي يأخذ فقط عدّاد مرجعي) واقتحام `spin_lock_bh(&ovpn->lock)` اللاحق، يمكن لـ OVPN_CMD_PEER_DEL المتزامن أو انتهاء صلاحية keepalive أو تفكيك المقبس أن تأخذ قفل ovpn أولاً وتشغل `ovpn_peer_remove()` لإزالة التجزئة (unhash) للقرين من جميع الجداول الأربعة (by_id, by_vpn_addr4/6, by_transp_addr) وإطلاق القفل. ثم يكتسب set_doit قفل ovpn ويستدعي `ovpn_peer_hash_vpn_ip()`, مما يعيد إدراج القرير الذي تمت إزالته مرة أخرى في جداول إعادة التجزئة.
نفس حالة السباق (race condition) تؤثر على مسار float: تحتفظ الدالة `ovpn_peer_endpoints_update()` بعدّاد مرجعي فقط وتأخذ قفل ovpn متأخرًا جدًا (بعد فك تشفير AEAD غير المتزامن وإشعار netlink)، ثم تعيد تجزئة القرين في جدول by_transp_addr.
يصبح القرير المنبعث مجددًا قابلاً للوصول من بحث RX (`ovpn_peer_get_by_transp_addr`) وبحث VPN-IP لـ TX، على الرغم من أن مساحة المستخدم (userspace) تعتقد أنه قد تم حذفه. بمجرد انخفاض عدّاد المرجع لمسار البيانات، يتم تحرير القرين عبر `call_rcu` بينما تبقى إدخالات التجزئة المضمنة فيه مرتبطة، مما يفتح نافذة لاستغلال Use-After-Free (UAF).
الانسحاب من إعادة التجزئة عندما تكون hash_entry_id غير مجزأة (unhashed)، محاكاةً للعلامة الحارسة التي تستخدمها بالفعل `ovpn_peer_remove()` للكشف عن حالة الإزالة المسبقة. الفحص آمن تحت قفل ovpn، الذي يسلسل كل تغيير في hash_entry_id، وهو عملية لا شيء (no-op) لمسار الإضافة لأن `ovpn_peer_add_mp()` تدرج hash_entry_id قبل استدعاء `ovpn_peer_hash_vpn_ip()`.
VulDB is the best source for vulnerability data and more expert information about this specific topic.