نقص جدی در BPF کرنل لینوکس
خلاصهٔ کاملتر
این گزارش امنیتی دربارهٔ آسیبپذیریای با شناسهٔ CVE-2026-31525 توی مفسر (interpreter) فیلتر بستهٔ برکلی یا همون BPF تو کرنل لینوکسه. ریشهٔ مشکل تو هندلرهای تقسیم علامتدار ۳۲ بیتی (sdiv32) و باقیمونده (smod32) ـه که روی عملوندهای s32 از ماکروی abs() کرنل استفاده میکنن.
طبق این تحلیل، ماکروی abs() وقتی ورودیش برابر کمینهٔ نوع یعنی S32_MIN (همون 0x80000000) باشه رفتار تعریفنشده تولید میکنه؛ چون منفی کردن کمینهٔ یه عدد علامتدار تو مکمل دو اصلاً قابل نمایش نیست. نتیجه اینه که مفسر یه مقدار خراب حساب میکنه، ولی وریفایر BPF موقع تحلیلِ بازهها مقدار ریاضیِ درست رو در نظر میگیره و برنامه رو تأیید میکنه.
همین اختلاف بین چیزی که وریفایر تأیید میکنه و چیزی که موقع اجرا واقعاً اتفاق میافته، کلید حملهست. یه مهاجم محلی که اجازهٔ لود کردن برنامهٔ BPF داره میتونه برنامهای بسازه که نتیجهٔ تقسیمش از بازهٔ تأییدشده بیرون بزنه و با همون مقدار به یه map value ایندکس بزنه؛ یعنی خوندن یا نوشتن خارج از محدوده تو حافظهٔ کرنل [CWE-787] که میتونه به خرابی حافظه و ترفیع امتیاز محلی برسه.
یه نکتهٔ مهم اینه که این حمله فقط وقتی کار میکنه که مسیر مفسر فعال باشه، یعنی JIT کامپایلر BPF خاموش یا برای اون معماری در دسترس نباشه. نسخههای Linux Kernel 7.0-rc1 تا 7.0-rc4 آسیبپذیر شناخته شدن و این آسیبپذیری ۲۲ آوریل ۲۰۲۶ تو دیتابیس NVD منتشر شده.
وصلهٔ رسمی یه هلپر جدید به اسم abs_s32() معرفی میکنه که قبل از منفیسازی، عملوند رو به u32 تبدیل میکنه تا سرریزِ علامتدار پیش نیاد؛ این تغییر هر هشت جای استفادهٔ abs((s32)...) رو تو هندلرهای sdiv32 و smod32 عوض میکنه. تا قبل از اعمال وصله هم میشه با این دو تنظیم جلوی حمله رو گرفت:
sysctl -w kernel.unprivileged_bpf_disabled=1
sysctl -w net.core.bpf_jit_enable=1اولی لود کردن برنامهٔ BPF رو برای کاربرهای غیرمجاز میبنده و دومی JIT رو روشن میکنه تا اصلاً مسیر آسیبپذیرِ مفسر اجرا نشه. محدود کردن مجوزهای CAP_BPF و CAP_SYS_ADMIN فقط به سرویسهای مطمئن هم بین توصیههای اصلیِ این گزارشه.
نکات کلیدی:
- شناسه: CVE-2026-31525، از نوع دسترسی خارج از محدوده (CWE-787)
- ریشه: رفتار تعریفنشدهٔ abs() روی S32_MIN تو هندلرهای تقسیم/باقیماندهٔ علامتدار BPF
- اثر: ترفیع امتیاز محلی برای کاربری که میتونه برنامهٔ BPF لود کنه
- نسخههای آسیبپذیر: Linux Kernel 7.0-rc1 تا rc4
- رفع: وصلهٔ abs_s32() یا تنظیم unprivileged_bpf_disabled=1 و روشن کردن JIT




