حملههای مبتنی بر Sigreturn-oriented
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ها قابل حمل نخواهند بود. همچنین درصورتی که سیستم از روش تصادفیسازی فضای آدرسدهی یا همان ASLR استفاده کند و هیچ نشت اطلاعاتی در سیستم وجود نداشته باشد که بتوان با استفاده از آن آدرس gadgetها را پیدا کرد، استفاده از gadgetها بسیار مشکل خواهد بود.
با این وجود کامپایلرهایی طراحی و پیادهسازی شدهاند که قادراند این زنجیرهی gadgetها را به شکل Turing-complete استخراج کنند.
درصورت استفاده از SROP این امکان وجود دارد که بتوان روشی که برای نفوذ به یک فایل دودویی خاص طراحی شده در یک فایل دودویی دیگر استفاده کرد و معمولا یا هیچ نیازی به تغییر طراحی نیست یا تغییرات بسیار ناچیز است و همچنین همیشه امکان تغییر محتویات ثباتها در این روش برای مهاجم وجود دارد درحالیکه اگر از روش ROP استفاده شود و در برنامه gadgetهایی یافت نشوند که امکان تغییر محتویات ثباتها را داشته باشند، کار برای مهاجم بسیار سخت و حتی غیرممکن خواهد شد. [۶] علاوه بر موارد بالا، SROP به حداقل تعداد gadgetها نیاز دارد و به مهاجم اجازه میهد تا با اجرای زنجیروار فراخوانهای سیستمی، بهصورت موثر اقدام به طراحی و اجرای shellcode مورد نظر خود کند. این gadgetهای ذکر شده همیشه در حافظه موجود هستند و حتی در مواردی آدرس آنها نیز ثابت و مشخص است:
حملهها[ویرایش]
لینوکس[ویرایش]
بهعنوان یک مثال از gadgetهایی که همیشه در حافظهی VDSO در لینوکس 32-بیتی وجود دارند و برای استفادهی SROP مناسب هستند میتوان به مورد زیر اشاره کرد:
در بعضی از نسخههای لینوکس درصورتیکه محدودیت اندازهی پشته را «نامحدود» تنظیم کنیم، مکانیزم 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 کرد. CETاین تکنولوژی از حملات «پرش از پشته» جلوگیری میکند. نحوهی عملکرد آن به اینصورت است که علاوهبر پشتهی معمولی یک پشتهی دیگر بهعنوان «پشتهی سایه» درنظر گرفته میشود که فقط اطلاعات مربوط به آدرس بازگشت در آن ذخیره میشود و این پشته توسط واحد «مدیریت حافظه» که یک واحد سحتافزاری است و در CPU قرار دارد محافظت میشود. [۱۴] [۱۵]
This article "حملههای مبتنی بر Sigreturn-oriented" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:حملههای مبتنی بر Sigreturn-oriented. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.
- ↑ ۱٫۰ ۱٫۱ ۱٫۲ ۱٫۳ ۱٫۴ خطای لوآ در پودمان: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 محتوایی ندارد.