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

الملخص

بحسب VulDB • 28/05/2026

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

cgroup: تأجيل قتل css percpu_ref عند تنفيذ rmdir حتى يتم تفريغ cgroup

أعاد سلسلة من الالتزامات (commits) التي تعود إلى الإصدار v7.0 هيكلة تنفيذ rmdir لتلبية الثابت (invariant) الخاص بالتحكم، والذي ينص على أن دالة ->css_offline() للنظام الفرعي لا يجب أن تعمل بينما لا تزال المهام تقوم بأعمال على جانب النواة داخل cgroup.

[1] d245698d727a ("cgroup: تأجيل إلغاء ارتباط cgroup للمهمة حتى بعد انتهاء المهمة من التبديل)
[2] a72f73c4dd9b ("cgroup: عدم عرض المهام الميتة في cgroup)
[3] 1b164b876c36 ("cgroup: الانتظار حتى تغادر المهام التي تموت عند تنفيذ rmdir)
[4] 4c56a8ac6869 ("cgroup: إصلاح cgroup_drain_dying() باختبار الشرط الخاطئ)
[5] 13e786b64bd3 ("cgroup: زيادة nr_dying_subsys_* من سياق rmdir)

نقل [1] إلغاء ارتباط cset للمهمة من do_exit() إلى finish_task_switch() بحيث ينخفض ارتباط cset للمهمة فقط بعد أن تتوقف المهمة تماماً عن الجدولة. جعل ذلك المهام التي تجاوزت exit_signals() تتعثر في cset->tasks حتى تبديل السياق النهائي، مما أدى إلى سلسلة من المشاكل حيث اختلف ما توقعه المستخدم أن يراه بعد rmdir عما يحتاجه النواة للانتظار. حاولت [2]-[5] سد هذه الفجوة: قام [2] بفلترة المهام الخارجة من cgroup.procs؛ جعل [3] rmdir(2) ينام في TASK_UNINTERRUPTIBLE لها؛ أصلح [4] شرط الانتظار؛ وجعل [5] nr_dying_subsys_* مرئياً بشكل متزامن.

أثبت انتظار cgroup_drain_dying() في [3] أنه طريق مسدود. عندما يكون متصل rmdir هو أيضاً جامع (reaper) لـ zombie يعلق تفكيك pidns (على سبيل المثال، يعيد systemd الخاص بـ host PID 1 فرز pids اليتيمة التي تم إعادة تعيينها له أثناء نفس التفكيك)، فإن rmdir يحجب في TASK_UNINTERRUPTIBLE بانتظار تحرير تلك pids، ولا يمكن لـ pids أن تتحرر لأن PID 1 هو الجامع وهو عالق في rmdir، مما يؤدي إلى حدوث deadlock A-A في النظام. لا يوجد كسر في ترتيب القفل الداخلي لهذا؛ الانتظار نفسه هو الثغرة.

ومع ذلك، يمكن جعل جانب قتل css الذي دفع إعادة الترتيب الأصلية غير متزامن بشكل نظيف: ->css_offline() هي بالفعل غير متزامنة، وتعمل من css_killed_work_fn() التي يقودها percpu_ref_kill_and_confirm(). الإصلاح هو جعل تلك السلسلة تبدأ فقط بعد أن تغادر جميع المهام cgroup. يعود الجانب المرئي للمستخدم في rmdir بمجرد أن تكون cgroup.procs والأصدقاء فارغة، بينما ->css_offline() لا تزال تعمل في الخلفية.

تتطلب هذه العملية إعادة هيكلة كبيرة. أولاً، يتم فصل kill_css() إلى kill_css_sync() وkill_css_finish()، حيث يقوم الأول بإلغاء ارتباط cset للمهمة، بينما يقوم الثاني بإلغاء ارتباط percpu_ref. يتم استدعاء kill_css_sync() من cgroup_task_dead()، بينما يتم استدعاء kill_css_finish() من cgroup_offline_work_fn() بعد أن تغادر جميع المهام cgroup.

ثانياً، يتم نقل cgroup_drain_dying() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

ثالثاً، يتم نقل cgroup_apply_control_disable() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

رابعاً، يتم نقل cgroup_destroy_locked() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

خامساً، يتم نقل cgroup_destroy_async() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

سادساً، يتم نقل cgroup_destroy_async() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

سابعاً، يتم نقل cgroup_destroy_async() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

ثامناً، يتم نقل cgroup_destroy_async() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

تاسعاً، يتم نقل cgroup_destroy_async() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

عاشراً، يتم نقل cgroup_destroy_async() من rmdir إلى cgroup_offline_work_fn()، حيث يتم استدعاؤه بعد أن تغادر جميع المهام cgroup.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

مسؤول

Linux

حجز

13/05/2026

إفشاء

28/05/2026

الاعتدال

تمت الموافقة

إدخال

VDB-366658

EPSS

0.00024

KEV

لا

النشاطات

منخفض جدًا

القطاع

Police, Pharma, ...

المصادر

Want to stay up to date on a daily basis?

Enable the mail alert feature now!