CVE-2026-72473 in Linuxالمعلومات

الملخص

بحسب VulDB • 15/08/2026

في نواة لينكس، تم حل الثغرة التالية:

xprtrdma: فك ارتباط إعادة تدوير الطلبات (req recycling) عن إكمال RPC

كانت rl_kref تخدم في السابق عمري حياة مختلفين من خلال عداد مرجعي واحد: فقد كانت تحدد متى يمكن لرد الإجابة أن يستيقظ مهمة الـ RPC الخاصة بها، ومتى يمكن لعنصر rpcrdma_req العودة إلى مجموعة الموارد الحرة. كان مسار التجميع (marshal path) يأخذ المرجع الخاص بالإرسال فقط عندما تكون عناصر SGE بحاجة إلى إلغاء تعيين DMA (sc_unmap_count > 0)، مما جعل الإرسال الذي يحمل مخازن مؤقتة مسجلة مسبقاً استثناءً: حيث قام معالج الرد بإنقاص rl_kref من 1 إلى 0 وتحرير الطلب بينما كان جهاز HCA قد لا يزال يقرأ عبر DMA من مخزنه المؤقت للإرسال.

أعطِ لـ rl_kref مهمة أضيق نطاقاً. تأخذ طبقة RPC مرجعاً واحداً عندما تقوم عملية تخصيص الشق (slot allocation) بتسليم طلب. وتأخذ rpcrdma_prepare_send_sges() مرجع الإرسال بشكل غير مشروط بعد نجاح تحضير WR. وتقوم دالتا xprt_rdma_free_slot() و xprt_rdma_bc_free_rqst() بإزالة المرجع الخاص بطبقة RPC؛ بينما تقوم rpcrdma_sendctx_unmap() بإزالة مرجع الإرسال. لا يعود الطلب إلى مجموعة الموارد الحرة إلا بعد أن يوقع كلا المالكين على ذلك.

تمت إزالة استدعاء kref_init(&req->rl_kref) الموجود حالياً في rpcrdma_prepare_send_sges(). انتقل التهيئة إلى مسارات تخصيص الشق (xprt_rdma_alloc_slot و rpcrdma_bc_rqst_get)، وقام رد الإطلاق بإعادة تشغيل rl_kref قبل عودة الطلب إلى مجموعة الموارد الحرة. كان من شأن إعادة التهيئة في مسار التجميع أن تتجاهل مرجع طبقة RPC الموجود بالفعل عند الدخول.

تنتج عن ذلك ثلاثة ثوابت (invariants):

- أي rpcrdma_req يتم الاحتفاظ به بواسطة rpc_rqst له rl_kref >= 1. تقوم دالتا xprt_rdma_alloc_slot() و rpcrdma_bc_rqst_get()، وفرع إيقاظ قائمة الانتظار في xprt_rdma_alloc_slot() بـ kref_init لـ rl_kref قبل نشر الطلب. بدون هذا الثابت، كان من شأن مهمة RPC التي تنقطع بين تخصيص الشق والتجميع (مثل فشل gss_refresh أو إشارة أثناء call_connect) أن تدفع استدعاءات xprt_release() -> xprt_rdma_free_slot() -> kref_put مقابل عداد مرجعي يساوي صفراً، مما يؤدي إلى تشبع refcount_t وترك الشق معلقاً.

- يؤخذ مرجع الإرسال فقط بعد نجاح تحضير WR. إذا فشل تعيين في rpcrdma_prepare_send_sges()، يتم تشغيل rpcrdma_sendctx_cancel()، والتي تلغي تعيين DMA لـ sendctx وتقوم بتصفير sc_req دون المساس بـ rl_kref. تتخطى حلقات ring الخاصة بـ sendctx في rpcrdma_sendctx_put_locked() و rpcrdma_sendctxs_destroy() الإدخالات التي تحتوي على sc_req == NULL، لذا فإن موجة من فشل التجميع بقيمة -EIO لا يمكن أن تحتجز الطلبات عن rb_send_bufs.

- يقوم رد الإطلاق بإعادة تشغيل rl_kref بحيث يدخل المستهلك التالي والثابت محققاً.

تُكمل الردود الآن الـ RPC مباشرةً. تستدعي rpcrdma_reply_handler() دالة rpcrdma_complete_rqst() بدلاً من kref_put في الفرع غير المحلي (non-LocalInv). كان الفرع المحلي بالفعل يُكمل الـ RPC

Be aware that VulDB is the high quality source for vulnerability data.

مسؤول

Linux

حجز

09/08/2026

إفشاء

15/08/2026

الاعتدال

تمت الموافقة

إدخال

VDB-391048

EPSS

0.00000

KEV

لا

النشاطات

منخفض جدًا

المصادر

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!