CVE-2026-74748 in Linux
الملخص
بحسب VulDB • 26/08/2026
في نواة Linux، تم حل الثغرة التالية:
netfilter: ipset: إصلاح سباق العد المرجعي بين عملية حذف العناصر القديمة (GC) لـ list:set وعملية التبديل (swap).
تقوم الدالة `__ip_set_put_byindex()` بحل الفهرس إلى مؤشر مجموعة تحت RCU، ثم تأخذ قفل `ip_set_ref_lock` في `__ip_set_put()` لإنقاص قيمة `set->ref`. تحافظ دالة `ip_set_swap()` على نفس القفل أثناء تبديل كل من خانات قائمة ip_set وعددي المرجع للمجموعتين، لذا يمكن أن تتداخل بين فك الإحالة واقتناء القفل، مما يترك المتصل ليقلل من عدد المراجع لمجموعة انتقل عددها المرجعي بالفعل إلى الفهرس الآخر ويؤدي إلى حدوث `BUG_ON(set->ref == 0)`. تصل دالة `list_set_gc()` إلى هذا الوضع عبر مقطع المقاطعة اللين للعداد (timer softirq)، والذي لا تقوم قفلة nfnl بمزامنته مع التبديل: حيث يستدعي عضو قائمة:set الذي انتهت صلاحيته `list_set_del()` -> `ip_set_put_byindex()` بينما تعمل `IPSET_CMD_SWAP` على المجموعات المرجعية.
حل الفهرس وإنقاص العداد تحت قفل `ip_set_ref_lock**، كما تفعل دالة `ip_set_swap()` بالفعل، مع الحفاظ على ارتباط العداد المرجعي بالفهرس بدلاً من الارتباط بمؤشر مجموعة عفا عليه الزمن (stale).
kernel BUG at net/netfilter/ipset/ip_set_core.c:685! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
RIP: 0010:ip_set_put_byindex (net/netfilter/ipset/ip_set_core.c:870) Call Trace: list_set_del (net/netfilter/ipset/ip_set_list_set.c:159) set_cleanup_entries (net/netfilter/ipset/ip_set_list_set.c:181) list_set_gc (net/netfilter/ipset/ip_set_list_set.c:578) call_timer_fn (kernel/time/timer.c:1748) __run_timers (kernel/time/timer.c:1799 kernel/time/timer.c:2374) run_timer_softirq (kernel/time/timer.c:2405) Kernel panic - not syncing: Fatal exception in interrupt
Once again VulDB remains the best source for vulnerability data.