آسیب‌پذیری تشدید امتیاز هسته ویندوز (CVE-2016-7255) توجه رسانه‌های زیادی را به خود جلب کرد. شرکت مایکروسافت در ماه نوامبر به‌روزرسانی‌های مربوطه را برای این آسیب‌پذیری ارائه داده است که به نام MS16-135 شناخته می‌شود[۱]. مطابق نظر شرکت مایکروسافت، این آسیب‌پذیری برای انجام یک حمله هدفمند استفاده شده بود. مطابق نظر مایکروسافت و گوگل، گروه هکری روسی به نام APT28 از یک آسیب‌پذیری Flash (CVE-2016-7855) همراه با آسیب‌پذیری تشدید امتیاز هسته برای انجام یک حمله هدفمند استفاده کرده‌اند.

هفته گذشته گروه تجزیه و تحلیل تهدید گوگل، این آسیب‌پذیری هسته ویندوز (CVE-2016-7255) را به صورت عمومی فاش کرد که در حال حاضر اصلاح شده است.

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

این آسیب‌پذیری، تمامی نسخه‌های ویندوز شامل ویندوز ویستا تا نسخه کنونی ویندوز ۱۰ را تحت تأثیر قرار داده است و مایکروسافت در اصلاحیه منتشر شده در روز سه‌شنبه (۸ نوامبر ۲۰۱۶)، این اشکال را برطرف کرده است.

بر اساس بولتن امنیتی شرکت مایکروسافت که در روز ۹ نوامبر ۲۰۱۶ منتشر شد، هر مهاجمی که قربانیان را گول بزند تا برنامه‌های خاص دستکاری شده را اجرا کنند، می‌تواند به صورت موفقیت‌آمیزی از این نقص سیستم بهره‌برداری کند و توانایی نصب نرم‌افزارها، مشاهده، تغییر و پاک کردن اطلاعات و یا ساختن کاربران جدید با دسترسی مدیریتی را پیدا می‌کند.

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

این آسیب‌پذیری در دسته‌بندی آسیب‌پذیری‌های مهم قرار داده شده و توسط گروه Strontium (که به Fancy Bear، APT 28 و Sofacy نیز در حملات انجام شده مشهور هستند) مورد بهره‌برداری قرار گرفته است.

بنابراین، به شدت به کاربران خانگی و شرکت‌ها توصیه می‌شود که ویندوز مورد استفاده توسط آن‌ها کاملاً به‌روز باشد[۲].

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

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

CVE-2016-7255

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

PHPMailer2

۲    تحلیل آسیب‌پذیری CVE-2016-7255

درایور‌های مد هسته در نسخه‌های زیر از ویندوز شرکت مایکروسافت، به کاربران محلی اجازه می‌دهد تا بتوانند از طریق برنامه‌های خاصی، حق دسترسی خود را افزایش دهند[۴].

  • Windows Vista SP2, Windows Server 2008 SP2 and R2 SP1, Windows 7 SP1, Windows 8.1, Windows Server 2012 Gold and R2, Windows RT 8.1, Windows 10 Gold, 1511, and 1607, and Windows Server 2016

تیم تحقیقاتی آسیب‌پذیری آزمایشگاه McAfee زمان قابل توجهی را صرف تحلیل این آسیب‌پذیری کرده‌اند که در ادامه این گزارش قسمتی از آن را بیان خواهیم کرد[۵].

در ابتدا بررسی‌ای روی وصله امنیتی MS16-135 مربوطه انجام شده است و آن‌ها متوجه شدند که این وصله امنیتی، فایل win32k.sys را روی سیستم هدف به‌روزرسانی می‌کند. این تحقیقات با بررسی باینری دو فایل win32k.sys (قبل و بعد از نصب وصله‌ موردنظر) ادامه یافت. این موضوع قابل توجه است که سیستم آزمایشی آن‌ها دارای ویندوز ۷ نسخه ۶٫۱٫۷۶۰۱٫۲۳۵۸۴ بوده است.

با نگاه کردن به تفاوت‌ها در فایل‌های باینری، می‌توان متوجه شد که توابع زیر تغییر کرده‌اند:

PHPMailer3

بعد از انجام تحقیقات مقدماتی، این تیم به این نتیجه رسید که وصله مربوط به آسیب‌پذیری CVE-2016-7255، تنها در تابع xxxNextWindow در win32k.sys استفاده شده بود.

تصویر زیر، یک دید خیلی سطح بالا از تغییرات انجام شده در تابع xxxNextWindow(x,x) را نشان می‌دهد:

PHPMailer4

در سمت چپ شکل بالا، تابع به روز شده را مشاهده می‌کنید و همان‌طور که در مقایسه با تابع اصلی نشان داده شده است، تغییراتی در این تابع اعمال شده است که با رنگ قرمز قابل مشاهده است. در شکل زیر که قسمت اول تغییرات در کد جدید را نشان می‌دهد، مشاهده می‌شود که این مقدار eax+0x23 را مقایسه می‌کند.

PHPMailer5

همین‌طور موارد مشابهی را در تغییر بعدی انجام شده می‌توانیم مشاهده کنیم.

PHPMailer6

در اینجا نگاهی به نسخه decompile شده xxxNextWindow(x,x…) در کد اصلی (قبل از نصب وصله) می‌اندازیم:

PHPMailer7

بعد از نصب وصله موردنظر، تابع xxxNextWindow (x,x…) چیزی شبیه عکس زیر است:

PHPMailer8

بعد از نصب وصله امنیتی، وارسی پارامتر‌(۱) با دستور شرطی “(*(_BYTE *)(v8 + 0x23) & 0xC0) != 0x40” ارتقا پیدا کرده است.

در این دستور جدید، متغیر v8(در eax)، مقدار برگشتی از فراخوانی قبلی GetNextQueueWindow است. در شکل زیر مشاهده می‌شود که مقدار v8 از فراخوانی به صورت زیر به دست می‌آید:

v8 = _GetNextQueueWindow(v7, v31, 1);

PHPMailer9

نگاهی گذرا به پیاده‌سازی GetNextQueueWindow(x,x,x,…) نشان می‌دهد که این تابع در واقع یک اشاره‌گر به ساختار tagWND را برمی‌گرداند.

تصویر زیر ساختار tagWND را در windbg نشان می‌دهد:

PHPMailer10

این تیم، با تحلیل این کد متوجه شدند که آفست ۰x78 در ساختار tagWND، مرتبط با این آسیب‌پذیری است. خطوط زیر که مربوط به کد decompile شده تابع xxxNextWindow قبل از نصب وصله مورد نظر است، نشان می‌دهد که فیلد در آفست ۰x78 مرتبط با آسیب‌پذیری ذکر شده است:

PHPMailer11

حال اگر کسی بتواند مقدار v8+0x78 را کنترل کند، قادر خواهد بود تا در آدرس دلخواه در هسته بنویسد و این امر به صورت بالقوه می‌تواند امتیازات را ارتقا دهد. خوشبختانه یک API در مد کاربر (NtSetWindowLongPtr) وجود دارد تا یک مقدار دلخواه را در این نقطه قرار دهد.

در تصویر زیر، نشان داده شده است که مقداری که (۰x41414141) به NtSetWindowLongPtr پاس داده شده و در ساختار tagWND منعکس شده است و این امر نوشتن در حافظه دلخواه را توسط این آسیب‌پذیری آسان می‌کند.

PHPMailer12

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

HWND hwnd = CreateWindowEx(0, L”TestWnd”, ۰, WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CHILD, 5, 5, 1, 1, hWndParent, 0/*hMenu */, h, 0);

SetWindowLongPtr(hwnd, GWLP_ID,/*0xfffffff4=GWLP_ID*/ 0x41414141);

PHPMailer13

در تصاویر قبل، خروجی اشکال‌زدایی نشان داده شده است. در اینجا، ثبات ebx، اشاره‌گر به ساختار tagWND است و یک تخطی در نوشتن خیلی زود رخ خواهد داد. همانند چیزی که در شکل زیر می‌توان دید، مقصد دستورالعمل متخلف(۲) فقط آدرسی (به اضافه ۰x14) است که قبلاً از طریق API (NtSetWindowLongPtr) پاس داده شده است و این کاملاً یک حمله نوشتن در آدرس دلخواه(۳) را نشان می‌دهد.

PHPMailer14

وصله مربوطه در مایکروسافت با بررسی مقدار در آفست ۰x23 از ساختار tagWND شروع می‌شود. بعد از نصب وصله مورد نظر، دستور جدید زیر مشاهده می‌شود:

(*(_BYTE *)(v8 + 0x23) & 0xC0) != 0x40

در هنگام مواجهه با نسخه وصله شده از این تابع، ebx به tagWND از ساختار ebx + 0x23 = 0x54 اشاره می‌کند:

۰x54 & 0xc0 = 0x40 ;(1)  ,  ۰x40 != 0x40 (2) ;

حالا این دستور نادرست می‌شود. بنابراین، برنامه از خطوط زیر که تلاش می‌کنند تا حافظه را تغییر دهند رد می‌شود و از crash شدن برنامه جلوگیری می‌کند (نقض دسترسی نوشتن).

*(_DWORD *)(*(_DWORD *)(v30 + 0x78) + 0x14) &= 0xFFFFFFFB;

*(_DWORD *)(*(_DWORD *)(v8 + 0x78) + 0x14) |= 4u;

چگونه می‌توان از این آسیب‌پذیری به منظور افزایش سطح دسترسی، بهره‌برداری کرد؟ به جای اجازه دادن برای نوشتن یک مقدار دلخواه در یک آدرس دلخواه، این آسیب‌پذیری می‌تواند تنها یک بیت را تغییر دهد. به این معنا که، مقدار آدرس ۰x04 یا مضارب آن مانند آنچه در زیر بیان شده است، خواهد بود:

Value = Value | 0x04;

Value = Value | 0x0400;

Value = Value | 0x040000

Value = Value | 0x04000000

در این مورد اگر مهاجم بتواند یک آرایه مشخص از اشیاء را در زمین هسته پیدا کند و شاخص آرایه‌های اشیاء را از طریق logical OR primitive افزایش دهد (مثلاً tagWnd->cbWndExtra) موجب دسترسی خارج از محدوده خواهد شد و مهاجم قادر خواهد بود آدرس‌های خواندن یا نوشتن دلخواه را از مد کاربر به دست آورد (توسط استفاده کردن از بعضی از APIهای مد کاربر).

امروزه افزایش سطح دسترسی با استفاده از آسیب‌پذیری مد هسته همچنان شاخص اصلی برای شکستن sandboxهای برنامه‌هاست (EPM که مربوط به اینترنت اکسپلورر است و AppContainer که مربوط به Edge می‌شود.) این روش توسط موارد موفقیت‌آمیز بهره‌برداری در سطح اینترنت با هدف قرار دادن اینترنت اکسپلورر، Edge، Adobe Reader و فلش، ثابت شده است. در مقابل نسخه‌های کنونی ویندوز با چندین لایه دفاعی، فرار از sandbox  توسط یک افزایش سطح دسترسی هسته همچنان انتخاب اول مهاجمین است. KeUsermodeCallback  مورد استفاده قرار می‌گیرد و یک نوع خیلی محبوب از آسیب‌پذیری حالت هسته ویندوز است که می‌تواند منجر به اجرای کد حالت هسته شود، همان‌طور که در آسیب‌پذیری‌های CVE-2014-4113 و CVE-2015-0057 دیده شده است. در حال حاضر مایکروسافت بر روی آسیب‌پذیری‌های هسته کار می‌کند و افزودن ویژگی‌های امنیتی منجر به کاهش این نوع حملات شده است. در پاسخ، مهاجمان شروع به بررسی آسیب‌پذیری‌های GDI و font هسته کرده‌اند. در حال حاضر ویندوز ۱۰ درخواست‌های win32 را در Edge محدود کرده است که به طور قابل توجهی سطح حملات را کاهش داده است. همچنین مایکروسافت مشکل افشای داده‌های حافظه هسته را برطرف کرده است که این مشکل اهرمی برای جدول مدیریت GDI‌های به اشتراک گذاشته شده بود. بدون شک، بهره‌برداری هسته نسبت به قبل سخت‌تر شده است. با این حال، پیش‌بینی می‌شود که مهاجمان همچنان از  win32k به عنوان سطح حمله اصلی استفاده می‌کنند تا هسته را بهره‌برداری کنند تا به اجرای کد یا افزایش سطح دسترسی نائل شوند. البته توجه به این نکته حائز اهمیت است که این آسیب‌پذیری همچنان در حال تحقیق و بررسی است[۶-۸].

۳    منابع

[۱] https://technet.microsoft.com/en-us/library/security/ms16-135.aspx

[۲] http://thehackernews.com/2016/11/microsoft-windows-update.html

[۳] https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-7255

[۴] http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-7255

[۵] https://securingtomorrow.mcafee.com/mcafee-labs/digging-windows-kernel-privilege-escalation-vulnerability-cve-2016-7255/

[۶] https://security.googleblog.com/2016/10/disclosing-vulnerabilities-to-protect.html

[۷] https://threatpost.com/microsoft-says-russian-apt-group-behind-zero-day-attacks/121722/

[۸] http://securityaffairs.co/wordpress/53242/hacking/cve-2016-7255-zero-day.html


(۱) parameter verification
(۲) offending instruction
(۳) arbitrary address write attack