محققای Aqua Nautilus یه آسیب پذیری رو کشف و گزارش کردن که از تعامل بین بسته command-not-found در ابونتو و مخزن بسته Snap ناشی میشه. مهاجمان میتونن با دستکاری مخزن Snap ، از این آسیب پذیری سوء استفاده کرده و بسته های مخرب رو به کاربر پیشنهاد بدن.
در این پست نگاهی به command-not-found ، خطرات مرتبط با نصب بسته های Snap مخرب و بردارهای حمله ای که امکان سوء استفاده از این آسیب پذیری رو میدن ، انداختیم.
بسته های Snap و APT :
در لینوکس معمولا برای مدیریت و نصب برنامه ها از ابزارهای مختلفی استفاده میشه. دو مورد رایجش Snap و APT هستش.
Snap یک سیستم بسته بندی و توسعه نرم افزاره که از بسته های مستقلی بنام Snap برای انتقال نرم افزار به کاربران استفاده میکنه. در Snap همه ی چیزی که برای اجرای برنامه نیازه، یکجا جمع شده، بنابراین هم سایزشون بزرگتره و هم مستقل از سیستم هستن، یعنی روی هر توزیعی که از Snap پشتیبانی میکنه قابل اجراست. در Snap توسعه دهندگان میتونن بسته های خودشون رو از مستقیما از طریق Snap Store به دست مخاطب برسونن . فرمت بسته snap. و از نوع فایل آرشیوی SquashFS هستش. طریقه نصب با این ابزار:
1 |
sudo snap install app-name |
APT یه ابزار مدیریت بسته هستش که برای نصب و حذف بسته های در سیستم های مبتنی بر دبیان استفاده میشه. APT بسته هارو از منابع رسمی یک توزیع بدست میاره. فرمت بسته deb. و از نوع فایل آرشیوی ar هستش. طریقه نصب با این ابزار:
1 |
sudo apt install app-name |
بسته command-not-found :
بسته command-not-found، بصورت پیش فرض در اوبونتو نصب میشه و کارش اینه که اگه دستوری رو در Bash یا Zsh وارد کنید که موجود نباشه، بسته ی مورد نظر رو پیشنهاد میده. وقتی Bash با دستور ناشناخته ای مواجه میشه با فراخوانی تابع command_not_found_handle ، بسته ی مورد نظر رو پیشنهاد میده.
این بسته ، پیشنهاداتی رو برای بسته های APT و SNAP ارائه میکنه. مثلا اگه کاربر بخواد دستور ifconfig رو اجرا کنه که در سیستمش نیست، بسته پیشنهاد نصب net-tools از طریق apt رو میده :
به همین شکل، اگه کاربر دستور Code رو بزنه که مرتبط با Visual Studio Code هستش و این برنامه در سیستمش نباشه، بسته خروجی زیر رو نشون میده :
اگه دستوری هم با بسته های APT و هم SNAP مرتبط باشه، مثلا دستور mojo ، بسته command-not-found هر دو گزینه رو پیشنهاد میده :
درک الگوریتم پیشنهاد بسته command-not-found :
بسته command-not-found یه دیتابیس داخلی داره که دستورات رو با بسته های محبوب APT مرتبط میکنه. نکته ای که هست اینه که ، ممکنه دستور با نام بسته متفاوت باشه. مثلا در مثال بالا برای ifconfig بسته net-tools رو پشنهاد داده. این دیتابیس خودش زمانی بروز میشه که خود بسته command-not-found بروزرسانی بشه.
برای بسته های SNAP ، بسته متکی به دستور snap advise-snap هستش. این قابلیت که توسط snap ارائه شده، از دیتابیسی که از Snap Store بروز شده، برای انتخاب بسته پیشنهادی استفاده میکنه.
اما سوالی که این وسط هست اینه که، سیستم از کجا میدونه که چه بسته ای رو باید پیشنهاد بده؟ برای دونستن این سوال، کد زیر رو که قسمتی از بسته command-not-found هست رو بررسی میکنیم .
فرایند با فراخوانی تابع get_packages برای شناسایی بسته های APT و تابع get_snaps برای بازیابی بسته های SNAP شروع میشه. در ادامه یسری شرایط رو برای بدست آوردن دقیقترین بسته بررسی میکنه. اگه موردی در APT و SNAP پیدا نکنه، سعی میکنه یسری دستور مشابه توصیه کنه یا اشتباهات املایی احتمالی رو در نظر بگیره. در مواردی که مورد دقیقی رو پیدا کنه، بسته پیشنهادی بستگی به تعداد نتایج داره، چون ممکنه چندین بسته APT یا SNAP برای یه دستور وجود داشته باشه.
با توجه به این مکانیسم، بسته command-not-found برای پیشنهاد بسته متکی به مخازن APT و SNAP هستش. سوالی که اینجا وجود داره اینه که یه مهاجم آیا امکان دستکاری این سیستم رو داره تا بسته های مخرب خودش رو پیشنهاد بده ؟
در حالیکه بسته های APT بدون هیچ محدودیتی روی سیستم عامل میزبان ، کار میکنن، اما هر کسی نمیتونه یه بسته رو به مخزن رسمی APT اضافه کنه. توسعه دهندگان قبل از اینکه بتونن بسته ای رو آپلود کنن، باید فرایند تایید رو طی کنن.
به همین دلیل و با توجه به اینکه دیتابیس بسته command-not-found در APT بصورت منظم بروز نمیشه، محققا رفتن سراغ انتشار بسته از مخازن SNAP .
محدودیت های بسته های SNAP :
با توجه به اینکه تمرکزمون روی بسته های SNAP هستش، محققا بررسی کردن ببینن ، این بسته ها چه شرایط و محدودیتهایی رو برای توسعه دهندگان در نظر گرفتن.
برای این کار نیاز هستش که در ابتدا ، سطح محدودیت رو درک کنیم. دو دسته محدودیت اصلی برای SNAP وجود داره :
- Strict : این محدودیت توسط اکثر بسته ها استفاده میشه. این نوع بسته ها در یه سندباکس اجرا میشن و نمیتونن به فایل، شبکه، پروسس یا هر منبع دیگه در سیستم دسترسی داشته باشن.
- کلاسیک: مانند بسته های APT روی دستگاه میزبان ، بدون محدودیت اجرا میشن.
سوالی که اینجا مطرح میشه اینه که چرا یه بازیگر تهدید، از نوع کلاسیک استفاده نمیکنه؟ بدلیل بررسی و ایمنی. چون بسته هایی که امتیازات خاصی رو میخوان، مثلا بسته های کلاسیک، توسط تیم SNAP بصورت دستی بررسی میشن. با این حال همه ی برنامه ها، به مجموعه کاملی از پرمیشن هایی که نوع کلاسیک فراهم میکنه نیاز ندارن، اما همچنان به یسری منابع سیستم محلی نیاز دارن. برای رفع این نیاز مکانیسم اینترفیس SNAP توسعه داده شده.
اینترفیس های SNAP :
اینترفیس های SNAP ، بعنوان دروازه های کنترل شده برای بسته های Strict عمل میکنن و این امکان رو به اونا میدن تا با منابع خارج از سندباکس تعامل داشته باشن. اینترفیس های مختلفی وجود داره که لیستش رو میتونید اینجا ببینید. این اینترفیس ها مثله ترک های کنترل شده روی دیوار سندباکس هستن. با این گزینه، SNAPها میتونن با منابع میزبان یا با محیط سایر SNAPهای در حال اجرا تعامل داشته باشن.
شکل بالا، قسمتی از اینترفیس های SNAP رو نشون میده. برخیشون پرمیشن های قابل توجهی به SNAPها میدن مثلا ضبط صدا و مدیریت اکانت . بعضیشون مثله audio-playback امکان پخش صوت رو فراهم میکنن.
این اینترفیس ها رو میشه براساس ویژگی auto-connect ، دسته بندی کرد. این ویژگی نشون میده که کدوم پرمیشن ها رو میشه قبل از انتشار در فروشگاه ، بصورت خودکار به بسته ها اضافه کرد، اونایی که با Yes مشخص شدن و کدوم نیاز به بررسی دستی تیم SNAP دارن ، اونایی که با NO مشخص شدن.
خطرات بسته های مخرب strict snap :
محققا اومدن روی محتمل ترین تاکتیکهایی تمرکز کردن که یه مهاجم میتونه از بسته های مخرب SNAP سوء استفاده کنه. برای این کار محققا از بسته های strict استفاده کردن و همچنین اینترفیسی که نیاز به بررسی دستی توسط تیم SNAP نداشته باشه، یعنی ویژگی auto-connec براشون YES باشه، استفاده کردن.
اینترفیس desktop :
این اینترفیس نیاز به بررسی دستی نداره و این امکان رو میده تا برنامه هایی که GUI دارن، بتونن به display server متصل بشن و پنجره ها رو در سیستم میزبان نشون بدن.
در لینوکس، display server ، یه برنامه ای هستش که مسئولیت مدیریت ورودی/خروجی گرافیکی رو در سیستم بر عهده داره و GUI رو فعال میکنه. برنامه ها از طریق پروتکل های خاص display server با display server ارتباط برقرار میکنن. ذو تا از پروتکل های معروف : X11 و Wayland هستش. X11 یه پروتکل display server قدیمیه ، اما Wayland پروتکل جدیدی هستش که سیستم ویندوزی، مدرن و امنی رو بجای X11 ارائه میده.
مسئله اصلی در اینجا اینه که محدودیت های سندباکس به قابلیت های display server بستگی داره. در نتیجه display serverهای قدیمی مانند X Window System ، که از پروتکل X11 استفاده میکنن، فاقد جداکننده های امنیتی بین پنجره برنامه های مختلف هستن. این به Snapها این امکان رو میده که به X11 وصل بشن و پنجره های دیگه رو شنود کنن یا کلید های زده شده در سیست میزبان رو ثبت کنن. (کیلاگر).
این موضوع بعنوان Canonical شناخته میشه که Matthew Garrett یه پستی در وبلاگش، در سال 2016 نوشته و به شکاف امنیتی محدودیتهای SNAP در X11 اشاره کرده. یه ابزار متن باز هم منتشر کرده که این ویژگی رو نشون میده.
محققا یسری تغییرات در کد دادن و کامپایلش کردن و در Ubuntu 22 تستش کردن :
همونطور که در ویدیو بالا قابل مشاهده هستش، اجرای یه Snap بنام friendlyteddy ، که کاملا محدود هستش، اعتبارنامه ای که کاربر تایپ میکنه رو میدزده.
در حالیکه تیم Snap اعلام کرده که میخواد از X server به پروتکل های امنی مانند Wayland مهاجرت کنه، اما X server همچنان توسط توزیعها استفاده میشه. در حالیکه Wayland، پروتکل پیش فرض اوبونتو 22 هستش، اما X server همچنان بطور پیش فرض نصب میشه و مقالات و پست های زیادی، نحوه ی سوئیچ به X server رو آموزش میدن.
آسیب پذیری های کرنل :
اگه شما از پروتکل ناامنی مانند X11 هم استفاده نکنید، همچنان میتونید تحت تاثیر بسته های مخرب Snap باشید. میزبان و همه ی بسته های Snap فعال ، از یه کرنل مشترک استفاده میکنن. این بدین معناست که اگه یه آسیب پذیری در کرنل وجود داشته باشه که یک بسته Snap بتونه اونو اکسپلویت کنه، بنابراین میتونه سندباکس دور بزنه و کنترل کامل سیستم رو بدست بیاره.
سالانه آسیب پذیری های زیادی در کرنل لینوکس پیدا میشه. طبق گزارش stackwatch در سال 2023، 282 آسیب پذیری گزارش شده. اگرچه آسیب پذیری ها شدت متفاوتی دارن و نمیشه از همه اشون از طریق snap container سوء استفاده کرد، اما تهدید همچنان پابرجاست.
علاوه بر این ، Snapها دارای یه ویژگی بروزرسانی خودکار هستن که نسخه ی نصب شده ی Snap در سیستم رو بروز میکنن. اگرچه این ویژگی میتونه برای اصلاح آسیب پذیری های موجود در Snap خوب باشه، اما پیامد امنیتی هم داره. بازیگران تهدید میتونن از این ویژگی برای استقرار ، اکسپلویتهای جدید استفاده کنن. مثلا فرض کنید، یه بازیگر تهدید تونسته یه بسته قابل اعتماد رو جعل کنه و کاربران مختلف اونو نصب کردن. یه آسیب پذیری مهم در کرنل لینوکس پیدا میشه، در نتیجه بازیگر با بروزرسانی بسته در مخزن Snap ، میتونه همه ی کاربران رو قبل از اینکه آسیب پذیری کرنل رو اصلاح کنن، اکسپلویت کنه.
جعل بسته Command-Not-Found :
حالا که به درک درستی از بسته های Snap و خطراتی که یک بسته مخرب میتونه داشته باشه رسیدیدم، برگردیم سراغ هدف اصلی خودمون یعنی چطوری یه مهاجم میتونه از بسته command-not-found سوء استفاده کنه تا کاربران رو فریب بده تا یه بسته مخرب رو دانلود و نصب کنن.
دستورهای مستعار بسته Snap :
طبق مستندات Snap ، برای جلوگیری از تداخل Snapهای مختلف که نام برنامه اشون یکسانه، فرمت دستور بصورت <snap name>.<application name> هستش. اگه نام Snap و برنامه یکسان باشه، از دستور <snap name> استفاده میکنیم.
مثلا سناریویی رو در نظر بگیرید که در اون snap name برابر code و application name برابر vscode هستش، بنابراین دستور ما میشه : code.vscode . اما اگه هر دوشون code باشن، بجای code.code میتونیم از code استفاده کنیم.
اگه یه توسعه دهنده ای بخواد ، بسته Snapاش بجای <snap name>.<application name> به سادگی از <snap name> استفاده کنه ، باید درخواست یه نام مستعار بده. چنین درخواستی یه فرایند بررسی دستی رو طی میکنه تا مطمئن بشن با برنامه ی دیگه ای همسو نیست.
با این حال چون نام ثبت شده یه نام مستعار هستش و نه نام رسمی ، نام واقعی همچنان قابل استفاده هستش. این یعنی اینکه یه مهاجم میتونه یه نام ثبت کنه و دستور رو جعل کنه.
یه مثال رو با هم بررسی کنیم :
همونطور که در بالا مشاهده میکنید، با وارد کردن tarquingui ، بسته command-not-found پیشنهاد نصب tarquin رو میده. دستور tarquingui دقیقا با snap name مطابقت نداره که نشون دهنده اینه که tarquingui یه نام مستعار برای tarquin هستش.
با این حال همونطور که بالا اشاره کردیم، از اونجایی که نام مستعار معادل رزرو snap name نیست، مهاجم میتونه tarquingui رو بعنوان snap name ثبت کنه و بسته Snap خودش رو منتشر کنه.
خروجی زیر بعد از ثبت نام tarquingui رو نشون میده :
مهاجم میتونه همه ی نامهای مستعار دستورات رو از طریق Snap Store API بررسی کنه ، تا هر نام مستعاری که snap name اون در دسترس هستش رو بدست بیاره. بعد از اینکه پیدا کرد، مهاجم میتونه یه Snap جدید با اون نام مستعار ایجاد کنه و فرصتی برای فریب کاربران بدست بیاره.
نکته ای که وجود داره، طبق مستندات ، یه نام مستعار لزوما منحصر به فرد نیست.
دستورات بسته های APT :
در بخش قبل به بررسی جعل بسته های Snap پرداختیم، اما جعل بسته های APT نگران کننده تر هستش. همونطور که قبلا اشاره شد، command-not-found متکی به دیتابیس محلی هستش که در مسیر زیر قرار گرفته و دستورات رو به بسته های APT مربوطه مرتبط میکنه و کاربران رو برای نصب دقیق راهنمایی میکنه.
1 |
/var/lib/command-not-found/commands.db |
محققا اومدن بررسی کردن ببینن چه تعداد از دستوراتی که در این دیتابیس محلی هستش ،میشه برای ثبت نام بسته های Snap ، ازشون سوء استفاده کرد. این باعث میشه که command-not-found ، یه بسته Snap مخرب رو در کنار یه بسته قانونی APT پیشنهاد بده.
برای اینکار از Snap Store استفاده کردن تا ببینن یک دستور رو میتونن بعنوان نام بسته Snap استفاده کنن یا نه. نتیجه این بوده که 26 درصد بسته های APT قابل ثبت هستش و میتونه خطر امنیتی قابل توجهی رو ایجاد کنه. چون مهاجم میتونه اینارو ثبت کنه و بسته مخرب تحویل بده.
مثلا یکی از بسته ها ، jupyter-notebook بوده :
مسئول بسته jupyter-notebook APT ، نام Snap رو ثبت نکرده، در نتیجه مهاجم میتونه این نام رو ثبت کنه و بسته مخرب با عنوان jupyter-notebook منتشر کنه. شکل زیر خروجی دستور بعد از ثبت jupyter-notebook هستش:
همونطور که مشاهده میکنید، command-not-found حتی بسته مخرب SNAP رو قبل از بسته APT ارائه داده و این میتونه بیشتر کاربر رو گمراه کنه.
حملات Typosquatting :
مهاجمین علاوه بر استفاده از نام دقیق بسته های محبوب، میتونن از حملات Typosquatting هم استفاده کنن. این شامل اشتباهات املائی رایج توسط کاربران هستش.
برای مثال فرض کنید، کاربر به جای دستور ifconfig ، دستور ifconfigg رو وارد میکنه.
همونطور که مشاهده میکنید، command-not-found اومده دستور رو اصلاح کرده و پیشنهاد نصب net-tools برای دستور ifconfig رو میده.
حالا فرض کنید مهاجم از این نام اسنفاده کنه و یه بسته Snap ثبت کنه :
همونطور که مشاهده میکنید، در این حالت اصلا شکل درست املایی رو هم پیشنهاد نمیده.
اقدامات امنیتی :
برای اینکه کاربران و نگه دارندگان بسته ها ، تحت تاثیر این آسیب پذیری قرار نگیرن :
- کاربران باید منبع یه بسته، اعتبار نگه دارنده بسته و پلتفرم پیشنهادی (هم APT و هم SNAP) رو بررسی کنن.
- توسعه دهندگان Snap با نام مستعار، اگه نام مربوطه با برنامه اشون مطابقت داره، باید فورا اونو ثبت کنن تا جلوی سوء استفاده رو بگیرن.
- توسعه دهندگان APT ، نام SNAP مرتبط با بسته اشون رو هم ثبت کنن تا جلوی سوء استفاده های احتمالی رو بگیرن.
- راه حل های امنیتی زمان اجرا ، میتونن رفتار مخرب ناشی از اکسپلویت از این موضوع رو شناسایی کنن.