در این پست به بررسی یه آسیب پذیری بحرانی با امتیاز 9.8 در Ghostscript پرداختیم که امکان اجرای کد رو فراهم میکنه.
Ghostscript یه مفسر متن باز برای زبان PostScript و فایلهای PDF هستش و بصورت پیش فرض در بسیاری از توزیعهای لینوکسی نصب شده. اغلب بصورت مستقیم مورد استفاده قرار نمیگیره و توسط سایر برنامه ها برای پرینت و تبدیل فایلها استفاده میشه. مثلا یکی از وابستگی های مورد نیاز در cups-filters هستش که مولفه ی اصلی Common Unix Printing System (CUPS) هستش که مکانیزم اصلی لینوکس برای چاپ و سرویس های چاپ هستش.
برنامه های دیگه از Ghostscript برای خوندن و ذخیره فایلهای PostScript (PS) و Embedded PostScript (EPS) و PDF استفاده میکنن. در یه سیستم Debian 12 ، حدودا 131 بسته به Ghostscript وابسته هستن. برنامه هایی مانند LibreOffice، Inkscape ، Scribus و ImageMagick از Ghostscript استفاده میکنن.
برنامه هایی که از Ghostscript استفاده میکنن، وقتی به یه سیستم عامل دیگه ای منتقل میشن، مثلا ویندوز، در سیستم عامل جدید هم همچنان از پورت Ghostscript استفاده میکنن.
با توضیحات بالا میشه این نکته رو گرفت که آسیب پذیری در Ghostscript پتانسیل بالایی رو داره و میتونه سیستم ها و سیستم عاملهای مختلفی رو درگیر کنه.
آسیب پذیری :
آسیب پذیری به دلیل عدم اعتبارسنجی مناسب برای pipe هستش و در نسخه های قبل از 10.01.2 رخ میده. pipe در حقیقت یه مکانیزمی هستش که این امکان رو میده تا چندین برنامه بتونن از خروجی هم بعنوان ورودی استفاده کنن. pipe اغلب با | نشون داده میشه. مثلا در مثال زیر، ابتدا فایل hosts رو میخونه و بعدش اونو به grep میده تا جاهایی که localhost داره رو مشخص کنه.
1 |
cat /etc/hosts | grep localhost |
با بررسی GIT پروژه ، کد جدید تابع gp_file_name_reduce رو داخل یه IF قرار داده و زمانی که مسیر با رشته %pipe
شروع نشه، اجازه اجرا رو میده :
همچنین یسری توابع جدید هم اضافه کردن تا از فراخوانی gp_file_name_reduce محافظت کنن، که همه اینها نشون میده که احتمالا آسیب پذیری در این مسیر کد هستش.
در کد بالا اگه دقت کنید، تابع gp_file_name_reduce با یه مقدار gp_combine_success بررسی میشه که این مقدار توسط تابع gp_file_name_combine_generic تولید میشه.
با توجه به توضیحاتی که برای تابع gp_file_name_combine_generic درج شده میشه فهمید که :
چندین مسیر رو میگیره، اونارو باهم ترکیب میکنه و مسیرهای نسبی رو حذف میکنه تا یه ساده سازی انجام بده. مثلا C:/gs/lib
و ../Resource/CMap/H
رو میگیره و بعد از ساده سازی و حذف مسیرهای نسبی، اونو به C:/gs/Resource/CMap/H
تبدیل میکنه.
همچنین طبق توضیحات commit ، اگه یه مسیر مخربی رو بهش بدیم، این تابع ممکنه یه خروجی غیرقابل انتظار رو بده.
توابع مرتبط با فایل از جمله تابع باز کردن فایل، با فراخوانی تابع gp_validate_path ، بررسی میکنن که آیا درخواست file IO رو پردازش کنن یا نه . در حقیت با این تابع بررسی میکنن که آیا مکان فایل امن هستش یا نه.
تابع gp_validate_path در حقیقت یه wrapper برای gp_validate_path_len هستش و از یه تابع validate برای بررسی اینکه آیا میتونه در یه مکان خاصی بنویسه یا نه، استفاده میکنه. این مکان قبل از اینکه توسط تابع validate بررسی بشه، توسط تابع آسیب پذیر gp_file_name_reduce دستکاری شده و بنابراین مهاجم میتونه Ghostscript رو مجبور کنه تا فایلهایه دیگه رو اجرا کنن و اکسپلویت کامل بشه.
محققا یه PoC برای این آسیب پذیری هم توسعه دادن که با بازکردن یه فایل Embedded PostScript (EPS) ، در Ghostscript یا هر برنامه ای که از Ghostscript برای پردازش فایل استفاده میکنه، اجرا بشه و از اون برای توسعه رولهای تشخیص استفاده کردن.
در ویدیوی زیر محققا این POC رو روی Inkscape در ویندوز اجرا کردن که باهاش تونستن ماشین حساب اجرا کنن و یه پیام رو نمایش بدن.
شناسایی اکسپلویت:
از طریق رولهای sigma میتونید ، این اکسپلویت رو شناسایی کنید.
با ارتقاء به نسخه ی 10.01.2 و بالاتر، تحت تاثیر این آسیب پذیری نیستید.