CVE-2026-89665المعلومات

الملخص

بحسب VulDB • 11/09/2026

في نواة Linux، تم إصلاح الثغرة التالية:

nfsd: رفض قيم useconds خارج النطاق في عمليات NFSv2 SETATTR/CREATE

يقوم فك ترميز sattr الخاص بـ NFSv2 بتحويل قيم usecomings المرسلة عبر الشبكة إلى نانوثوانٍ (nanoseconds) داخل الدالة svcxdr_decode_sattr():

iap->ia_atime.tv_nsec = tmp2 * NSEC_PER_USEC;

حيث أن tmp2 هو متغير من النوع u32 و NSEC_PER_USEC يساوي 1000، وبالتالي يتم حساب الناتج باستخدام نوع unsigned long. في بيئة ILP32 التي تكون فيها هذه الأنواع بعرض 32 بتاً، فإن قيمة useconds خارج النطاق مثل 4294968 تقوم بعملية wrap (التفاف) لتصبح tv_nsec == 704. يحدث الفساد لذلك أثناء عملية فك الترميز (decode)، قبل أن تتمكن أي دالة proc من فحص القيمة، وفحص نطاق لاحق لـ tv_nsec سيرى نتيجة ضمن النطاق ويقبلها. يؤدي الرفض في فك الترميز إلى رد RPC GARBAGE_ARGS. لا يحدد NFSv2 خطأ NFSERR_INVAL، لذا لا يوجد حالة (status) على مستوى NFS لإرجاعها عند وجود وسيطة وقت مشوهة، ولا يمكن نقل الفحص إلى دالة proc بالطريقة التي تقوم بها فحوصات نطاق nsec في الإصدارات v3/v4.

يتم حماية قيم useconds الخام قبل عملية الضرب ورفض القيم الأكبر من 1000000. يتم الاحتفاظ بقيمة useconds == 1000000: فهي الاتفاقية الخاصة بـ Sun لـ "تعيين الوقت إلى وقت الخادم الحالي"، ويقوم عميل NFSv2 الخاص بلينكس الموجود داخل الشجرة (in-tree) بإرسالها في كل من حقل atime وحقل mtime عند إجراء عملية touch / utimes(file, NULL) عادية (انظر encode_sattr() و xdr_encode_current_server_time() في fs/nfs/nfs2xdr.c). كان رفض 1000000 سيحول هذه العملية الشائعة إلى فشل حاسم في فك الترميز لكل من SETATTR و CREATE. القيمة 1000000 * NSEC_PER_USEC تساوي 10^9، وهي لا تقوم بعملية wrap على ILP32، لذا تمر قيمة اتفاقية Sun بأمان. يتم رفض القيم الخارجة عن النطاق حقاً (> 1000000) فقط. لذلك تكون حواجز atime و mtime متماثلة (symmetric).

كان فك الترميز يطبق اتفاقية Sun في كتلة mtime فقط، والتي تقوم بمسح ATTR_ATIME_SET|ATTR_MTIME_SET عندما تكون useconds الخاصة بـ mtime == 1000000. إذا وضع العميل قيمة 1000000 في حقل atime ولكن ليس في حقل mtime، فإن كتلة atime كانت تخزن tv_nsec خارج النطاق (10^9) وتترك ATTR_ATIME_SET مفعلاً، مما سمح للقيمة الزائفة بالوصول إلى نظام الملفات. يتم تطبيق الاتفاقية أيضاً في كتلة atime، بمسح ATTR_ATIME_SET بحيث يستخدم الخادم وقته الحالي ويتجاهل القيمة. يتم مسح ATTR_ATIME_SET فقط هناك. تحتفظ كتلة mtime بسلوكها الحالي، حيث تعني 1000000 "تعيين كل من atime وmtime إلى الوقت الحالي".

[ cel: تحسينات متنوعة، إضافات، وتنظيفات ]

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

المصادر

Interested in the pricing of exploits?

See the underground prices here!