پرش به محتوا

حمله‌های مبتنی بر سواستفاده از تابع بازگشت از سیگنال: تفاوت میان نسخه‌ها

از ویکی‌پدیا، دانشنامهٔ آزاد
محتوای حذف‌شده محتوای افزوده‌شده
ایجاد شده توسط ترجمهٔ صفحهٔ «Sigreturn-oriented programming»
برچسب‌ها: افزودن نویسهٔ تکراری [محتوا] [محتوا ۲]
(بدون تفاوت)

نسخهٔ ‏۲۱ ژوئیهٔ ۲۰۲۰، ساعت ۰۷:۰۹

Sigreturn-oriented programming یا به اختصارSROP یک نوع روش نفوذ (exploit) است که به مهاجم اجازه می‌دهد تا کد دلخواه خود را در شرایطی اجرا کند که مکانیزم‌های امنیتی مانند حافظه‌ی غیرقابل اجرا (non-executable memry) و امضای کد (code signing) در سیستم وجود داشته باشد.[۱] . این روش برای اولین بار در سی‌وپنجمین کنفرانس IEEE Security and Privacy در سال 2014 مطرح شد که توانست برنده‌ی عنوان بهترین مقاله‌ی دانشجویی شود. [۲] پیش‌فرض‌ها و ایده‌ی کلی این روش مشابه روش (ROP)return-oriented programming است: مهاجم کنترل پشته (stack) را با روش‌هایی مثل استفاده از آسیب‌پذیری «خطای سرریز حافظه‌ی پشته» به دست می‌گیرد و با استفاده از پشته، بر جریان اجرای دستورهای برنامه تاثیر می‌گذارد که این کار توسط دنباله‌ای از دستورها که gadget نام دارند انجام می‌شود. این حمله به‌این‌صورت انجام می‌گیرد که مهاجم یک داده‌ساختار sigcontext جعلی [۳] در بالای پشته قرار می‌دهد و آدرس بازگشت تابع را به یک gadget تغییر می‌دهدکه این gadget فراخوان سیستمی sigreturn [۴] را صدا می‌زند[۵]. معمولا یک gadget برای موفقیت این حمله کفایت می‌کند (برعکس ROP که معمولا از زنجیره‌ای از gadgetها استفاده می‌کند). درصورتی‌که محل این gadget در حافظه‌ی مجازی فرایند مورد نظر ثابت باشد این حمله بسیار ساده و موثر انجام می‌گیرد (مثلا زمانی که ASLR غیرفعال باشد) هم‌چنین این باعث می‌شود تا آماده‌سازی اولیه‌ی بسیار ساده‌تر شود و نسبت به روش ROP قابل حمل‌تر باشد.

می‌توان SROP را یک ماشین غیرقابل پیشبینی (weird machine) در نظر گرفت زیرا اجازه می‌دهد کدهایی خارج از محدوده‌ی تعیین شده برای برنامه، اجرا شوند. [۱]

پیش‌زمینه

sigreturn-oriented programming شباهت زیادی به روش return-oriented programmming دارد و این شباهت از این جهت است که در این روش هم مهاجم از کدهای موجود در برنامه (کدهای موجود در حافظه‌ی برنامه) استفاده‌ی مجدد می‌کند تا برنامه‌ی قربانی را وادار کند خارج از چارچوب تعیین شده عمل کند. برای این کار مهاجم باید داده‌های پشته را تغییر دهد که این کار معمولا با استفاده از روش «سرریزحافظه‌ی پشته» صورت می‌گیرد که هدف آن تغییر آدرس بازگشت موجود در پشته است.

روش پرش از پشته (Stack hopping exploit)

اگر مکانیزم «منع اجرای داده» یا همان data execution prevention (DEP) در سیستم فعال باشد مهاجم قادر نخواهد بود تا کدهای موردنظر خود را مستقیما در پشته بنویسد و با بازنویسی آدرس بازگشت، سیستم را وادار به اجرای کدها کند. با فعال بودن چنین مکانیزمی، سیستم کدهایی که در صفحات حافظه‌ با برچسب «غیر قابل اجرا» هستند را اجرا نمی‌کند. بنابراین مهاجم باید سعی کند تا با استفاده‌ی مجدد از کدهایی که درحال‌حاضر در حافظه‌ی برنامه، موجود هستند به هدف خود برسد.

در اکثر برنامه‌ها تابعی وجود ندارد که به مهاجم اجازه بدهد تا مسقیما به هدف خود برسد (مثلا باز کردن پوسته‌ی (shell) سیستم‌عامل و ارسال دستورها به آن) ولی در سراسر برنامه دستورالعمل‌هایی (دستورالعمل‌هایی که خود عضوی از توابع گوناگون هستند) وجود دارد که مهاجم می‌تواند با ترکیب آن‌ها به هدف خود برسد. [۶]

در روش ROP به دنباله‌ای از این دستورالعمل‌ها که به آن‌ها gadgets گفته می‌شود نیاز داریم و ویژگی مشترک همه‌ی این دنباله‌ها این است که در انتهای همه‌ی آن‌ها یک دستورالعمل RET وجود دارد. مهاجم با قرار دادن یک دنباله از آدرس‌های بازگشت در پشته می‌تواند بعد از اجرای یک gadget و رسیدن به دستورالعمل RET، سیستم را وادار کند تا gadget بعدی را اجرا کند و اینگونه با تعیین ترتیب اجرای gadgetها، به هدف خود برسد.

مکانیزم پردازش سیگنال (Signal handler mechanism)

محتوای پشته هنگام پردازش یک سیگنال (linux x86 / 64) شامل داده‌ساختار sigcontext

این نوع حمله براساس نحوه‌ی پردازش سیگنال‌ها در سیستم‌عامل‌هایی که بر پایه‌ی POSIX هستند، طراحی شده است. زمانی که یک سیگنال به یک فرایند می‌رسد، هسته‌ی سیستم‌عامل باید یک عملیات تغییر بافتار (context switch) به پردازش‌گر سیگنال (که از قبل در سیستم ثبت شده است) انجام دهد. برای انجام این کار، هسته باید مقدار بافتار (context) فعلی را در یک قاب بر روی پشته ذخیره کند. [۷] [۶] داده‌ساختاری که بر روی پشته ذخیره می‌شود بسته به معماری سیستم متفاوت است و معمولا sigcontext نام دارد که داده‌هایی مثل مقادیر ثبات‌ها (register) در زمان تغییر بافتار را درخود نگه می‌دارد. زمانی که کار پردازش‌گر سیگنال به اتمام رسید فراخوان سیستمی ()sigreturn صدا زده می‌شود (این فراخوان وظیفه‌ دارد بافتار قبلی فرایند را با استفاده از داده‌ساختار sigcontext بازیابی کند).

فراخوانی sigreturn به این معناست که می‌توان به سادگی مقادیر ثبات‌ها پردازنده را به وسیله‌ی یک ‌gadget که به سادگی در سیستم یافت می‌شود، تغییر داد. [۱]

تفاوت‌های SROP و ROP

چندین عامل برای تشخیص و تفکیک روش SROP از روش سنتی ROP وجود دارد.

اول اینکه ROP به gadgetهایی که در برنامه قابل دسترسی هستند وابستگی زیادی دارد و نکته‌ای که وجود دارد این است که اگر فایل‌های دودویی با یکدیگر متفاوت باشند این gadgetها بسیار متفاوت خواهند بود، از این‌رو زنجیره‌ی gadgetها قابل حمل (portable) نخواهند بود. هم‌چنین درصورتی که سیستم از روش تصادفی‌سازی فضای آدرس‌دهی یا همان ASLR استفاده کند و هیچ نشت اطلاعاتی در سیستم وجود نداشته باشد که بتوان با استفاده از آن آدرس gadgetها را پیدا کرد، استفاده از gadgetها بسیار مشکل (یا حتی غیرممکن) خواهد بود.

با این وجود کامپایلرهایی طراحی و پیاده‌سازی شده‌اند که قادراند زنجیره‌ی gadgetها را به شکل Turing-complete استخراج کنند.

درصورت استفاده از SROP این امکان وجود دارد که بتوان روشی که برای نفوذ به یک فایل دودویی خاص طراحی شده برای یک فایل دودویی دیگر استفاده کرد (قابل حمل بودن) که معمولا یا هیچ نیازی به تغییر طراحی نیست یا تغییرات بسیار ناچیز است و هم‌چنین همیشه امکان تغییر محتویات ثبات‌ها در این روش برای مهاجم وجود دارد درحالی‌که اگر از روش ROP استفاده شود و در برنامه gadgetهایی یافت نشوند که امکان تغییر محتویات ثبات‌ها را داشته باشند، کار برای مهاجم بسیار سخت و حتی غیرممکن خواهد شد. [۶] علاوه بر موارد بالا، SROP به حداقل تعداد gadgetها نیاز دارد و به مهاجم اجازه می‌هد تا با اجرای زنجیروار فراخوان‌های سیستمی، به‌صورت موثر اقدام به طراحی و اجرای shellcode موردنظر خود کند. gadgetهای ذکر شده همیشه در حافظه‌ موجود هستند و حتی در مواردی آدرس آن‌ها نیز ثابت و مشخص است:

لیست gadgetها در سیستم‌های مختلف
سیستم عامل ASLR اسباب بازی نقشه حافظه مکان حافظه ثابت
لینوکس i386 Yes sigreturn [vdso]
لینوکس <3.11 ARM Red XN sigreturn [vectors] 0xffff0000
لینوکس <3.3 x86-64 Red XN syscall&return [vsyscall] 0xffffffffff600000
لینوکس 3.3 x86-64 Yes syscall&return Libc
لینوکس x86-64 Yes sigreturn Libc
FreeBSD 9.2 x86-64 Red XN sigreturn 0x7ffffffff000
Mac OSX x86-64 Yes sigreturn Libc
iOS ARM Yes sigreturn Libsystem
iOS ARM Yes syscall&return Libsystem

حمله‌ها

لینوکس

به‌عنوان یک مثال از gadgetهایی که همیشه در حافظه‌ی VDSO در لینوکس 32-بیتی وجود دارند و برای استفاده‌ی SROP مناسب هستند می‌توان به مورد زیر اشاره کرد:

__kernel_sigreturn proc near:
pop   eax
mov   eax, 77h
int   80h ; LINUX - sys_sigreturn
nop
lea   esi, [esi+0]
__kernel_sigreturn endp

در بعضی از نسخه‌های لینوکس درصورتی‌که محدودیت اندازه‌ی پشته را «نامحدود» تنظیم کنیم، مکانیزم ASLR غیرفعال می‌شود [۸] که این باعث می‌شود تا مهاجم به‌صورت موثر ASLR را دور بزند و به‌راحتی به gadgetهای موجود در VSDO دسترسی پیدا کند.

در لینوکس‌هایی با نسخه‌ی قدیمی‌تر از 3.3 این امکان وجود دارد که gadgetهای مناسب را در صفحه‌های حافظه‌ی vsyscall پیدا کرد، این مکانیزم (vsyscall) برای افزایش سرعت دسترسی برنامه‌های قدیمی به فراخوان‌های سیستمی مشخص، ایجاد شده است و همیشه در یک آدرس ثابت و مشخص در حافظه قرار می‌گیرد.

کامل بودن از نظر تورینگ (Turing-completeness)

این امکان وجود دارد تا با استفاده از gadgetها اطلاعاتی را در قاب‌های پشته بنویسیم یا تغییر دهیم که در این‌صورت یک برنامه‌ی خود-متغییر(self-modifying program) خواهیم داشت. با استفاده از این روش می‌توانیم یک ماشین مجازی ساده بسازیم و از آن به‌عنوان مترجم برای یک زبان Turing-complete استفاده کنیم. یک مثال از این رویکرد را می‌توان در مقاله‌ی Bosman پیدا کرد که در آن نحوه‌ی ساخت یک مفسر برای یک زبان مشابه با زبان برنامه‌نویسی Brainfuck توضیح داده شده است. این زبان یک اشاره‌گر به دستورالعمل PC، یک اشاره‌گر به حافظه P و یک ثبات موقت 8-بیتی A برای جمع داشت. این بدان معناست که این امکان وجود دارد که درهای مخفی (backdoors) یا حمله‌های گمراه‌کننده را نیز طراحی و اجرا نمود. [۱]

روش‌های دفاع و مقابله

روش‌هایی که برای مقابله با حملات SROP مورد استفاده قرار می‌گیرند معمولا در یکی از دسته‌بندی‌های تصادفی‌سازی فضای آدرس حافظه (ASLR)، قناری (canaries) و شیرینی (cookies) یا پشته‌های سایه (shadow stacks) قرار می‌گیرند.

تصادفی‌سازی فضای آدرس حافظه (ALSR)

ASLR یا تصادفی‌سازی فضای آدرس‌دهی باعث می‌شود تا محل ذخیره‌سازی gadgetها برای مهاجم غیرقابل پیشبینی شود که این باعث می‌شود تا استفاده از gadgetهای موردنظر مشکل شود.

استفاده از روش «شیرینی» برای سیگنال‌ها

یکی از روش‌های مقابله با حملات SROP استفاده از روش «شیرینی» است. در این روش، سیستم قبل از بازیابی بافتار، اصالت داده‌ساختار sigcontext ذخیره شده در پشته را بررسی می‌کند و اطمینان حاصل می‌کند که داده‌های آن جعل نشده باشند. نحوه‌ی انجام این کار به این‌صورت است که سیستم یک شیرینی (عدد) به‌صورت تصادفی انتخاب کرده و آن را با آدرس ذخیره‌سازی در پشته (جایی که شرینی باید ذخیره شود) xor می‌کند. در این‌صورت تنها کاری که فراخوان سیستمی sigreturn باید انجام دهد این است که بررسی کند این شیرینی در مکان تعیین‌شده وجود داشته باشد. این روش به‌صورت موثر و با حداقل سربار ممکن (حداقل کاهش کارایی)، قادر به جلوگیری از حمله‌های SROP است. [۱] [۹]

شبیه‌سازی Vsyscall

در لینوکس‌هایی با نسخه‌های بالاتر از 3.3 رابط vsyscall به‌گونه‌ای شبیه‌سازی شده است که درصورتی‌که هرگونه تلاش برای اجرای مستقیم gadgetها (اجرای بخشی از تابع) صورت گیرد، سیستم یک استثنا(exception) ایجاد می‌کند. [۱۰] [۱۱]

حفاظت از آدرس بازگشت (RAP)

مجموعه‌ای از وصله‌ها (patch) با نام Grsecurity برای هسته‌ی لینوکس ارائه شده که امنیت آن را بهبود بخشیده است. [۱۲] این مجموعه شامل مکانیزمی به‌نام RAP (Return-Address Protection)یا «حفاظت از آدرس بازگشت» که از حمله‌های «استفاده‌ی مجدد از کدهای موجود» جلوگیری می‌کند. [۱۳]

کنترل جریان اجباری (CET)

از سال 2016 شرکت intel شروع به توسعه‌ی تکنولوژی کنترل جریان اجباری (Control-flow Enforcement Technology) یا همان CET کرد. این تکنولوژی از حملات «پرش از پشته» جلوگیری می‌کند. نحوه‌ی عملکرد آن به این‌صورت است که علاوه‌بر پشته‌ی معمولی یک پشته‌ی دیگر به‌عنوان «پشته‌ی سایه» درنظر گرفته می‌شود که فقط اطلاعات مربوط به آدرس بازگشت در آن ذخیره می‌شود و این پشته توسط واحد «مدیریت حافظه» که یک واحد سحت‌افزاری است و در CPU قرار دارد محافظت می‌شود. [۱۴] [۱۵]

جستارهای مرتبط

مرجع‌ها

  1. ۱٫۰ ۱٫۱ ۱٫۲ ۱٫۳ ۱٫۴ "Framing Signals - A Return to Portable Shellcode" (PDF). SP '14 Proceedings of the IEEE Symposium on Security and Privacy: 243–358. 2014. doi:10.1109/SP.2014.23. ISBN 978-1-4799-4686-0. Retrieved 2016-06-16.
  2. "Award Papers of the 2014 IEEE Symposium on Security and Privacy". IEEE security. IEEE Computer Society's Technical Committee on Security and Privacy. Retrieved 2016-06-17.
  3. "Linux Cross Reference - sigcontext.h".
  4. "SIGRETURN(2) - Linux manual page".
  5. "SIGRETURN(2) - Linux manual page".
  6. ۶٫۰ ۶٫۱ ۶٫۲ "Sigreturn-oriented programming and its mitigation". Retrieved 2016-06-20.
  7. "Playing with signals: An overview on Sigreturn Oriented Programming". Retrieved 2016-06-21.
  8. "CVE-2016-3672 - Unlimiting the stack not longer disables ASLR". Retrieved 2016-06-20.
  9. "Sigreturn-oriented programming and its mitigation". Retrieved 2016-06-20.
  10. "On vsyscalls and the vDSO". Retrieved 2016-06-20.
  11. "Hack.lu 2015 - Stackstuff 150: Why and how does vsyscall emulation work". Retrieved 2016-06-20.
  12. "Linux Kernel Security (SELinux vs AppArmor vs Grsecurity)".
  13. "RAP: RIP ROP" (PDF). Retrieved 2016-06-20.
  14. "RIP ROP: Intel's cunning plot to kill stack-hopping exploits at CPU level". Retrieved 2016-06-20.
  15. "Control-Flow-Enforcement technology preview" (PDF).

پیوندهای خارجی