۱  مقدمه

بر اساس اطلاعات گزارش منتشره توسط شرکت Microsoft با نمایه‎ی MS15-034، آسیب‎پذیری مورد نظر در این گزارش به‎ عنوان یک آسیب‎پذیری اجرای کد اعلام شده است. البته از لغت احتمالا استفاده شده است ولی به ‎دلیل همین احتمال این آسیب‎پذیری به‎ عنوان یک آسیب‎پذیری حساس(۱) ثبت شده است. با این وجود تنها اکسپلویت منجر به منع سرویس این آسیب‎پذیری در دسترس عموم قرار دارد. البته در برخی از فروشگاه‎های اکسپلویت خصوصی، اکسپلویت اجرای کد این آسیب‎پذیری را نیز مشاهده شده است. این آسیب‎پذیری در درایوری HTTP.sys سیستم‎عامل ویندوز قرار دارد. این آسیب پذیری با استفاده از مقدار ارسال شده در سرآیند Range ایجاد می‎شود.

۱-۱  بررسی HTTP.sys

درایور HTTP.sys یک درایور در سطح هسته‎ی(۲) سیستم‎ عامل است که در محصول سرویس‎دهنده‎ی وب IIS به‎ کار گرفته شده است. کار رسمی این درایور گوش ایستادن(۳) برای درخواست‎های HTTP، ردکردن درخواست‎ها به IIS و باز فرستادن درخواست‎های پاسخ داده شده به مرورگر کاربر توصیف شده است. در نتیجه این درایور زیرساخت اتصال بین سرویس‎دهنده‎ی وب و سرویس‎گیرنده را در سیستم‎عامل ویندوز ایجاد می‎نماید. از دلایل ایجاد این زیرساخت در سطح هسته‎ی سیستم‎ عامل علاوه بر دسترسی به بسته‎ی شبکه، افزایش کارایی این فرآیندهاست.

۱-۲  سرآیند range

همان‎طور که قبلا نیز ارائه شد، این آسیب‎پذیری با استفاده از سرآیند range قابل تحریک است. این سرآیند، برای دریافت بخشی از یک منبع کاربرد دارد. به طور مثال شکل زیر، قسمت مشخصی از فایل humans.txt در سایت google را دریافت نموده است.

IIS

۲    تحلیل

یکی از روش‎های تحلیل آسیب‎پذیری تشخیص تفاوت بین نسخه‎ی آسیب‎پذیر و نسخه‎ی اصلاح(۴) شده است. در شکل زیر یکی از تفاوت ‎های بین این دو نسخه که مربوط به این آسیب‎پذیری است را مشاهده می‎کنیم. در این شکل تابع UlpParseRange را نشان می‎دهد که در نسخه‎ی اصلاح شده در برابر سرریز عدد(۵) مقاوم شده است.

b2

در شکل زیر نگاهی عمیق‎تر به نسخه‎ی آسیب‎پذیر تابع UlpParseRange خواهیم انداخت. در این نسخه مقدار رسیده از سرآیند range چک نشده و امکان سرریز عددی وجود دارد.

b3

اگر در شکل بالا دقت کنید، محلی که باید سرریز عددی چک می‎شد و نشده است مشخص شده ‎است. جزییات بیشتر فنی از حوصله این گزارش خارج است.

۲-۱  تشخیص آسیب‎پذیری

برای تشخیص آن‎که سرویس‎دهنده‎ی وب موردنظر شما، آسیب‎پذیری CVE-2015-1635 را دارد یا خیر به سادگی می‎توانید یک درخواست(۶) برای یک منبع ایستا- مانند فایل متنی یا فایل ساده‎ی html- با سرآیند Range به مقدار bytes=0-18446744073709551615 ارسال کنید. در صورتی که جواب مورد نظر، جواب ۴۱۶ Requested Range Not Satisfiable را ارسال کرد، می‎توان گفت که این سرویس‎دهنده‎ی وب آسیب‎پذیر است. با یک فرمان ساده به شرح زیر نیز می‎توان این کار را انجام داد.

curl -H ‘Range: bytes=0-18446744073709551615’ http://TAGET.site/

البته باید این احتمال را هم درنظر گرفت که شما با این کار سرویس‎دهنده‎ی وب را از دسترسی خارج کنید!

۲-۲  ایجاد حمله‎ی منع دسترسی

با مقداردهی سرآیند range به مقدار کمتر از ۰ شما می‎توانید این حمله را شبیه‎سازی کنید. کد زیر، به زبان پایتون این حمله را به صورت خودگار انجام می‎دهد.

b4

۲-۳  ایجاد حمله‎ی افشای اطلاعات

در برخی از نگارش‎ها دیده شده است که از کاربری سرآیند range استفاده شده است که بیشتر از اندازه‎ی منبع مورد درخواست می‎شود. برای در یافت بیشتر مطلب به شکل‎های زیر توجه کنید.

b5

۲-۴  اصلاحیه

در اصلاحیه‎ی شرکت ماکروسافت برای این آسیب‎پذیری توابع زیر اضافه ‎شده است و اصلاح این آسیب‎پذیری با یک چک ساده‎ی سرریز عددی توسط تابع RtlULongLongAdd اتفاق افتاده‎ است.

b6b7

منابع

  1. http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture
  2. https://www.exploit-db.com/exploits/36776

(۱) critical
(۲) Kernel mode
(۳) Listen
(۴) patch
(۵) Integer overflow
(۶) Request