حملههای مبتنی بر برنامهنویسی Sigreturn-مبنا
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)[ویرایش]
این نوع حمله براساس نحوهی پردازش سیگنالها در سیستمعاملهایی که بر پایهی 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های ذکر شده همیشه در حافظه موجود هستند و حتی در مواردی آدرس آنها نیز ثابت و مشخص است:
سیستم عامل | ASLR | اسباب بازی | نقشه حافظه | مکان حافظه ثابت |
---|---|---|---|---|
لینوکس i386 | sigreturn | [vdso] | ||
لینوکس <3.11 ARM | sigreturn | [vectors] | 0xffff0000 | |
لینوکس <3.3 x86-64 | syscall&return | [vsyscall] | 0xffffffffff600000 | |
لینوکس 3.3 x86-64 | syscall&return | Libc | ||
لینوکس x86-64 | sigreturn | Libc | ||
FreeBSD 9.2 x86-64 | sigreturn | 0x7ffffffff000 | ||
Mac OSX x86-64 | sigreturn | Libc | ||
iOS ARM | sigreturn | Libsystem | ||
iOS ARM | 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 قرار دارد محافظت میشود. [۱۴] [۱۵]
جستارهای مرتبط[ویرایش]
- Linux kernel interfaces
- Vulnerability (computing)
- Exploit (computer security)
- Buffer overflow
- Address space layout randomization
- Executable space protection
- NX bit
مرجعها[ویرایش]
- ↑ ۱٫۰ ۱٫۱ ۱٫۲ ۱٫۳ ۱٫۴ خطای لوآ در پودمان:Citation/CS1/en/Identifiers در خط 47: attempt to index field 'wikibase' (a nil value).
- ↑ "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.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "Linux Cross Reference - sigcontext.h".صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "SIGRETURN(2) - Linux manual page".صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "SIGRETURN(2) - Linux manual page".صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ ۶٫۰ ۶٫۱ ۶٫۲ "Sigreturn-oriented programming and its mitigation". Retrieved 2016-06-20.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "Playing with signals: An overview on Sigreturn Oriented Programming". Archived from the original on 22 اكتبر 2016. Retrieved 2016-06-21. Check date values in:
|archivedate=
(help)صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد. - ↑ "CVE-2016-3672 - Unlimiting the stack not longer disables ASLR". Retrieved 2016-06-20.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "Sigreturn-oriented programming and its mitigation". Retrieved 2016-06-20.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "On vsyscalls and the vDSO". Retrieved 2016-06-20.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "Hack.lu 2015 - Stackstuff 150: Why and how does vsyscall emulation work". Retrieved 2016-06-20.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "Linux Kernel Security (SELinux vs AppArmor vs Grsecurity)".صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "RAP: RIP ROP" (PDF). Archived from the original (PDF) on 20 May 2020. Retrieved 2016-06-20.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "RIP ROP: Intel's cunning plot to kill stack-hopping exploits at CPU level". Retrieved 2016-06-20.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "Control-Flow-Enforcement technology preview" (PDF).صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
پیوندهای خارجی[ویرایش]
- OHM 2013: Review of “Returning signals for fun and profit
- Playing around with SROP
- Fun with SROP Exploitation
- binjitsu - Sigreturn Oriented Programming
- SigReturn Oriented Programming on x86-64 linux
- Sigreturn ROP exploitation technique (signal's stack frame for the win)
This article "حملههای مبتنی بر برنامهنویسی Sigreturn-مبنا" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:حملههای مبتنی بر برنامهنویسی Sigreturn-مبنا. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.