CIFSwitch: باگ ۱۸ سالهای که کاربر عادی لینوکس رو روت میکنه
خلاصهٔ کاملتر
یه پژوهشگر امنیتی آسیبپذیری ارتقای سطح دسترسی محلی (local privilege escalation) به اسم CIFSwitch رو افشا کرده که به هر کاربر بدوندسترسی روی طیف وسیعی از توزیعهای لینوکس اجازه میده بیسروصدا به root برسه — از جمله Linux Mint، Debian، Rocky Linux، CentOS Stream، Kali Linux و چندتای دیگه. جالب اینکه این باگ سمت کرنل از سال ۲۰۰۷ بیسروصدا توی کد بوده.
آسیبپذیری توی مرز بین کلاینت CIFS کرنل (همون بخشی که فایلسیستمهای شبکهای SMB رو مدیریت میکنه) و یه helper در فضای کاربر از بستهی cifs-utils قرار داره. هیچکدوم از این دو بخش بهتنهایی خراب نیستن؛ اعتماد نابهجای بینشون مسیر تمیزی به روت باز میکنه.
مکانیزم به این شکله: وقتی کرنل میخواد یه mount از نوع SMB با احراز هویت Kerberos رو تأیید کنه، کار اعتبارنامه رو به یه باینری فضای کاربر به اسم cifs.upcall میسپره که با دسترسی root اجرا میشه. کرنل یه رشتهی توصیف (description) میسازه و از طریق زیرسیستم keyring لینوکس یه کلید از نوع cifs.spnego درخواست میکنه که در نهایت cifs.upcall رو بهعنوان root اجرا میکنه.
اشتباه اصلی اینه که کرنل هیچوقت چک نمیکرد که این رشتهی توصیف واقعاً از خودش منشأ گرفته یا نه. قبل از وصله، تعریف cifs_spnego_key_type هیچ hook به اسم .vet_description نداشت — همون تابعی که باید مالکیت رو اعمال میکرد. بدون اون، هر پروسهی بدوندسترسی میتونست با فیلدهای کاملاً ساختهی مهاجم یه درخواست کلید بفرسته. مهمتر اینکه helper روتدار اجرا میشه حتی اگه کرنل آخرش کلید رو رد کنه؛ پنجرهی سوءاستفاده لحظهی شروع اجرای helper باز میشه، نه لحظهی موفقیتش.
از اونجا زنجیرهی حمله ظریفه: مهاجم یه pid جعلی به یه پروسه توی mount namespace خودش میده. helper این فیلدها رو بهعنوان خروجی معتبر کرنل میخونه و به namespace مهاجم سوئیچ میکنه. قبل از کاهش دسترسی، یه جستوجوی کاربر از طریق NSS (سازوکار Name Service Switch لینوکس) انجام میده — و توی namespace مهاجم میشه NSS رو طوری تنظیم کرد که یه کتابخانهی اشتراکی مخرب بارگذاری بشه. اون کتابخانه داخل helper روتدار اجرا میشه، یه ورودی پرمجوز توی sudoers.d مینویسه و مهاجم روت کامل میگیره.
برای بهرهبرداری کامل سه شرط لازمه: یه کرنل آسیبپذیر، نسخهی متأثر cifs-utils (۶.۱۴ به بالا یا قدیمیترهایی که وصلههای CVE دیگه رو backport کردن)، و امکان ساخت user namespace بدوندسترسی — که بهصورت پیشفرض روی بیشتر توزیعهای مدرن فعاله. توزیعهایی مثل Fedora 40–44 و Ubuntu 26.04 به لطف سیاستهای پیشفرض SELinux یا AppArmor مسدودن، ولی شل کردن اون سیاستها دوباره حمله رو ممکن میکنه.
وصلهی سمت کرنل یه hook به اسم .vet_description به cifs_spnego_key_type اضافه میکنه که مگر در صورت تطابق اعتبارنامهی درخواستکننده با spnego_cred داخلی CIFS، خطای -EPERM برمیگردونه — همین یه چک زنجیره رو میشکنه. اگه نصب فوری وصله ممکن نیست، میشه ماژول cifs رو بلاک کرد، cifs-utils رو حذف کرد، یا ساخت user namespace بدوندسترسی رو غیرفعال کرد.
نکتهی متفاوت این کشف اینه که پژوهشگر (Asim Manizada) باگ رو نه با ممیزی دستی کد، بلکه با هدایت عاملهای LLM مجهز به یه ابزار پیمایش گراف معنایی پیدا کرده — ابزاری که نشون میده فرضها بین زمان ساخت و زمان مصرف کجا از هم فاصله میگیرن. این یه باگ منطقی محضه: نه خرابی حافظه، نه race condition، فقط ترکیب سه تصمیم طراحی مستقلاً بیخطر.
نکات کلیدی:
- CIFSwitch به کاربر بدوندسترسی روی توزیعهای پرشمار لینوکس اجازهی روت شدن میده.
- ریشه: کرنل منشأ رشتهی توصیف keyring رو چک نمیکرد (نبود hook با نام .vet_description).
- یه باگ منطقی محض از سال ۲۰۰۷، بدون خرابی حافظه یا race condition.
- وصله آماده شده؛ تا نصبش میشه ماژول cifs یا user namespaceها رو محدود کرد.




