چکش ردیفی

چکش ردیفی Row hammer (که به صورت rowhammer نیز نوشته می‌شود) یک سوء استفاده امنیتی است که از یک اثر جانبی ناخواسته و نامطلوب در حافظه تصادفی پویا (DRAM) استفاده می‌کند که در آن سلول‌های حافظه شارژ بین خود را با تعامل با یکدیگر نشت می‌دهند. در این حالت احتمال نشت یا تغییر اطلاعات در ردیف‌های مجاور ردیفی که به‌طور مستقیم به آن دسترسی داریم وجود دارد. عدم ایزوله بودن سلول‌های حافظه DRAM نسبت به یکدیگر بخاطر تراکم بالای سلول در DRAMهای مدرن می‌باشد و می‌توان با یک سری الگوهای خاص دسترسی به حافظه به صورت سریع و متناوب چندین بار به یک ردیف از حافظه دسترسی داشت که این در حمله rowhammer باعث می‌شود سلول به اندازه کافی در یک بازه نشت اطلاعات داشته باشد.

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

تکنیک‌های مختلف مبتنی بر سخت‌افزار برای جلوگیری از وقوع اثر rowhammer از جمله پشتیبانی مورد نیاز در برخی از پردازشگرها و انواع حافظه DRAM وجود دارند. rowhammer به ندرت یا هرگز بر روی DDR و DDR2 تأثیر نمی‌گذارد و روی DDR3 و DDR4 تأثیر زیادی دارد.

سابقه 
در RAM پویا(DRAM)، هر بیت از داده‌های ذخیره‌شده، یک سلول حافظه جداگانه را اشغال می‌کند که به صورت الکتریکی با یک خازن و یک ترانزیستور اجرا می‌شود. حالت شارژ خازن (شارژ شده یا دشارژ) همان چیزی است که معین می‌کند که آیا یک سلول حافظه "۱" یا "۰" به عنوان یک مقدار دودویی ذخیره می‌کند. تعداد بسیار زیادی از سلول‌های حافظه DRAM به مدارهای مجتمع متصل می‌شوند همراه با یک سری منطق اضافی که سلول‌ها را برای اهداف خواندن، نوشتن، و بازنویسی داده‌ها سازماندهی می‌کند.

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

در نتیجه ذخیره‌سازی بیت‌های داده با استفاده از خازن که سرعت تخلیه طبیعی دارند، باعث می‌شود DRAM حافظه خود را در طول زمان از دست بدهد و نیاز به بازنویسی مجدد همه سلول‌های حافظه دارند، که فرآیندی است که به عنوان دوباره‌سازی شناخته می‌شود. در نتیجه دیگر طراحی، حافظه DRAM مستعد تغییرات تصادفی در داده‌های ذخیره‌شده‌است که به خطاهای حافظه نرم و ویژگی پرتوه‌ای کیهانی و دلایل دیگر شناخته می‌شوند. تکنیک‌های مختلفی وجود دارند که خطاهای حافظه نرم را خنثی و قابلیت اطمینان DRAMرا بهبود می‌بخشد که حافظه تصحیح خطا (ECC)و انواع پیشرفته آن (مانند حافظه lockstep)اغلب مورد استفاده قرار می‌گیرند.

مرور 
افزایش تراکم مدارهای مجتمع DRAM (ICs) باعث شده‌است که سلولهای حافظه کوچکتر از نظر فیزیکی قادر به ذخیره بارهای کوچکتر باشند، که این منجر به کاهش حاشیه نویز عملیاتی، افزایش سرعت تعامل الکترومغناطیسی بین سلولهای حافظه و احتمال از دست رفتن بیشتر داده‌ها می‌شود. در نتیجه، خطاهای اختلال مشاهده می‌شود که توسط سلول‌هایی که در عملکرد یکدیگر دخالت می‌کنند ایجاد می‌شوند و به صورت تغییرات تصادفی در مقادیر بیت‌های ذخیره‌شده در سلول‌های حافظه قرار می‌گیرند. آگاهی از خطاهای اختلال به اوایل دهه ۱۹۷۰ و اینتل ۱۱۰۳ بعنوان اولین DRAM در دسترس جامعه بازمی‌گردد؛ از آن زمان سازندگان DRAMها تکنیک‌های مختلفی را برای مقابله با خطاهای اختلال، مانند بهبود انزوای بین سلول‌ها و انجام آزمایش تولید بکار گرفته‌اند. با این حال، محققان در یک تجزیه و تحلیل در سال ۲۰۱۴ ثابت کردند که تراشه‌های DDR3 SDRAM تجاری موجود در سال‌های ۲۰۱۲ و ۲۰۱۳ مستعد خطاهای مزاحم هستند، در حالی که با استفاده از اصطلاح چکش ردیف برای نامگذاری عوارض جانبی مرتبط با آن که منجر به مشاهده تلنگرهای بیت شده‌است در حالی که از چکش ردیفی برای نامگذاری اثر جانبی مربوطه استفاده می‌شود که منجر به پرش بیت می‌شود.

دلایل برای اثر چکش ردیفی در حافظه DDR3 در درجه اول به تراکم بالای سلول‌های حافظه و نتایج تعاملات مرتبط بین سلول‌ها نسبت داده می‌شود، در حالی که فعالسازی‌های سریع DRAM به عنوان علت اصلی تعیین شده‌است. فعال سازی‌های مکرر ردیف باعث نوسان ولتاژ در خطوط انتخاب ردیف مرتبط می‌شود، که مشاهده شده‌است که نرخ‌های تخلیه بیش از حد مجاز در خازن‌ها متعلق به ردیف‌های حافظه مجاور است، که ردیف‌های قربانی نامیده می‌شوند. اگر سلولهای حافظه آسیب دیده قبل از اینکه شارژ زیادی از دست ندهند تجدید نشوند، خطاهای مزاحم رخ می‌دهد. آزمایش‌ها نشان می‌دهند که یک خطای اختلال ممکن است پس از انجام هر گونه نمایش در حدود ۱۳۹٬۰۰۰ دسترسی‌های حافظه بعدی (با تخلیه حافظه نهان) مشاهده شود و این که یک سلول حافظه در هر ۱۷۰۰ سلول ممکن است در معرض خطر باشد. این تست‌ها همچنین نشان می‌دهند که میزان خطای اختلال به‌طور قابل‌توجهی با افزایش دمای محیط تحت‌تاثیر قرار نمی‌گیرد، در حالی که به محتوای واقعی DRAM بستگی دارد، زیرا الگوهای بیت خاصی منجر به خطای اختلال در دماهای بالاتر می‌شود.

نوعی به نام double-sided hammering شامل فعال سازی هدفمند دو ردیف DRAM در اطراف یک ردیف قربانی است. در تصویر ارائه شده در این بخش، این نوع می‌تواند هر دو ردیف زرد را با هدف القاء پرش‌های بیت در ردیف بنفش فعال کند، که در این حالت، ردیف قربانی خواهد بود. آزمایشات نشان می‌دهد که این روش ممکن است منجر به میزان قابل توجهی بالاتر از خطاهای مزاحم شود، در مقایسه با نوعی که تنها یکی از ردیف‌های DRAM همسایه ردیف قربانی را فعال می‌کند.

کاهش 
روش‌های مختلف برای تشخیص موفق، پیش‌گیری، اصلاح یا کاهش اثر چکش ردیفی وجود دارد. آزمایشات نشان می‌دهد که راه حل‌های ساده ECC، ارائه قابلیت‌های اصلاح یک خطا و قابلیت تشخیص دو خطا (SEC DED)، قادر به اصلاح یا تشخیص همه خطاهای مزاحم مشاهده شده نیستند زیرا برخی از آنها شامل بیش از دو بیت پرش در هر کلمه حافظه می‌شوند. همچنین سه بیت خطا مانع از تغییر ECC می‌شود.

یک راه‌حل موثرتر دوباره نویسی بیشتر حافظه با فاصله‌های متناوب کوتاه از ۶۴ میلی ثانیه معمولی است. اما این روش منجر به مصرف بیشتر انرژی و افزایش پردازنده می‌شود. برخی از فروشندگان به آپدیت‌های سیستم عامل می‌پردازند که این نوع کاهش را پیاده‌سازی می‌کنند. یکی از اقدامات پیچیده‌تر پیشگیری ردیف‌های حافظه که غالباً به آنها دسترسی داریم را پیدا می‌کنند و فعالانه ردیف‌های همسایه آن‌ها را بازنویسی می‌کند.

از زمان انتشار پل «آی وی»(Ivy Bridge microarchitecture)، پردازنده‌های Xeon از این اصطلاح شبه هدف بازنویسی ردیف(pTRR)پشتیبانی می‌کنند؛ که می‌توان از آن‌ها در ترکیب با DDR3های حافظه میانی دوگانه با قابلیت دوگانه - دوگانه (DIMMs)برای کاهش اثر چکش ردیفی ناشی از ردیف‌های قربانی احتمالی بهینه استفاده کرد. بدون تأثیر منفی بر عملکرد یا مصرف توان. هنگامی که با DIMMs مورد استفاده قرار می‌گیرد، این پردازنده‌ها با استفاده از افت پیش‌فرض، در دو برابر فرکانس معمول، که منجر به تأخیر دسترسی حافظه بالاتر می‌شوند و ممکن است پهنای باند حافظه را تا ۴–۲٪ کاهش دهند، بازسازی می‌کنند.

استاندارد حافظه متحرک LPDDR۴ که توسط JEDEC منتشر شد شامل پشتیبانی سخت‌افزار اختیاری برای بازیابی ردیف هدف نامیده می‌شود (TRR)که از تأثیر چکش ردیفی بدون تأثیر منفی بر عملکرد یا مصرف انرژی جلوگیری می‌کند.علاوه بر این، برخی از تولیدکنندگان TRR را در محصولات DDR4 خود پیاده‌سازی می‌کننداگرچه جزئی از استاندارد حافظه DDR4 نیست که توسط JEDEC منتشر شده‌است. از طریق داخلی، TRR با شمارش تعداد فعال سازی‌های ردیف و مقایسه آن در برابر تعداد پیش تعریف شده حداکثر فعال سازی تراشه (MAC) و مقادیر حداکثر فعال کننده پنجره (tMAW)، ردیف‌های قربانی احتمالی را شناسایی می‌کند و این سطرها را برای جلوگیری از پرش بیت بازنویسی می‌کند. مقدار MAC حداکثر تعداد کل فعال سازی‌های ردیفی است که ممکن است در یک بازه زمانی مشخص بر روی یک ردیف DRAM خاص مشاهده شود که مساوی یا کوتاه‌تر از زمان tMAW زمان قبل از ردیف‌های همسایه آن به عنوان ردیف‌های قربانی است. اگر مجموع فعال سازی‌های ردیف برای دو ردیف همسایه خود به حد MAC برسد در پنجره زمان tMAW می‌تواند TRR را نیز به عنوان یک ردیف قربانی مشخص کند.

به دلیل ضرورت تعداد زیاد فعالیت‌های ردیف DRAM که به سرعت انجام می‌شود، بهره‌برداری از چکش ردیفی تعداد زیادی از دسترسی‌های حافظه را صادر می‌کند که باعث از دست رفتن حافظه پنهان می‌شود؛ که با نظارت بر نرخ خطای حافظه نهان برای پیک‌های غیر معمول با استفاده از شمارنده عملکرد سخت‌افزاری تشخیص داده می‌شود.

نسخه ۵٫۰ از نرم‌افزار تشخیص حافظه MemTest86، که در ۳ دسامبر ۲۰۱۳ منتشر شد، یک تست چکش ردیفی را اضافه کرد که بررسی می‌کند که آیا RAM کامپیوتر مستعد خطاهای آشفتگی است یا نه.

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

خطاهای اخلال (توضیح داده‌شده در بخش بالا) به‌طور مؤثر لایه‌های مختلف حفاظت از حافظه را در سطح بسیار پایین سخت‌افزار شکست می‌دهد، عملاً ایجاد یک نوع بردار حمله منحصر به فرد که به فرایندها اجازه می‌دهد تا محتویات بخش‌های اختیاری حافظه اصلی را با دستکاری مستقیم سخت‌افزار اصلی تغییر دهند. در مقایسه، بردارهای حمله مرسوم مانند سرریزهای بافر با هدف سوء استفاده از مکانیسم‌های محافظت در سطح نرم‌افزار، با سوء استفاده از اشتباهات مختلف برنامه‌نویسی برای دستیابی به تغییرات محتوای اصلی حافظه اصلی غیرقابل دسترسی هستند.

بهره‌برداری 
تحقیقات اولیه در مورد اثر چکش ردیفی، که در ژوئن سال ۲۰۱۴ منتشر شد، ماهیت خطاهای مزاحم را تشریح کرد و پتانسیل ساخت حمله را نشان داد، اما هیچ نمونه ای از سوء استفاده از امنیت کاری ارائه نکرد. مقاله تحقیقاتی بعدی در اکتبر ۲۰۱۴ به وجود هر گونه مسایل مربوط به امنیت ناشی از اثر چکش ردیفی هیچ اشاره ای نکرد.

در تاریخ ۹ مارس ۲۰۱۵، پروژه Zero گوگل دو بهره‌برداری از امتیازات کاری را براساس اثر چکش ردیفی را با ایجاد ماهیت بهره‌برداری خود در معماری x86-64 فاش کرد. یکی از استفاده‌های آشکار کننده مکانیسم گوگل (NaCl)گوگل (NaCl)را برای اجرای یک زیرمجموعه محدود از دستورالعمل ماشین ۶۴–۶۴ درون یک sandboxهدف قرار می‌دهد که از تأثیر چکش ردیفی برای فرار از sandbox استفاده کرده و توانایی فراخوانی سیستم به‌طور مستقیم را بدست آورد. این آسیب‌پذیری NaCl، به عنوان CVE-2015-0565 ردیابی شده‌است، با تغییر NaCl کاهش یافته‌است بنابراین اجازه اجرای دستورالعمل ماشین (Clflush(cache line flush را نمی‌دهد، که قبلاً تصور می‌شد برای ساختن یک حمله چکش ردیفی مؤثر لازم است.

دومین بهره‌برداری که توسط پروژه صفر عرضه شد، به عنوان یک فرایند لینوکس بر روی معماری x۸۶–۶۴ اجرا می‌شود و اثر چکش ردیف را برای دستیابی نامحدود به تمام حافظه فیزیکی نصب‌شده در یک کامپیوتر، بهره‌برداری می‌کند. با استفاده از خطاهای مزاحم با پاشش حافظه، این بهره‌برداری قادر به تغییر ورودی‌های جدول صفحه (PTE) است که توسط سیستم حافظه مجازی برای نقشه‌برداری آدرس‌های مجازی به آدرس‌های فیزیکی مورد استفاده قرار می‌گیرد، که نتیجه آن سوءاستفاده از دسترسی نامحدود حافظه می‌باشد. با توجه به ماهیت آن و عدم توانایی معماری x86-64 در ایجاد clflush یک دستورالعمل ماشین ممتاز، این بهره‌برداری به سختی قابل استفاده در رایانه‌هایی است که از مکانیزم‌های جلوگیری از چکش ردیفی داخلی استفاده نمی‌کنند. Project Zero هنگام آزمایش قابلیت استفاده از سوء استفاده، متوجه شد که حدود نیمی از ۲۹ لپ تاپ آزمایش شده دارای خطاهای مزاحم هستند، در حالی که برخی از آنها در کمتر از پنج دقیقه کپی کردن با چکش ردیفی در لپ تاپ‌های آسیب‌پذیر رخ می‌دهند. لپ تاپ‌های آزمایش شده بین سال‌های ۲۰۱۰ و ۲۰۱۴ ساخته شده‌اند و از حافظه غیر ECC DDR3 استفاده می‌کنند.
 code1a:
  mov (X), %eax  // read from address X
  mov (Y), %ebx  // read from address Y
  clflush (X)    // flush cache for address X
  clflush (Y)    // flush cache for address Y
  mfence
  jmp code1a
در ژولای ۲۰۱۵، گروهی از محققان امنیتی مقاله‌ای منتشر کردند که یک روش مبتنی بر معماری و راه مستقل برای بهره‌برداری از اثر چکش ردیفی را توصیف می‌کند. به جای تکیه بر دستورالعمل clflush برای انجام فلاش‌های حافظه نهان، این روش با ایجاد سرعت بسیار بالایی از تخلیه حافظه نهان با استفاده از الگوهای دسترسی دقیق به حافظه، به حافظه غیرمشخص می‌رسد. اگرچه سیاست‌های جایگزینی حافظه پنهان بین پردازنده‌ها متفاوت است، این رویکرد با بکارگیری الگوریتم استراتژی تخلیه حافظه پنهان تطبیقی بر اختلافات معماری غلبه می‌کند. اثبات مفهوم این رویکرد هم به عنوان اجرای کد بومی و هم به عنوان اجرای جاوا اسکریپت محض که در فایرفاکس ۳۹ اجرا می‌شود، ارایه شده‌است. اجرای جاوا اسکریپت به نام Rowhammer.js از آرایه‌های وارد شده بزرگ استفاده می‌کند و به تخصیص داخلی آن‌ها با استفاده از صفحات بزرگ تکیه دارد؛ در نتیجه، یک سوءاستفاده سطح بسیار بالا از یک آسیب‌پذیری در سطح پایین را نشان می‌دهد.

در اکتبر ۲۰۱۶، محققان در سیستم‌های VUSec و گروه امنیت شبکه در vu آمستردام DRAMMER را منتشر کردند که یک برنامه اندروید است که از rowhammer با روش‌های دیگر استفاده می‌کند تا به‌طور قابل‌اطمینان دسترسی ریشه‌ای به چند مدل محبوب از گوشی هوشمند را به دست آورند. این آسیب‌پذیری به عنوان CVE-2016-6728 اذعان شد و وصله ای در مدت یک ماه توسط گوگل منتشر شد تا اثر خود را کاهش دهد، اما به دلیل ماهیت کلی اجرای‌های احتمالی حمله، وصله نرم‌افزاری کارآمد دشوار است که بتواند با اطمینان آن را پیاده‌سازی کند. در حقیقت، تا ژوئن ۲۰۱۸، اغلب پیشنهادهای ارائه‌شده توسط دانشگاهیان و صنعت برای متوقف ساختن تمام حملات، غیر عملی یا ناکافی بود. برای کاهش این حملات، محققان VUSec Systems یک دفاع سبک را ارائه دادند که با جداسازی بافرهای DMA با ردیف‌های محافظ، از حملات مستقر در DMA جلوگیری می‌کند.

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

منابع 

حافظه رایانه
سوءاستفاده امنیتی از رایانه
حمله محروم‌سازی از سرویس
اشکال‌های سخت‌افزاری
علوم رایانه در ۲۰۱۴ (میلادی)