لوگوی ارتباط افزار افق
بستن

بررسی آسیب پذیری regreSSHion در OpenSSH

بررسی آسیب پذیری regreSSHion در OpenSSH

فهرست مطالب

regreSSHion

محققان امنیت سایبری از یک آسیب پذیری بسیار خطرناک اجرای کد از راه دور در  OpenSSH server خبر دادند که به مهاجم امکان گرفتن دسترسی روت و تحت کنترل گرفتن سرور را می‌دهد. این رخنه امنیتی که با کد CVE-2024-6387 شناسایی می‌شود به نام regreSSHion نیز شناخته می‌شود. دلیل این نام گذاری به دلیل وجود یک آسیب پذیری قدیمی است که با کد CVE-2006-5051 شناسایی شده و 18 سال پیش نیز وصله گردیده ولی با وجود وصله شدن پس از گذشت چندین سال بار دیگر نیز شناسایی شده است.

با استفاده از سرویس‌های اسکن اینترنت همچون Shodan، بیش از 14 میلیون سرور دارای این آسیب پذیری شناسایی شده که ارتباط اینترنتی آن‌ها نیز برقرار است و در خطر حملات از طریق این آسیب پذیری هستند.محققان Qualys که این آسیب پذیری را کشف کرده‌اند در مورد آن می‌گویند: “این رخداد امنیتی وظیفه خطیر regression testing برای جلوگیری از ایجاد مجدد آسیب پذیری‌های پیشین را خاطر نشان می‌کند.”

OpenSSH یکی از پرکاربردترین پیاده سازی‌های پروتکل SSH است که برای برقراری ارتباط از راه دور در سیستم‌ عامل‌های لینوکس و BSD استفاده می‌شود. این سرویس بروی تعداد بی‌شماری از سیستم‌هایی که در شبکه داخلی یا اینترنت هستند فعال است و همین موجب نگرانی است.

بررسی عمیق‌تر

این آسیب پذیری در قسمت کنترل کننده SIGALRM که به روشی ناهمزمان چندین تابع حساس سیستمی از جمله syslog() را فراخوانی می‌کند و در صورتی که کانکشن در بازه زمانی مناسب موفق به احراز هویت نشود (LoginGraceTime) عملیاتی را انجام می‌دهد. مهاجم به ایجاد چندین ارتباط SSH با سرور و سپس عدم انجام مراحل احراز هویت می‌تواند کنترل کننده سیگنال OpenSSH را فعال کند تا به صورت ناهمزمان، توابعی را فراخوانی کند. مشکل اینجاست که توابع فراخوانی شده توسط آن برای اجرا به صورت ناهمزمان مناسب نیستند و ممکن است منجر به بروز ناسازگاری در پشته حافظه شود.

هنگامی که این مشکل در سال 2006 گزارش داده شد، از آن به عنوان وضعیت رقباتی (race condition) یاد شد که منجر به نقض سرویس (denial-of-service) می‌شد. این آسیب پذیری قدیمی پتانسیل اجرای کد از راه دور را نیز داشت، اگر چه هیچگاه اثبات نشد که امکان چنین چیزی ممکن است؛ آن هم به این دلیل که مهاجم باید در وضعیت رقباتی پیش آمده پیروز می‌شد که نیاز به چندین بار تلاش برای انجام آن بود.

این آسیب پذیری بار دیگر به دلیل حذف تصادفی قسمت بسیار بحرانی کد که OpenSSH را در برابر این مشکل امن می‌کرد فعال شد. محققان Qualys دست به کار شدند تا اثبات کنند امکان اجرای کد از راه دور در این آسیب پذیری ممکن است یا خیر. در واقع کار آن‌ها سختتر از دفعه پیش بود چرا که از سال 2006 تکنولوژی‌های امنیت حافظه لینوکس پیشرفت کرده بود و ASLR یا Address Space Layout Randomization  امکان سوء استفاده از آسیب پذیری‌ها را دشوارتر می‌کرد.

محققان برای اکسپلویت regreSSHion، یک سیستم لینوکسی که از کتابخانه glibc  و ورژن 32 بیتی که تکنولوژی ASLR آن به دلیل فضای کوچکتر حافظه ضعیف‌تر است استفاده کردند. البته که اکسپلویت کردن سیستم 64 بیت نیز ممکن است ولی کمی سختتر است و توسط محققان انجام نشده است اما به لحاظ تئوری قابل انجام است. اجرای این حمله به طور میانگین نیاز به 6-8 ساعت ارتباط مدوام با سرور دارد. دلیل اصلی این آسیب پذیری استفاده از توابع غیر امنی همچون malloc() و free() است که امکان اجرای همزمان نداشته و در صورتی که کانکشن برقرار شده با سرور پس از گذشتن وقت مقرر شده برای احراز هویت، منجر به بسته شدن ارتباط و آزاد کردن منابع شود؛ توابع یاد شده اجرا خواهند شد. در صورتی که بیش از یک کانکشن به طور همزمان بسته شوند و تابع free() در یک لحظه بیش از یک بار به صورت همزمان فراخوانی شود به یک حالت رقابتی دچار خواهیم شد.

سینگال قطع ارتباط که توسط تابع grace_alarm_handler(int sig) مدیریت می‌شود در صورت دریافت سیگنال قطع ارتباط، تابع packet_close() را فراخوانی می‌کند. تابع اول که به صورت async نوشته شد منجر به فراخوانی تابع free() می‌شود که حالت همزمانی ندارد و در امکان اجرای کد از راه دور با دسترسی root را می‌دهد.

				
					------------------------------------------------------------------------
 302 grace_alarm_handler(int sig)
 303 {
 ...
 307         packet_close();
------------------------------------------------------------------------
 329 packet_close(void)
 330 {
 ...
 341         buffer_free(&input);
 342         buffer_free(&output);
 343         buffer_free(&outgoing_packet);
 344         buffer_free(&incoming_packet);
------------------------------------------------------------------------
 35 buffer_free(Buffer *buffer)
 36 {
 37         memset(buffer->buf, 0, buffer->alloc);
 38         xfree(buffer->buf);
 39 }
------------------------------------------------------------------------
 51 xfree(void *ptr)
 52 {
 53         if (ptr == NULL)
 54                 fatal("xfree: NULL pointer given as argument");
 55         free(ptr);
 56 }
------------------------------------------------------------------------
				
			

رفع آسیب پذیری regreSSHion

این باگ امنیتی در نسخه‌های قبل از OpenSSH 9.8p1 مشاهده شده که به دلیل حذف قسمتی از کد است که در نسخه‌های قبلی برای حل این مشکل اضافه شده بود. بنابراین نسخه 4.4p1 تا 8.5p1 فاقد این آسیب پذیری هستند. پس سریع‌ترین روش حل این مشکل ارتقاء سرویس OpenSSH به نسخه 9.8p1 است. البته ممکن است توزیع مورد استفاده شما به سرعت این وصله امنیتی را در دسترس قرار ندهد در این صورت با تنظیم مقدار صفر برای زمان انتظار احراز هویت (LoginGraceTime) خواهید توانست از اکسپلویت این باگ امنیتی جلوگیری کنید. برای اینکار مسیر فایل پیکربندی ssh را در مسیر زیر با نرم افزار ادیتور مورد علاقه خود باز کنید.

				
					/etc/ssh/sshd_config
				
			

و سپس با افزودن این خط زیر به این فایل مشکل را برطرف کنید.و در نهایت سرویس sshd سرور را ریستارت کنید.

				
					LoginGraceTime 0

--- سرویس را ریستارت کنید ---
systemctl restart sshd.service
				
			

1 دیدگاه

07a2ddecb4b10e0f1fcf3a2f050eab22?s=64&d=mm&r=g

سعید شاهکار · جولای 6, 2024 در 11:20 ق.ظ

سلام
مطلب بسیار مفید و کاربردی بود و همینطور ممنون از راه حل

دیدگاهتان را بنویسید

Avatar placeholder

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *