چند روز پیش ، OpenSSH یه بروزرسانی برای اصلاح آسیب پذیری اجرای کد از راه دور، به شناسه CVE-2023-38408 در نسخه های قبل از OpenSSH 9.3p2 منتشر کرده. آسیب پذیری توسط Qualys کشف و گزارش شده.
OpenSSH یه نسخه متن باز از پروتکل Secure Shell (SSH) هستش که امکان ایجاد ارتباط امن و رمزشده در چارچوب کلاینت – سرور رو فراهم میکنه و در این حوزه هم یکی از ابزارهای حیاتی هستش.
ssh-agent هم یکی از اجزای کلیدی این ابزار هستش . این برنامه کارش اینه که کلیدهای خصوصی که برای احرازهویت کلیدهای عمومی استفاده میشه رو نگهداری میکنه و روند احرازهویت رو با رهگیری کلیدهای هویتی و عبارات عبور (passphrases) کاربر ساده تر میکنه. وقتی که این کلیدها در ssh-agent ذخیره میشن، کاربرا میتونن بدون نیاز به وارد کردن مجدد رمز عبور یا عبارت عبور خود به سرورهای دیگه دسترسی داشته باشن، بنابراین یه فرایند SSO رو فراهم میکنه. متأسفانه، حوادث اخیر نشون داده که حتی چنین سیستم خوبی می تونه آسیب پذیری های فاجعه باری داشته باشه.
آسیب پذیری CVE-2023-38408 یه آسیب پذیری اجرای کد از راه دور در ویژگی forwarded در ssh-agent بخصوص در PKCS#11 هستش.
در رمزنگاری ، PKCS مخفف Public Key Cryptography Standards به معنی ” استانداردهای امنیت کلید عمومی ” هستش. اینا گروهی از استانداردهای رمزنگاری کلید عمومی هستن که توسط RSA Security LLC ارایه و منتشر شدن، که از اوایل دهه ۱۹۹۰ شروع شده . برای تفکیک ، هر PKCS با یه شماره ای مشخص میشه که عددی بین 1 تا 15 هستش. مثلا PKCS#11 مرتبط با Cryptographic Token Interface هستش که به Cryptoki هم شناخته میشه. یه بستر برنامه سازی امن برای ماژول های رمزنگاری رو از رطیق API تعریف میکنه. این استاندارد در ابتدا جهت دسترسی به کارت های هوشمند طراحی شد و دربرگیرنده مفاهیمی مانند اسلات (Slot) معادل دستگاه کارتخوان و توکن (Token) معادل کارت هوشمند هستش که دلالت بر تکنولوژی کارت هوشمند داره.
بطور کلی آسیب پذیری اینجوریه که ، ssh-agent ای که از PKCS#11 پشتیبانی میکنه، در شرایط خاصی امکان اجرای کد از راه دور ، از طریق یه forwarded agent socket رو فراهم میکنه. برای اکسپلویت نیاز به یسری کتابخونه روی سیستم قربانی هستش و همچنین نیاز هستش که agent به یه سیستمی که تحت کنترل مهاجم هستش ، forwarded بشه.
آسیب پذیری از نوع Untrusted search path هستش ، آسیب پذیری هایی که در اون محصول یسری منابع حیاتی رو با یه مسیر داده شده خارجی جستجو میکنه که این مسیرها تحت کنترل محصول نیستن. برای مثال کد زیر در نظر بگیرید :
1 2 3 4 5 6 7 8 9 10 |
#define DIR "/restricted/directory" char cmd[500]; sprintf(cmd, "ls -l %480s", DIR); /* Raise privileges to those needed for accessing DIR. */ RaisePrivileges(...); system(cmd); DropPrivileges(...); ... |
برنامه بالا اینجوریه که یه دایرکتوری محدود شده رو لیست میکنه . برای این منظور هم امتیازش افزایش میده تا مشکلات پرمیشن نداشته باشه و بعد اجرای دستور اونو کاهش میده. در نگاه اول به دلیل اینکه دایرکتوری و دستور ثابت هستن و مهاجم نمیتونه اونارو کنترل کنه، آسیب پذیر نیستش و مهاجم میتونه فقط محتویات DIR ببینه. اما با دستکاری متغییرهای محیطی میشه این برنامه رو اکسپلویتش و کد دلخواه اجرا کرد :
- کاربر یه PATH ، در متغیر محیطی ، برای ارجاع به دایرکتوریه که تحت کنترل مهاجم هست ایجاد میکنه، مثلا فرض کنید
"/my/dir/"
- مهاجم یه برنامه مخرب بنام ls ایجاد میکنه و در این دایرکتوری قرار میده.
- کاربر برنامه رو اجرا میکنه.
- وقتی تابع system در برنامه میخواد اجرا بشه، شل میره PATH رو میخونه تا بتونه مسیر ls رو پیدا کنه.
- برنامه بجای ls اصلی ، میره و برنامه مخرب مهاجم در
"/my/dir/ls"
رو پیدا میکنه. - در نهایت برنامه مخرب با امتیاز بالا اجرا میشه.
نکته نهایی اینه که آسیب پذیری CVE-2023-38408 به دلیل اصلاح بد ، آسیب پذیری CVE-2016-10009 رخ میده. این آسیب پذیری هم از نوع Untrusted search path بوده و در ssh-agent.c در ssh-agent در نسخه های قبل از OpenSSH before 7.4 رخ میداد. امتیاز 7.3 و شدت بالا رو داشت.
منابع: