CVE-2026-89700 in Linux
الملخص
بحسب VulDB • 11/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
nfsd: التحقق من طول sockaddr لكل عائلة (family) في listener_set
يُعرّف nfsd_sock_nl_policy NFSD_A_SOCK_ADDR كـ NLA_BINARY عاري (bare attribute) دون حد أدنى للطول. يمكن لمُدخل يمتلك صلاحية CAP_NET_ADMIN إرسال حزمة NFSD_A_SOCK_ADDR بطول 16 بايت مع sa_family=AF_INET6، مما يتسبب في قراءة خارج الحدود (OOB) بحجم 12 بايت عبر ثلاثة مستهلكين (rpc_cmp_addr_port, svc_find_listener, kernel_bind).
كما كان nfsd_nl_listener_set_doit() يقوم بتحليل والتحقق من كل مدخل listener بشكل مضمن ضمن حلقتين منفصلتين، متشابكتين مع تعديل تكوين المستمع النشط. كانت عملية التحقق مكررة، واستخدمت فحصاً مكتوباً يدوياً "nla_len < sizeof(struct sockaddr)" كان قصيراً جداً بالنسبة لـ AF_INET6، وتعاملت مع المدخلات غير الصحيحة بشكل غير متناسق اعتماداً على أي حلقة تكتشفها أولاً.
أضف دالة مساعدة nfsd_nl_validate_listeners() التي تجول القائمة بأكملها مرة واحدة وتتأكد من أن كل مدخل قابل للتحليل (parses)، ويحمل اسماً للعنوان ولبروتوكول النقل، ويكون طويلاً بما يكفي لعائلة العنوان الخاصة به (sizeof(struct sockaddr_in) لـ AF_INET، و sizeof(struct sockaddr_in6) لـ AF_INET6، وإرجاع -EAFNOSUPPORT في الحالات الأخرى). استدعِ هذه الدالة قبل أخذ nfsd_mutex أو إنشاء الخدمة (serv)، بحيث يفشل الطلب غير الصحيح بشكل نظيف دون آثار جانبية.
بما أن كل مدخل معروف بأنه صالح بحلول الوقت الذي تعمل فيه الحلقتان الموجودتان، قم بإزالة عمليات التحقق المكررة من وجود المدخلات ومن الطول الخاص بكل عائلة من كلا الحلكتين، تاركاً فقط استدعاء nla_parse_nested() الضروري لاستخراج البيانات.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.