در ماه اوت ۲۰۱۶، Shi Lei از شرکت Qihoo 360 و گروه تحقیقاتی Gear یک مشکل Denial of Service را بر روی OpenSSL کشف کرد که در هنگام اداره کردن هشدارهای تعریف نشده “SSL3_AL_WARNING” توسط OpenSSL به وجود می‌آید.

این مشکل ، CVE-2016-8610 نام‌گذاری شده است و به ‘SSL-Death-Alert’ شناخته می‌شود.

گروه Gear می‌گوید که این آسیب‌پذیری را به گروه OpenSSL در اوایل ماه سپتامبر ۲۰۱۶ گزارش کرده است و گروه OpenSSL به آن‌ها گفته است که این مسئله به عنوان یک مشکل امنیتی در نظر گرفته نمی‌شود اما آن‌ها اجازه دادند که در این مورد با هرکسی که مد نظرشان است می‌توانند مشورت کنند.

به هر حال، این مشکل در وصله امنیتی که در تاریخ ۲۲ سپتامبر منتشر شده بود، حل شد.

با این حال، محققان امنیتی بهره‌برداری‌های مربوط به این آسیب‌پذیری را منتشر کردند چراکه آن‌ها می‌خواهند حقیقت فاش شود.

با بررسی بیشتر در مورد این آسیب‌پذیری، متوجه می‌شویم که این مشکل به‌سادگی می‌تواند باعث حمله DoS در سیستم‌هایی که از OpenSSL به منظور پشتیبانی از SSL استفاده می‌کنند، شود (مانند Ngnix). برای مثال بازدیدکنندگان، وب‌سایت‌هایی که توسط Ngnix طراحی شده است را نمی‌توانند باز کنند تا وقتی که این حمله متوقف شود.

با توجه به گسترش بهره‌برداری از ترکیب nginx و OpenSSL در وب‌سرورهای امروزی، آسیب‌پذیری کشف شده تأثیر زیادی بر روی وب‌سایت‌های مختلف خواهد داشت.

بعد از بررسی‌های انجام شده توسط گروه Gear و گروه امنیتی محصولات Red Hat این آسیب‌پذیری کشف شده تأیید شد و به‌تمامی گروه‌های ngnix و توزیع لینوکس گزارش شد[۱].

این مشکل در تمامی نسخه‌های‌ ۱٫۰٫۱ و ۰٫۹٫۸ و نسخه ۱٫۱٫۰ و نسخه های ۱٫۰٫۲ تا ۱٫۰٫۲h وجود دارد.

۱    میزان تأثیر آسیب‌پذیری CVE-2016-8610

۱-۱    جدول تأثیر آسیب‌پذیری بر اساس شاخص شدت و معیارهای [۲]CVSS v2.0

CVE-2016-8610

۲-۱    جدول تأثیر آسیب‌پذیری بر اساس شاخص شدت و معیارهای [۲]CVSS v3.0

CVE-8610_222

۲    آنالیز آسیب‌پذیری CVE-2016-8610

اخیراً یک وصله امنیتی برای یک آسیب‌پذیری که SSL Death Alert نام‌گذاری شده است توسط OpenSSL منتشر شد[۳]. در میان دیگر آسیب‌پذیری‌های امنیتی، این آسیب‌پذیری توجه بیشتری را به خود اختصاص داده است چراکه توسط بهره‌برداری از آن می‌توان یک حمله DoS را بر روی یک سرویس‌دهنده OpenSSL موجب شد. تیم تحقیقاتی آسیب‌پذیری IPS که متعلق به شرکت McAfee است، این آسیب‌پذیری را آنالیز کرده است[۴].

برای شروع آنالیز این آسیب‌پذیری، مقایسه وصله منتشر شده و کدهای افزوده شده به آن و نسخه‌ آسیب‌پذیر به این آسیب‌پذیری انجام شده است.

CVE-8610_3

با توجه به تغییراتی که در کد مربوطه انجام شده است، چندین فایل اصلاح شده است تا این مشکل برطرف شود.

بررسی اختلاف کد قرار داده شده در وصله امنیتی منتشر شده در بخش include/openssl/ssl.h نشان می‌دهد که یک کد هشدار دهنده جدید با نام SSL_R_TOO_MANY_WARN_ALERTS (409) معرفی شده است.

CVE-8610_4

در بخش ssl/record/record_locl.h، می‌توان متوجه شد که دستور دهنده‌ی MAX_WARN_ALERT_COUNT معرفی شده است و مقدار آن ۵ قرار داده شده است.

CVE-8610_5

حالا اجازه دهید تا به وصله منتشر شده واقعی نگاهی بیندازیم گه در فایل‌های ssl/record/rec_layer_d1.c و ssl/record/rec_layer_s3.c قرار داده شده است.

عکس‌های که در زیر آمده است تغییرات وصله را در این دو فایل نشان می‌دهند.

فایل ssl/record/rec_layer_d1.c:

CVE-8610_6

فایل ssl/record/rec_layer_s3.c:

CVE-8610_7

همان‌طور که مشاهده می‌شود، وصله منتشر شده خیلی ساده است. این وصله به راحتی لایه‌های متوالی مربوط به هشدارهای SSL3_AL_WARNING را می‌شمارد و بررسی می‌کند که این تعداد بیشتر از ۵ شده است یا نه. اگر این عدد بیش از ۵ شود، پیغام خطا را نمایش می‌دهد.

۱-۲    بهره‌برداری از آسیب‌پذیری CVE-2016-8610

برای کشف و جلوگیری از حمله DoS، یک اثبات ادعا در اینجا آورده شده است. اگرچه، هیچ بهره‌برداری عمومی در ارتباط با این آسیب‌پذیری منتشر نشده است اما در این بخش جزئیات فنی کاملی آورده شده است. برای بهره‌برداری از این مشکل، ما باید یک  SSL handshake اولیه را آغاز کنیم. به عنوان یک بخش از handshake، مهاجم باید پاکت واقعی  Client Hello را برای سرویس‌دهنده ارسال کند. اسکرین‌شات‌هایی که در ادامه آمده است، نشان‌ می‌دهد که یک پاکت، مرحله اول از بهره‌برداری را تسخیر می‌کند. این پاکت، یک پاکت عادی Clinet Hello است.

CVE-8610_8

برای خسته کردن CPU، ما نیاز داریم تا تعداد زیادی از پاکت‌های هشداردهنده SSL3_AL_WARNING و دستکاری شده را برای سرویس‌دهنده ارسال کنیم. بدین منظور، ما باید ساختار یک پاکت هشداردهنده را شناسایی کنیم. این پیام‌ها به نظر می‌رسد که شبیه موارد زیر باشد[۵].

CVE-8610_9

یک پیغام هشداردهنده می‌تواند رمزگشایی شود، اما در این مورد ما باید یک اخطار متنی را به سرویس‌دهنده آسیب‌پذیر ارسال کنیم.

اسکرین‌شات زیر پاکت‌های تسخیر شده SSL3_AL_WARNING را در محیط تست شده نشان می‌دهد:

CVE-8610_10

در مرحله بعد هشدارهای متعددی در داخل یک رکورد واحد مشاهده می‌شود.

CVE-8610_11

ساختار پاکتِ هشدار شبیه به این است:

CVE-8610_12

به منظور بهره‌برداری از این آسیب‌پذیری، یک سرویس‌دهنده آزمایشی به همراه OpenSSL و یک گواهی‌نامه خود امضا و کلید خصوصی، تنظیم شده است. اسکرین‌شات‌هایی که در ادامه آمده است نشان می‌دهد که سرویس دهنده پورت ۴۴۴۳ را Listen کرده و با یک سرویس‌گیرنده SSL ارتباط برقرار کرده است.

CVE-8610_13

در هنگام ارتباطات عادی SSL بین سرویس‌دهنده و سرویس‌گیرنده، هیچ چیز غیرعادی مشاهده نمی‌شود که مرتبط با مصرف CPU در فرآیندهای سرویس‌دهنده باشد.

CVE-8610_14

اما به‌محض اجرای این بهره‌برداری در برابر سرویس‌دهنده، ما به سرعت مشاهده می‌کنیم که فرآیند سرویس‌دهنده متوقف شده و این‌گونه واکنش نشان می‌دهد که مصرف CPU به ۹۹ درصد می‌رسد و پس از چند ثانیه به ۱۰۰ درصد.

CVE-8610_15

این CPU spike موجب یک  denial of service توسط سرویس دهنده OpenSSL خواهد شد که آن را غیرقابل‌دسترس خواهد کرد. در محیط تست شده مورد نظر، ما متوجه شدیم که سرویس‌دهنده SSL به محض متوقف شدن ارسال پاکت‌های مخرب، دوباره به کار می‌افتد.

مدیران سیستم‌ها باید هر چه زودتر وصله امنیتی مورد نظر[۶] را بر روی سرویس‌دهندگان OpenSSL اجرا کنند.

۳    سؤالات متداول مربوط به آسیب‌پذیری CVE-2016-8610

  1. به طور خلاصه این آسیب‌پذیری چکار می‌کند؟

این امر مشخص شده است که  “ssl3_read_bytes” در ssl/s3_pkt.c ممکن است منجر به افزایش استفاده بیش از حد از CPU می‌شود که این امر از اداره نادرست پاکت‌های هشداردهنده ناشی می‌شود.

یک مهاجم می‌تواند پاکت‌های هشداردهنده متون تعریف نشده “SSL3_AL_WARNING”را در هنگام handshake تکرار کند که در نهایت منجر به استفاده ۱۰۰ درصد از CPU بر روی سرویس دهنده شود.

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

بنابراین مهاجم می‌تواند چندین هشدار را در داخل یک رکورد واحد pack کند و تعداد زیادی از این رکوردهای بزرگ را ارسال کند.

در مرحله بعد، سرویس‌دهنده در داخل یک لوپ گرفتار می‌شود و از دسترس دیگران خارج می‌شود.

  1. اقدامات متقابل در برابر این آسیب‌پذیری چیست؟

شما می‌توانید به‌روزرسانی‌های نرم‌‌افزاری مربوطه را از شرکت‌های مربوطه دریافت کنید. این به‌روزرسانی‌ها در لینک‌های زیر آورده شده است:

OpenSSL [2]

Debian [7]

Redhat/CentOS [8]

  1. این آسیب‌پذیری باعث به وجود آمدن چه مشکلی می‌شود؟

مهاجم می‌تواند پاکت‌های هشدار overlapping بزرگ (چندین هشدار در داخل یک رکورد واحد) را ارسال کند و باعث یک حمله DoS علیه سرویس‌دهنده شود.

  1. دامنه تأثیر این آسیب‌پذیری در چه حد است؟

این آسیب‌پذیری بر روی بیشتر نسخه‌های OpenSSL تأثیرگذار است. هر سرویس‌دهنده‌ای که از SSL پشتیبانی می‌کند و از OpenSSL بدین منظور استفاده می‌کند، در معرض این آسیب‌پذیری قرار دارد. برای مثال Nginx می‌تواند در معرض خطر این آسیب‌پذیری قرار داشته باشد.

  1. چه نسخه‌هایی از OpenSSL آسیب‎پذیر هستند؟

نسخه‌های آسیب‌پذیر عبارت‌اند از:

  • OpenSSL All 0.9.8
  • OpenSSL All 1.0.1
  • OpenSSL 1.0.2 through 1.0.2h
  • OpenSSL 1.1.0

نسخه‌هایی که آسیب‌پذیر نیستند عبارت‌اند از:

  • OpenSSL 1.0.2i, 1.0.2j
  • OpenSSL 1.1.0a, 1.1.0b
  1. چگونه می‌توان از حملات ناشی از این آسیب‌پذیری جلوگیری کرد؟

نرم‌افزار خود را به آخرین نسخه، به‌روزرسانی کنید.

  1. آیا نیاز به تولید مجدد کلیدهای خصوصی یا گواهی‌نامه‌ها وجود دارد؟

خیر. مهاجم قادر به دزدیدن کلیدهای خصوصی شما از طریق این آسیب‌پذیری نخواهد بود.

  1. آیا این آسیب‌پذیری به علت عیب موجود در SSL/TLS به وجود آمده است؟

احتملا.

  1. کدام پروتکل‌ها در معرض این آسیب‌پذیری قرار دارند؟

تمامی نسخه‌ها شامل SSL3.0، TLS1.0، TLS1.1 و TLS1.2 آسیب‌پذیر هستند.

  1. چه الگوریتم‌های رمزنگاری نسبت به این مشکل آسیب‌پذیر هستند؟

تمامی الگوریتم‌های رمزنگاری آسیب‌پذیر هستند. این مشکل به یک الگوریتم خاص مرتبط نمی‌شود.

  1. آیا احتمال آگاه شدن از این حمله در هنگام اتفاق افتادن علیه یک سرویس‌دهنده وجود دارد؟

به طور مطمئن نمی‌توان پاسخ این سؤال را داد. امکانش وجود دارد ولی قطعی نیست[۹ و ۱۰].

۴    منابع

[۱] http://seclists.org/oss-sec/2016/q4/224

[۲] https://access.redhat.com/security/cve/cve-2016-8610

[۳]https://git.openssl.org/gitweb/?p=openssl.git;a=commit;h=af58be768ebb690f78530f796e92b8ae5c9a4401

[۴]https://securingtomorrow.mcafee.com/mcafee-labs/ssl-death-alert-cve-2016-8610-can-cause-denial-of-service-to-openssl-servers/

[۵] https://tools.ietf.org/html/rfc5246#page-29

[۶]https://git.openssl.org/gitweb/?p=openssl.git;a=patch;h=af58be768ebb690f78530f796e92b8ae5c9a4401

[۷] https://www.openssl.org/source/

[۸] https://security-tracker.debian.org/tracker/CVE-2016-8610

[۹] http://security.360.cn/cve/CVE-2016-8610/

[۱۰] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8610