جداسازی جدول صفحهی هسته سیستمعامل
جداسازی جدول صفحهی هسته ( KPTI ) یکی از ویژگیهای هسته لینوکس است که سبب کاهش اثر آسیبپذیری امیتی Meltdown ( که بیشتر بر روی پردازندههای مدل x86 شرکت اینتل رخ میدهد ) و افزایش مقاومت هستهی لینوکس در برابر تلاشهایی به منطور دور زدن سازوکار KASLR میشود. این ویژگی با جداسازی بهتر فضای آدرس کاربر و فضای آدرس هسته لینوکس در حافظهی کار میکند. Kpti ابتدا در نسخه لینوکس 4.15 ارايه شد سپس به نسخه های قبلی 4.14.11، 4.9.75 ، و 4.4.110 نیز افزوده شد . سیستمهای عامل Windows و macOS نیز این ویژگی را به خودشان اضافه کردند. KPTI آسیبپذیری Spectre را پوشش نمیدهد .
پیشزمینه دربارهی KAISER[ویرایش]
KPTI در واقع مبتنی بر KAISER (یک تکنیک به نام جداسازی فضای آدرس هسته به منظور حذف مؤثر کانالهای جانبی ) طراحی شده است . روش KAISER در سال 2016 طراحی شد و در سال 2017 منتشر شد هنگامی که هنوز آسیبپذیری Meltdown شناخنه نشده بود . KAISER باعث افزایش مقاومت KASLR ، که روشی ارائه شده برای یک موضوع کماهمیتتر در سال 2014 بود، میشود.
در سال 2014 قابلیت تصادفیسازی چیدمان فضای آدرس هسته(KASLR) به هستهی لینوکس اضافه شد .این قابلیت سبب سختتر شدن بهرهبرداری از دیگر آسیبپذریهای هسته لینوکس که به دلیل آدرسدهی فضای حافظهی هسته که از دید کاربران مخفی میماند، به وجود میآمدند, میشد. با وجود جلوگیری از دسترسی به فضای آدرسدهی حافظه هسته، مشخص شد چندین کانال جانبی در پردازندههای امروزی وجود دارند که سبب مشخص شدن فضای آدرس هسته در حافظه حتی در حضور KASLR میشوند.
KAISER این مشکلات موجود در KASLR را با حذف تعدادی از منابع که باعث نشت آدرس میشدند حل میکند. در حالیکه KASLR تنها از نشت اطلاعات آدرسدهی جلوگیری میکند، KAISER علاوه بر آن از نشت خود دادهها هم جلوگیری میکند که سبب پوشش آسیبپذیری Meltdown میشود.
KPTI بر اساس KAISER طراحی شده است.هنگامی که KPTI غیرفعال است ، هرگاه که کدی در فضای آدرس کاربران ( به طور کلی برنامههای کاربردی) اجرا شود، لینوکس تمامی حافظهی هسته خود را که در جداول صفحه (Page Tables) آدرسدهی شدهاند را حفظ میکند و از آنها در مقابل دسترسی محافظت میکند. مزیت این روش این است که وقتی یک برنامه یک فراخوان سیستمی ( System call ) تولید میکند و یا یک سیگنال وقفه دریافت میشود، جداول صفحهی هسته همواره حاضر هستند که سبب میشود بتوان از بیشتر سربارهای مربوط به عملیات context switch (مانندTLB Flush و page-table swapping و .. ) جلوگیری کرد.
آسیب پذیری Meltdown و KPTI[ویرایش]
در ژانویه سال 2018، آسیبپذیری Meltdown معرفی شد که بر روی پردازندههای مدل x86 شرکت اینتل و ARM Cortex-A75 تأثیر میگذاشت. این آسیبپذیری بسیار بدتر از نشت آدرسهای فضای حافظه هسته در KASLR بود که KAISER قصد جلوگیری از آن را داشت. این موضوع آشکار شد که بر خلاف آنچه تاکنون پنداشته میشد، نه تنها مکانهای نگاشت حافظه بلکه خود اطلاعات هسته لینوکس میتوانند نشت پیدا کنند .
KPTI با جلوگیری از نگاشت فضاهای حفاظت شده به فضای آدرسدهی کاربران از آسیبپذیری Meltdown جلوگیری میکند.
در پردازندههای مدل x86 شرکت amd تا به حال رخداد آسیبپذری Meltdown مشاهده نشده است و این پردازندهها نیازی به KPTI ندارند.با این وجود این پردازندهها مستعد دور زده شدن KASLR هنگامی که KPTI غیرفعال است، هستند.
پیاده سازی[ویرایش]
KPTI از این نشتها با جداسازی کامل جداول صفحهی فضای حافظهی کاربران و هسته، جلوگیری میکند. دسته اول از جداول صفحه، شامل آدرسهای فضای حافظهی کاربران و هسته مانند قبل وجود دارد که تنها در هنگامی که سیستم در حالت هسته کار میکند قابل دسترسی هستند . دسته دوم از جداول صفحه که برای استفاده کاربران میباشد، شامل یک نسخه از فضای آدرسدهی حافظهی کاربر و یک مجموعهی حداقلی از فضای آدرسدهی حافظهی هسته که اطلاعات مورده نیاز برای ارسال و دریافت فراخوانهای سیستمی، وقفهها و استثناء ها را فراهم میآورد، میباشد.
در پردازندههایی که از ویژگی process-context identifiers (PCID) پشتیبانی میکنند , میتوان از یک مرتبه خالی کردن بافر TLB پرهیز کرد، اما با وجود نیز هزینه محاسباتی بسیار زیادی خصوصا در هنگام فرخوانهای سیستمی و وقفههای سنگین به سیستم تحمیل میشود.
سربار محاسباتی محاسبه شده توسط خود طراحان اصلی KAISER برابر %0.28 بود . با وجود این یک توسعهدهندهی لینوکس این مقدار را برای بیشتر بازهی کاری تقریباً ٪5 و در بعضی شرایط خاص حتی با وجود بهینه سازی PCID سربار محاسباتی تا %30 بالا میرود. مقدار سربار محاسباتی در آزمایش بر روی پایگاهداده PostgreSQL هنگام عملیاتهای تنها خواندن با یک پردازندهی مدل Skylake شرکت اینتل برابر %17-7 ( یا %23-16 بدون PCID ) بود، در حالی که هنگام آزمایش کامل این میزان در بازهی %19-13 قرار داشت.در بسیاری از سنجشهای انجام شده که بر روی پایگاهدادههای Phoronix و Redis انجام شدهاند کاهش سرعت در بازهی %7-6 میباشد. کامپایل هسته لینوکس نیز حدود %5 بر روی پردازندههای مدل Haswell کندتر شد .
KPTI را میتوان با گزینه ”nopti“ در boot هسته غیرفعال کرد .همچنین تمهیداتی در نظر گرفته شده است تا اگر در پردازندههای جدید جلوی نشت اطلاعات گرفته شد بتوان KPTI را غیرفعال کرد.
منابع[ویرایش]
This article "جداسازی جدول صفحهی هسته سیستمعامل" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:جداسازی جدول صفحهی هسته سیستمعامل. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.