Address Space Layout Randomization یا به اختصار ASLR یک تکنیک امنیتی است که در سیستمعاملها استفاده میشود و اولین بار در سال 2001 پیادهسازی شد. نسخههای کنونی همهٔ سیستمعاملهای اصلی همچون iOS ،Android ،Windows ،macOS و Linux این ویژگی را دارا هستند؛ اما در عین حال به نظر میرسد ASLR آنقدرها هم که فکر میکنیم امن نیست (ASLR میتواند برای کسانی که دانشی در زمینهٔ برنامهنویسی سطح پایین ندارند گیجکننده باشد. برای درک آن ابتدا باید مفهوم حافظهٔ مجازی را درک کنید).
Virtual Memory چیست؟
Virtual Memory (حافظهٔ مجازی) یک تکنیک مدیریت حافظه با مزایای بسیار است که در ابتدا برای آسانتر کردن برنامهنویسی ایجاد شد. تصور کنید در یک کامپیوتر با رم 4 گیگابایتی برنامههای ورد، گوگل کروم و برنامههای زیاد دیگری باز باشند. در مجموع، برنامههای این کامپیوتر بیشتر از 4 گیگابایت رم استفاده میکنند اما همهٔ این برنامهها یا همیشه فعال نیستند و یا نیاز به دسترسی همزمان به رم ندارند.
سیستمعامل تکههایی از حافظه را به نام Page به برنامهها اختصاص میدهد؛ اگر در رم فضای کافی برای ذخیرهٔ همهٔ پبجها با هم وجود نداشته باشد، پیجهایی که احتمالاً کمتر مورد نیاز قرار میگیرند در یک فضای کندتر (اما با حجم بیشتر) ذخیره میشوند. هنگامی که نیاز به دسترسی به این پیجهای ذخیره شده باشد، جای آنها با پیجهایی که در آن زمان در رم کمتر مورد نیاز هستند عوض میشود که این فرآیند Paging نام دارد (لازم به ذکر است که نام فایل pagefile.sys در ویندوز نیز از آن گرفته شده است).
حافظهٔ مجازی به برنامهها این امکان را میدهد تا حافظهٔ خود را آسانتر مدیریت کنند و همچنین آنها را امنتر نیز میکند. لزومی ندارد برنامهها نگران این باشند که سایر برنامهها دادههای خود را کجا ذخیره میکنند و یا چقدر از حجم رم باقی مانده است؛ فقط باید در صورت نیاز از سیستمعامل درخواست حافظهٔ بیشتر و یا بازگرداندن حافظهٔ بلااستفاده را کنند. همهٔ آن چیزی که یک برنامه میبیند یک تکه از آدرسهای متوالی حافظه برای استفادهٔ انحصاری است که Virtual Addresse (آدرس مجازی) نام دارند.
زمانی که یک برنامه نیاز به دسترسی به حافظه دارد، یک آدرس مجازی به سیستمعامل میدهد؛ سیستمعامل با واحد مدیریت حافظهٔ CPU (یا به اختصار MMU) ارتباط برقرار میکند. MMU آدرسهای مجازی را معادلهای فیزیکیشان ترجمه میکند و این اطلاعات را به سیستمعامل باز میگرداند؛ بنابراین از یک سو در هیچ زمانی برنامه مستقیماً با رم تعامل ندارد و از سوی دیگر یک برنامه اجازهٔ دسترسی به حافظهٔ برنامهٔ دیگری را ندارد.
ASLR چیست؟
اصطلاح ASLR در ابتدا برای حفاظت در برابر آسیبپذیری Buffer Overflow استفاده میشد. در این نوع حملات، مهاجمان به یک سیستم تا حدی که ظرفیت دارد دادههای ناخواسته ارسال میکند سپس یک Payload مُخرب میفرستند که بر روی دادههایی که برنامه قصد دسترسی به آنها را دارد، بازنویسی میشود. برای مثال، روش متداول JailbreakMe یکی از روشهای Jailbreaking در iOS 4 از آسیبپذیری بافر اورفلو استفاده میکرد که در نهایت اپل را وادار به افزودن ASLR به iOS 4.3 کرد.
در حملات Buffer Overflow مهاجم باید محل ذخیرهسازی هر قسمت از برنامه در حافظه را بداند که فهمیدن این موضوع معمولاً نیازمند یک فرآیند پیچیدهٔ آزمون و خطا است که پس از مشخص شدن، مهاجم باید یک Payload ایجاد کرده و محل مناسب برای اینجکت آن را بیابد. به طور کلی، سوءاستفاده از یک برنامه میتواند سخت و یا غیرممکن باشد اگر مهاجم محل ذخیرهسازی کد هدف را نداند.
ASLR همراه با مدیریت حافظهٔ مجازی برای تصادفی انتخاب کردن محلهای ذخیرهسازی قسمتهای مختلف برنامه در حافظه کار میکند. هر زمان که برنامه در حال اجرا است، اجزاء آن (شامل استک، هیپ و برخی دیگر لایبرریها) به یک آدرس متفاوت در حافظهٔ مجازی مستقل مرتبط میشوند و در این صورت است که مهاجمان دیگر قادر به فهمیدن محل ذخیرهسازی کد هدف از طریق آزمون و خطا نیستند زیرا آدرس آن هر بار متفاوت است. عموماً برنامهها باید با پشتیبانی ASLR کامپایل شوند و این موضوع در حال تبدیل شدن به یک پیشفرض برای برنامهها است (حتی در نسخهٔ 5 و بالاتر اندروید نیز به یک باید تبدیل شده است).
آیا ASLR شما را در برابر حملات محافظت میکند؟
چندی پیش، محققان SUNY Binghamton و University of California، مقالهای تحت عنوان Jump Over ASLR: Attacking Branch Predictors to Bypass ASLR ارائه کردند. این مقاله شامل راهی برای حمله به Branch Target Buffer یا به اختصار BTB است که به عنوان بخشی از پردازشگر است که اگر دستورات پیشبینی نتیجه درست باشند، عملیات را تسریع میکند. با استفاده از روش گفته شده توسط نویسندهٔ این مقاله، مشخص کردن محل دستورات شناخته شده در یک برنامهٔ در حال اجرا امکانپذیر است. این حمله بر روی یک سیستم لینوکسی با پردازشگر Intel Haswell (که نخستین بار در سال 2013 منتشر شد) اجرا شد اما احتمالاً میتواند بر روی هر سیستمعامل و پردازشگر مدرن دیگری قابلاجرا باشد.
با این حال نباید ناامید بود. این مقاله چندین روش پیشنهاد داده است که دولوپرهای سختافزار و سیستمعامل میتوانند با استفاده از آنها احتمال وقوع این حمله را کاهش دهند. به تازگی، تکنیکهای جدید و هوشمندانهٔ ASLR تلاش بیشتری را از مهاجمان میطلبد و همچنین افزایش تعداد آنتروپی (تصادفیسازی) میتواند حملهٔ Jump Over را غیرممکن سازد و به احتمال خیلی زیاد، سیستمعاملها و پردازشگرهای جدیدتر در برابر این حمله ایمن خواهند بود.
روش Jump Over جدید است و هنوز استفاده از آن در میان هکرها و مهاجمان دیده نشده است. وقتی که مهاجمان از این روش سوءاستفاده کنند، این نقص باعث افزایش آسیبی احتمالی میشود که یک مهاجم میتواند برای دستگاه شما ایجاد کند. این سطح از دسترسی بیسابقه نیست؛ مایکروسافت و اپل ASLR را در سیستمعاملهایی که در سال 2007 و بعد از آن به بازار عرضه کردند پیادهسازی کردند. حتی اگر این سبک از حمله رایج شود، وضعیت شما بدتر از زمانی که از ویندوز XP استفاده میکردید نخواهد بود!
به خاطر داشته باشید که مهاجمان برای ایجاد هر نوع آسیبی باز هم باید کد خود را وارد دستگاه شما کنند اما شما به عنوان یک کاربر همیشه باید بهترین روشهای امنیتی را دنبال کنید؛ از آنتی ویروس استفاده کنید، از وبسایتها و برنامههای سرسری پیادهسازی شده دوری کنید و نرمافزارهای خود را به روز نگاه دارید. با انجام این کارها و دور نگاه داشتن مهاجمان از کامپیوتر خود، سیستم شما همانگونه که تا الان امن بوده، ایمن باقی خواهد ماند.