RAMpage

یک تیم از محققان امنیتی، مجموعه جدیدی از تکنیک‌ها را کشف کرده‌اند که می‌تواند به مهاجمان اجازه دهد که همه انواع بازدارنده‌هایی(۱) که در حال حاضر برای جلوگیری از حملات Rowhammer مبتنی بر DMA در برابر دستگاه‌های اندرویدی استفاده می‌شوند را دور بزنند.

این تکنیک جدید که RAMpage نام دارد (CVE-2018-9442) می‌تواند یک برنامه دارای اختیارات پایین و در حال اجرا بر روی دستگاه قربانی را مجدداً فعال کند تا از حمله قبلاً افشاشده‌ی Drammer استفاده کند[۱] که در حقیقت یک نوع آسیب‌پذیری سخت‌افزاری DRAM Rowhammer برای دستگاه‌های اندرویدی است [۲]. این کار به مهاجم اجازه می‌دهد تا اختیارات در حد ریشه بر روی دستگاه مورد هدف به دست آورد.

شما ممکن است چند مقاله در مورد RAMpage در اینترنت خوانده باشید، اما اگر هنوز نمی‌توانید آن را درک کنید، ما در این اینجا به زبان ساده که برای همگان قابل‌درک باشد آن را توضیح دادیم.

آسیب‌پذیری DRAM Rowhammer چیست؟

اشکال Rowhammer که از سال ۲۰۱۲ شناخته‌شده، یک مسئله قابلیت اعتماد(۲) سخت‌افزاری با تراشه‌های نسل جدید DRAM (حافظه دسترسی تصادفی پویا) است که در دسترسی مکرر و سریع به یک سطر حافظه می‌تواند باعث معکوس شدن(۳) بیت در سطوح مجاور شود، برای مثال تغییر مقادیر بیت از ۰ به ۱ یا ۱ به ۰٫

در سال ۲۰۱۵، محققان امنیتی از Google Project Zero با موفقیت نشان دادند که می‌توانند به‌طورقطع از این مسئله سخت‌افزاری برای دستیابی به بالا بردن اختیارات بر روی رایانه‌های آسیب‌پذیر (ویندوز یا لینوکس) بهره‌برداری کنند.

علاوه بر این محققان گوگل حمله دوطرفه Rowhammer را نیز معرفی کرده‌اند که باعث افزایش احتمال معکوس شدن یک بیت در یک ردیف با hammer کردن هر دوی همسایه‌های آن می‌شد.

استفاده از اشکال Rowhammer ساده است، اما بهره‌برداری موفق از آن دشوار است، زیرا بیشتر بیت‌ها در حافظه برای مهاجم نامربوط هستند و معکوس کردن آن‌ها می‌تواند باعث تخریب حافظه شود.

به‌عنوان‌مثال hammering یا خواندن و نوشتن داده‌ها از یا در DRAM به‌طور تهاجمی در مکان‌های حافظه‌ی تصادفی کافی نیست که موجب معکوس شدن بیت یک صفحه حافظه مورد هدف شود (احتمالاً توسط یک برنامه دارای اختیارات بالا یا سیستمی).

برای بهره‌برداری موفق از Rowhammer، یک مهاجم باید بتواند سیستم را فریب دهد به‌طوری‌که صفحه حافظه هدفمند را در یک ردیف (آسیب‌پذیر به Rowhammer) در مجاورت ردیف متعلق به مهاجم در حافظه فیزیکی DRAM قرار دهد.

در مقالات قبلی، دیگر حملات Rowhemmer توضیح داده شده‌اند که شامل موارد زیر است:

GLitch: این تکنیک، از واحدهای پردازش گرافیکی جاسازی‌شده (GPU ها) برای انجام حملات Rowhammer بر روی دستگاه‌های اندرویدی استفاده می‌کند[۳].

Throwhammer: اولین حمله از راه دور Rowhammer مبتنی بر شبکه است که شامل بهره‌برداری از یک آسیب‌پذیری شناخته‌شده در DRAM از طریق کارت‌های شبکه با استفاده از کانال‌های دسترسی مستقیم به حافظه از راه دور (RDMA) است[۴].

NetHammer: یکی دیگر از روش‌های Rowhammer مبتنی بر شبکه‌ی از راه دور است که می‌تواند برای حمله به سیستم‌ها با استفاده از حافظه ucached یا flush دستورالعمل(۴) در هنگام پردازش درخواست‌های شبکه استفاده شود[۵].

حمله Drammer چیست؟

Drammer که ۲ سال پیش کشف شد، اولین حمله عملی مبتنی بر Rowhammer بود که تراشه‌های DRAM را بر روی دستگاه‌های اندرویدی مورد هدف قرار داد، که می‌تواند توسط یک برنامه موذی بدون نیاز به اجازه یا یک آسیب‌پذیری نرم‌افزاری مورد بهره‌برداری قرار گیرد.

حمله Drammer به بافرهای DMA (دسترسی مستقیم به حافظه) متکی است که توسط مدیر حافظه اصلی اندروید به نام ION ارائه می‌شود.

ازآنجاکه DMA اجازه می‌دهد تا برنامه‌ها به‌طور مستقیم و بدون نیاز به عبور از هر کَشِ پردازنده به حافظه دسترسی پیدا کنند، دسترسی چندباره (hammering) به یک ردیف خاص از حافظه کارآمدتر می‌شود.

ION در حقیقت pool های حافظه خود را در چندین پشته in-kernel سازمان‌دهی می‌کند، یکی از آن‌ها یعنی پشته kmalloc برای تخصیص حافظه هم‌جوار(۵) فیزیکی طراحی شده است که مهاجمان را قادر می‌سازد تا به‌راحتی تعیین کنند که چگونه آدرس‌های مجازی به آدرس‌های فیزیکی map می‌شوند.

این دو ویژگی مدیریت دسترسی به حافظه ION یعنی دسترسی مستقیم و تخصیص حافظه مجاور در حقیقت کلید موفقیت حمله Drammer بود.

چگونه گوگل حملات Rowhammer مبتنی بر DMA مشابه Drammer  را کاهش داد؟

در سال ۲۰۱۶، پس‌ازاینکه جزئیات حمله Drammer عمومی شد، گوگل یک به‌روزرسانی برای دستگاه‌های اندرویدی ارائه داد که در آن به‌منظور کاهش احتمال بهره‌برداری قطعی از آسیب‌پذیری Rowhammer، یکی از اجزای ION یعنی پشته kmalloc که مسئولیت تخصیص حافظه هم‌جوار را دارد، غیرفعال کرد.

پس از غیرفعال کردن پشته هم‌جوار، در حال حاضر برنامه‌های کاربردی و فرآیندهای سیستم که در حال اجرا بر روی دستگاه‌های اندروید شما هستند به دیگر پشته‌های in-kernel وابسته‌اند که در مدیریت حافظه ION در دسترس‌اند؛ مانند پشته سیستم که برای تخصیص حافظه در مکان‌های فیزیکی تصادفی بر روی DRAM طراحی شده است.

علاوه بر تخصیص حافظه غیر هم‌‌جوار، پشته سیستم نیز حافظه کرنل و حافظه کاربر را با اختصاص دادن آن‌ها به ترتیب به مناطق lowmem و highmem به‌منظور امنیت بیشتر، از یکدیگر جدا می‌کند.

حمله RAMpage چیست و چگونه می‌تواند به مهاجمان اجازه دهد تا اقدامات پیشگیرانه علیه Rowhammer را دور بزنند؟

تکنیک پیشگیرانه توضیح داده‌شده در بالا و معرفی‌شده توسط گوگل به‌طور مؤثر از انجام حمله دوطرفه Rowhammer توسط مهاجم جلوگیری می‌کند.

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

در یک مقاله تحقیقاتی[۶]، این گروه توضیح می‌دهد که اولین نوع RAMpage یعنی r0 “یک پیاده‌سازی قابل‌اطمینان Drammer است که نشان می‌دهد چگونه غیرفعال کردن تخصیص حافظه هم‌جوار از حملات بالا بردن اختیاراتِ بر پایه Rowhammer جلوگیری نمی‌کند.”

محققان سه مرحله زیر را برای دستیابی به بهره‌برداری مشابه Drammer با استفاده از نوع r0 از حمله RAMpage توضیح می‌دهند:

  • تهی کردن(۶) پشته سیستم – محققان دریافتند که اگر یک برنامه کاربردی عمداً تمام pool های داخلی ION را تخلیه کند، تخصیص دهنده‌ی buddy، که یک الگوریتم دیگر تخصیص حافظه است، فرآیند تخصیص را به‌عنوان یک جایگزین(۷) اتخاذ می‌کند.

ازآنجاکه اهداف اولیه تخصیص دهنده buddy به حداقل رساندن تجزیه(۸) حافظه است، درنهایت تخصیص صفحات هم‌جوار را ارائه می‌دهد.

برای افزایش احتمال بهره‌برداری، یک مهاجم همچنین می‌تواند مکانیسم جداسازی ناحیه استفاده‌شده توسط پشته سیستم را دور بزند. برای نشاندن تحمیلی(۹) صفحه حافظه خود به تخصیص‌های lowmem، که صفحات کرنل در آن قرار دارد، مهاجم به‌طور مداوم حافظه را اختصاص می‌دهد تا زمانی که هیچ highmem ای باقی نماند.

محققان در این رابطه می‌گویند: “وقتی مورد ما این است، کرنل، درخواست‌های بعدی را از lowmem به کار می‌برد که به ما اجازه می‌دهد در حافظه فیزیکی که بعداً می‌تواند جدول صفحه(۱۰) را نگه دارد، بیت‌های معکوس شده را پیدا کنیم.”

  • Shrink کردن cache pool – علاوه بر این، با استفاده از شاخص بهره‌برداری Flip Feng Shui، مهاجمان می‌توانند کرنل را گول بزنند تا یک جدول صفحه را در صفحه آسیب‌پذیر ذخیره کند.

محققان توضیح دادند[۷]: “این مرحله، آزاد کردن حافظه فیزیکیِ poolهای پشته سیستم به کرنل است که به‌طور غیرمستقیم زیرسیستم(۱۱) ION را مجبور به آزاد کردن حافظه کش شده‌ی از پیش تخصیص داده شده خود شامل یک ردیف با صفحه آسیب‌پذیر می‌کند.”

  • root کردن یک دستگاه تلفن همراه – پیاده‌سازی دو مرحله فوق، سیستم‌عامل را گول می‌زند تا صفحه حافظه مورد هدف را بسیار نزدیک به صفحه متعلق به مهاجم قرار دهد و پس‌ازآن همه‌ی کاری که مهاجم باید انجام دهد پیاده‌سازی باقی‌مانده مراحل از حمله rowhammer مبتنی بر DMA برای پیدا کردن تکه‌های(۱۲) قابل بهره‌برداری و توسعه یک بهره‌بردار ریشه است.

محققان گفتند: “ما موفق شدیم اثبات ادعای خود را بر روی یک گوشی تلفن همراهِ LG G4 دارای آخرین نسخه اندروید (یعنی نسخه ۷٫۱٫۱ در زمان آزمایش‌های ما) پیاده‌سازی کنیم.”

“اگر سیستم شما تحت تأثیر قرار گیرد، بهره‌بردار اثبات ادعای ما می‌تواند کنترل کامل دستگاه شما را در اختیار گیرد و به هر چیزی بر روی آن دسترسی پیدا کند. این ممکن است حاوی کلمات عبور و اطلاعات حساس ذخیره‌شده بر روی سیستم باشد.”

سه نوع دیگر از حملات Rampage، که در زیر آورده شده است، همچنین اجازه می‌دهند تا مهاجمان راه‌حل‌های دفاعی که فقط بخش‌های خاصی از حافظه سیستم را محافظت می‌کنند، دور بزنند؛ اما کمتر عملی بوده و تحقیقات بیشتری برای توسعه یک بهره‌بردار قابل‌استفاده برای آن‌ها نیازمند است.

  • ION-to-ION (Varint r1)
  • CMA-to-CMA attack (Varint r2)
  • CMA-to-system attack (Varint r3)

GuardION یک راه‌حل برای مقابله با تمامی حملات Rowhammer مبتنی بر DMA است.

در این مقاله، محققان در مورد تمام تکنیک‌های کاهش ریسک فعلی که در جلوگیری از انواع حملات rowhammer مبتنی بر DMA بی‌اثر هستند، بحث کرده‌اند و همچنین راه‌حل جدیدی را به نام GuardION همراه با کد آن به‌صورت منبع باز معرفی کرده‌اند.

GuardION یک دفاع مبتنی بر نرم‌افزار است که مانع از حملات rowhammer با جدا کردن بافرهای DMA با ردیف‌های محافظ(۱۳) می‌شود.

کد GuardION نیاز به نصب به‌عنوان یک وصله برای سیستم‌عامل اندروید دارد که مدیر حافظه ION را تغییر می‌دهد به‌طوری‌که چنین بافرهای حساسی را با تزریق ردیف‌های خالی (به‌عنوان نگهبان)، یکی در سمت چپ و یکی در سمت راست، جدا می‌کند و به‌طور فیزیکی بیش از یک ردیف را از ردیف‌های متجاوز(۱۴) دور نگه می‌دارد.

محققان گفتند: “GuardION یک جداسازی اولیه را فراهم می‌کند که این امر را برای مهاجمان غیرممکن می‌کند که از تخصیص‌های DMA به‌صورت uncached برای معکوس کردن بیت‌ها در حافظه که در حال استفاده توسط کرنل یا هر برنامه userland هستند، استفاده کنند.”

“GuardION از همه شاخص‌های حمله شناخته‌شده Rowhammer محافظت می‌کند و طبق اطلاعات ما، هیچ تکنیک موجودی نمی‌تواند آن را دور بزند.”

لازم به ذکر است که نصب وصله GuardION می‌تواند کمی عملکرد دستگاه شما را تحت تأثیر قرار دهد، چراکه فرآیند ایجاد ردیف‌های محافظ، حافظه DRAM دستگاه شما را مصرف می‌کند.

به گفته محققان، تمام دستگاه‌های مبتنی بر اندروید که از سال ۲۰۱۲ استفاده می‌شوند، ممکن است تحت تأثیر حمله‌ی rampage قرار گیرند.

پاسخ به این سؤال: “آیا rampage در سطح اینترنت مورداستفاده قرار گرفته است؟” محققان می‌گویند: “ما نمی‌دانیم.” و وقتی پرسیده می‌شود: “آیا می‌توانم تشخیص دهم آیا کسی از rampage علیه من بهره‌برداری کرده است یا نه؟” آن‌ها پاسخ دادند: “احتمالاً نه. بهره‌برداری هیچ‌گونه علامتی در فایل‌هایlog  سنتی ایجاد نمی‌کند.”

به نظر من، اگر شما برنامه‌هایتان را فقط از منابع مورد اعتماد نصب کرده باشید، نباید نگران حملات RAMapge باشید.

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

منابع

[۱] https://thehackernews.com/2016/10/root-android-phone-exploit.html

[۲] https://thehackernews.com/2015/03/dram-rowhammer-vulnerability.html

[۳] https://apa.aut.ac.ir/?p=4126

[۴] https://apa.aut.ac.ir/?p=4276

[۵] https://apa.aut.ac.ir/?p=4390

[۶] https://vvdveen.com/publications/dimva2018.pdf

[۷] https://rampageattack.com

[۸] https://thehackernews.com/2018/06/android-rowhammer-rampage-hack.html


(۱) mitigations
(۲) reliability
(۳) flip
(۴) instruction
(۵) contiguous
(۶) Exhausting
(۷) fallback
(۸) fragmentation
(۹) forcefully
(۱۰) Page table
(۱۱) subsystem
(۱۲) chunks
(۱۳) guard
(۱۴) aggressor