مقدمه

حمله‌ی DROWN به‌تازگی توسط تیمی از پژوهشگران دانشگاهی کشف‌شده است، این حمله از نوع فردی-در-میان بوده و در صورت اجرای صحیح آن، مهاجم توانایی واضح کردن ارتباط یک نشست TLS را به دست خواهد آورد. هزینه انجام این حمله در حالت عمومی آن توسط پژوهشگران مقدار ۴۴۰ دلار و زمان ۸ ساعت بر روی یک سرور Amzon EC2 اعلام‌شده، حالت خاصی از حمله نیز وجود دارد که در صورت وجود آسیب‌پذیری خاصی در OpenSSL سرور، زمان انجام این حمله بسیار کوتاه‌تر می‌شود.

ساختار حمله

درصورتی‌که وب سرور تنظیم‌شده باشد تا از SSLv2 استفاده کند، نسبت به حمله‌ی DROWN آسیب‌پذیر است. OpenSSL دارای یک ویژگی در تنظیمات خود است که اجازه‌ی غیرفعال کردن استفاده از رمزهای ضعیف –نسخه‌های صادراتی- SSLv2 را می‌دهد؛ اما متأسفانه این مسئله اتفاق نمی‌افتد. پژوهشگران DROWN مشاهده کردند که حتی در صورت تنظیم این ویژگی بازهم سرویس‌گیرنده می‌تواند درخواست یک ارتباط SSLv2 با هر سیستم رمزی را بدهد و سرور نیز آن را قبول می‌کند.

عامل دیگر موفقیت این حمله استفاده از یک گواهی دیجیتال برای یک یا چند سرور است که حداقل یکی از آن‌ها از SSLv2 استفاده کند. به دلیل استفاده از کلید خصوصی مشترک بین آن‌ها امکان حمله به TLS از طریق SSLv2 وجود دارد. درواقع DROWN یک حمله‌ی بین پروتکلی است. این حمله از باگ‌های یک پروتکل (SSLv2) استفاده می‌کند تا به ارتباطات سایر پروتکل‌ها (TLS) حمله شود.

DROWN

این آسیب‌پذیری به شیوه padding سیستم رمز RSA پیاده شده در همه‌ی نسخه‌های SSLv2 مربوط می‌شود که با عنوان RSA-PKCS#1v1.5 شناخته می‌شود. در دهه ۹۰ حمله‌ای توسط Bleichenbacher بر روی این طرح داده شد که منجر به ترجمه‌ی اطلاعات RSA آن می‌شد. این حمله با استفاده از پاسخ آری یا نه سرور به‌عنوان یک oracle به پیام‌های رمز شده‌ی دلخواه مهاجم که نشان‌دهنده‌ی فرمت صحیح یا غلط پیام رمز شده است بناشده است.

1ntitled

در این حمله، پیام رمز شده‌ی سرویس‌گیرنده به سرور یعنی c = me (modn)a که حاوی pms یا Pre-Master Secret مورداستفاده برای ساخت کلید نشست TLS است و با کلید عمومی سرور رمز شده است توسط مهاجم شنود شده. سپس مهاجم با استفاده از حمله‌ی Bleichenbacher مقدار آن را به دست خواهد آورد. در حمله‌ی Bleichenbacher مهاجم ابتدا ایجاد تعداد زیادی متن رمز شده‌ی مرتبط با متن رمز دیده‌شده را می‌سازد و به سرور ارسال می‌کند یعنی c`= se*c (modn)a که برابرc`=(s*n)e(modn)a است و s ها دلخواه هستند. در ادامه سرور پس از ترجمه آن‌ها با کلید خصوصی خود به مقدار sm می‌رسد و بررسی می‌کند که آیا دارای فرمت استاندارد هستند یا نه و پاسخ خود را می‌دهد. مهاجم با ارسال تعداد زیادی از این پیام‌ها دقت خود را بالاتر برده تا به مقدار اصلی دست پیدا کند و پیام اصلی ترجمه را ترجمه کند. جزئیات بیشتر در مقاله‌ی DROWN موجود می‌باشد.

drown-attack

در TLS از PMS به‌طور مستقیم در ساخت کلید نشست استفاده نمی‌شود بلکه پس از اعمال توابع پرقدرت hash و واردکردن تعدادی مقدار random کلید اصلی ساخته می‌شود که انجام حمله به آن را غیرممکن می‌سازد.

اما در SSLv2 پیامی با عنوان PMS وجود ندارد و مقدار رمز شده‌ی ارسالی از سرویس‌گیرنده درواقع خود کلید اصلی است و مستقیماً در تولید کلید نشست مورداستفاده قرار می‌گیرد. علاوه بر این در نسخه‌های استاندارد معروف به صادراتی، کلید اصلی باید کمتر از ۴۰ بیت باشد و با رمزهای ضعیف باید رمز شود. درنتیجه پس از انجام حمله Bleichenbacher، به دست آوردن کلید نشست بسیار آسان‌تر خواهد بود.

میزان خطر

برای انجام این حمله به یک نشست TLS، مهاجم پس از شنود یک handshake باید چندین هزار درخواست را به یک سرور SSLv2 بدهد و تا بتواند آن را واضح کند. حمله‌ی عمومی DROWN درواقع نیاز به بررسی حدود ۱۰۰۰ TLS handshake برای پیدا کردن یک متن رمز RSA آسیب‌پذیر است و در ادامه نیاز به ۴۰۰۰۰ درخواست به سرور و محاسبه‌ی آفلاین برای به دست آوردن کلید نشست دارد.

حمله‌ی شرح داده‌شده در بالا با عنوان حمله عمومی DROWN شناخته می‌شود؛ اما پژوهشگران DROWN اعلام کرده‌اند که نوع خاصی از این حمله نیز وجود دارد که با سرعت بسیار بالاتر و در حد یک دقیقه امکان‌پذیر است. این حمله بر اساس یک باگ در بخش پردازش کلید OpenSSL که با عنوان (CVE-2015-0293) شناخته می‌شود انجام می‌شود که کار حمله‌ی DROWN را بسیار راحت می‌کند.

آزمایش آسیب‌پذیری سرور

با مراجعه به آدرس زیر و واردکردن آدرس سایت می‌توان از آسیب‌پذیر بودن آن نسبت به DROWN اطلاع پیدا کرد.

https://test.drownattack.com

راهکار امن سازی

دوعاملی که تأثیرگذاری DROWN را بسیار زیاد ساخته‌اند عبارت‌اند از: استفاده از کلید مشترک برای سرویس‌های مختلف. برای مثال، DROWN در صورت پشتیبانی میل سرور از SSLv2 و اشتراک کلید و گواهی آن با سرور HTTPS می‌تواند سرویس HTTPS را موردحمله قرار دهد.

دوم: باگ خطرناکOpenSSL (CVE-2016-0703)a که در توزیع مارس ۲۰۱۵ اصلاح شد و در صورت عدم به‌روزرسانی، حمله‌ی خاص DROWN که در چند دقیقه انجام‌پذیر است را امکان‌پذیر می‌کند.

غیرفعال کردن SSLv2 به‌روزرسانی فوری، اقدامات ضروری برای مقابله با این آسیب‌پذیری هستند.

برای غیرفعال کردن SSLv2 :

Microsoft IIS:

https://www.sslshopper.com/article-how-to-disable-ssl-2.0-in-iis-7.html

Apache, nginx, postfix:

https://www.openssl.org/blog/blog/2016/03/01/an-openssl-users-guide-to-drown

منابع

  1. https://drownattack.com/drown-attack-paper.pdf
  2. blog.cryptographyengineering.com/2016/03/attack-of-week-drown.html
  3. http://crypto.stackexchange.com/questions/12688/can-you-explain-bleichenbachers-cca-attack-on-pkcs1-v1-5
  4. https://www.openssl.org/blog/blog/2016/03/01/an-openssl-users-guide-to-drown