theme
 
 
 
Cryptsetup


مقدمه

اگر شما توسعه دهنده نرم افزار می باشید و یا مدیر عامل یا مدیر فنی یا مدیر فروش شرکتی هستید که قصد فروش نرم افزار سازمان خود را به سازمان یا ارگانی دیگر دارید و به منظور ایجاد امنیت بیشتر سورس کد نرم افزار خود تصمیم به ارائه آن به شکل appliance گرفته اید تا آنرا از حملات هکرها و سودجویانی که به صورت offline به هارد دیسک آن appliance در حالت خاموش بودن حمله ور میشوند و اقدام به دسترسی به نرم افزار شما میکنند, به طور حتم اقدام به رمز نگاری هارد دیسک appliance می نمایید. در این مقاله به بررسی آسیب پذیری های ناشی از رمز نگاری هارد دیسک سرور ها پرداخته شده است. این آسیب پذیری به تازگی و در نوامبر سال ۲۰۱۶ کشف شده است و در ادامه به توضیح بیشتر و راه حل برطرف نمودن این آسیب پذیری پرداخته شده است.

Cryptsetup چیست ؟

ابزاری است که در سیستم عامل لینوکس به منظور رمزنگاری هارددیسک استفاده می شود. این ابزار اصولا از ماژول DMCrypt که یکی از ماژول های کرنل لینوکس است استفاده میکند. با استفاده از این ابزار میتوان فرمتهای مختلف هارددیسک رمز نگاری شده مانند : plain dm-crypt و LUKS و loop-AES و True-Crypt را ایجاد نمود.

مزایای استفاده از LUKS
بیشتر کاربران و مدیران سرورهای مبتنی بر لینوکس با فرمت رمز نگاری شده LUKS آشنایی نسبی دارند و همچنین اکثر ادمین های سرور های لینوکس از آن به منظور رمز نگاری هارد دیسک سرور بهره می جویند. نام LUKS اختصار شده Linux Unified Key Setup بوده و از دیدگاه دیگر به نوعی استاندارد در رمز نگاری هارد دیسک در سیستم عامل لینوکس تبدیل شده است. این استاندارد در اکثر توزیع های (distro) لینوکس پیاده سازی شده است و مدیران سیستم ها میتوانند همچنین از آن به منظور مدیریت امن پسورد های کاربران در سیستم عامل لینوکس استفاده نمایند.
از دیگر مزایای LUKS میتوان به نکات زیر اشاره نمود
• قابلیت انطباق پذیری با اکثر توزیع های لینوکس به دلیل استاندارد بودن آن
• ایجاد امنیت بیشتر در برابر حملات Entropy (Entropy حملاتی هستند که در آنها منابع تولید اعداد و رشته های تصادفی سیستم عامل برای رمزنگاری, توسط ابزارهای جاسوسی مورد نفوذ و مانیتورینگ قرار میگیرند به طوری که این اعداد و کاراکتر ها و رشته های تصادفی تولید شده که به عنوان ورودی های تصادفی در الگوریتم های رمزنگاری مورد استفاده قرار میگیرند, به نوعی لو میروند)
• پشتیبانی از قابلیت تولید چند کلیدی برای انجام رمزنگاری
• ابطال پسورد مورد استفاده در رمزنگاری هارد دیسک توسط مدیر سیستم
• متن باز بودن سورس کد LUKS
در بالا برخی ویژگی های موثر LUKS را بر شمرده ایم و حالا نوبت به بیان آسیب پذیری جدیدی است که برای این ابزار بوجود آمده است و در بین متخصصان امنیت با نام CVE-2016-4484 شناخته میشود. این آسیب پذیری در چهاردهم نوامبر و در کنفرانس DeepSec سال ۲۰۱۶ که در وین اتریش برگزار شد, مطرح شده است.

توضیح آسیب پذیری

این آسیب پذیری را به اختصار میتوان به ایجاد دسترسی کاربر ارشد یا root از طریق واسط shell به فایل سیستم رمزنگاری شده کامپیوتر یا سرور آسیب پذیر نام گذاری کرد. این آسیب پذیری به دلیل اینکه به نحوه پیکربندی ویا نوع توزیع سیستم عامل بستگی ندارد, آسیب پذیری پایدار و موثری میباشد. در این آسیب پذیری مهاجم میتواند با دسترسی فیزیکی به سیستم و با انجام exploit به فایل سیستم رمزنگاری شده سیستم آسیب پذیر دسترسی پیدا کرده و از آن کپی گرفته و آنرا modify کرده و یا آنرا نابود نموده و حتی از طریق اتصال به شبکه اقدام به دستکاری هارد دیسک نماید. اوج خطر در این آسیب پذیری در سیستم های ATM و فرودگاهها و لابراتوارها و دیتاسنترها و سایر اماکنی که فاکتور امنیت در آنجا از اهمیت بالایی برخوردار است احساس میشود و میتواند منجر به رخدادهای امنیتی جبران ناپذیری شود. همچنین میبایست توجه داشت که سیستم های آسیب پذیر واقع شده در cloud ها میتوانند به سادگی و از راه دور مورد هجوم نفوذگرها و هکرها قرار گیرند و لزومی به دسترسی فیزیکی برای انجام exploit وجود ندارد.

این آسیب پذیری در بخشی از initrd script لینوکس میباشد و زمانی این بخش از script اجرا میشود که سیستم عامل بعد از BIOS و هنگام boot اقدام به رمزگشایی هارددیسک می نماید. در اصل Initrd script شامل script هایی از چندین سرویس بوده و قسمت آسیب پذیر آن در فایلی که در پکیج Cryptsetup توزیع Debian است واقع شده است. در اینجا لازم به ذکر است تا این مقاله با توضیحی بیشتر درباره انواع “دسترسی های فیزیکی” که یک نفوذگر میتواند بدست آورد, ادامه یابد. بنابراین به طورکلی هنگامی که یک مهاجم حرفه ای به سیستمی دسترسی فیزیکی داشته باشد میبایست کار آن سیستم را تمام شده دانست اما با این حال سطوح متفاوتی از دسترسی فیزیکی وجود دارد بدین معنی که دسترسی فیزیکی که توسط نوعی Keyboard بسیار محدود شده که تنها چندین دکمه مشخص دارد با دسترسی فیزیکی که یک مهاجم به پورت های USB یا Keyboard کامل یک سیستم پیدا کند, بسیار متفاوت می باشد. بعلاوه اینکه دسترسی به یک Keyboard دارای دکمه فعال [Esc] بسیار متفاوت از دسترسی به همان Keyboard بدون دکمه [Esc] میباشد. در اینجا ممکن است این سوال در ذهن هر خواننده ای بوجود آید که آیا سیستم من هم آسیب پذیر است یا خیر؟ در جواب به این سوال میتوان اینطور بیان نمود که اگر شما از سیستم عامل با توزیع مبتنی بر Debian است و یا مخصوصا از سیستم عامل Ubuntu استفاده میکنید و هارد دیسک رمزگذاری شده دارید, آسیب پذیر خواهید بود به علاوه اینکه بسیاری از توزیع های دیگر لینوکس نیز قطعا آسیب پذیر خواهند بود.

برای توضیح بیشتر در این باره, در حین مراحل نصب Ubuntu , یکی از مراحل به منظور آماده سازی هارددیسک و انتخاب نوع پارتیشن بندی میباشد (شکل ۱ ) در این مرحله از کاربر سوالی مبنی بر “رمز نگاری فایل سیستم در حال نصب به منظور ایجاد امنیت بیشتر” پرسیده میشود, همانطور که در مقدمه ذکر شده است استفاده از رمزنگاری در هارددیسک به منظور جلوگیری از دسترسی offlline به اطلاعات سیستم است که گزینه ای بسیار مطلوب برای دوستداران امنیت به شمار میرود.


 
 


 
 

در مواردی که سیستم عامل توسط شما نصب و راه اندازی نشده است میتوان با دستور blkid به ساختار فایل سیستم و ویژکی های آن اعم از اینکه آیا هر پارتیشن رمزگذاری شده است یا خیر, پی برد (شکل ۲).


 
 


 
 

در شکل بالا نمای کلاسیک از ساختار فایل سیستم به نمایش درآمده است به طوری که پارتیشن /dev/sda5 توسط LUKS رمزگذاری شده است و از آن به عنوان پارتیشن فیزیکی که تشکیل دهنده گروه پارتیشن منطقیlubuntu-vg که خود شامل دو زیر پارتیشن lubuntu-vg-root و lubuntu-vg-swap_1 که هر دو رمزگذاری شده اند, میباشد.

تاثیرات آسیب پذیری

مهاجمی که دسترسی به کنسول کامپیوتر یا سروری پیدا نموده است و امکان reboot نمودن آنرا داشته باشد, میتواند به واسط shell با سطح دسترسی root (به هنگام درخواست سیستم برای ورود پسورد به منظور رمزگشایی) دستیابی پیدا کند. این shell در محیط initrd اجرا شده و مشخصا در حالی این اتفاق می افتد که هارددیسک رمزگذاری شده و توقع میرود که امکان bypass آن هرگز وجود نداشته باشد. اما پارتیشن های دیگر نیز ممکن است رمزگذاری نشده باشند و بنابراین کاملا در دسترس خواهند بود. در ادامه به بیان سه استراتژی انجام exploit این آسیب پذیری پرداخته شده است:

• Elevation of privilege (افزایش سطح دسترسی): اگر پارتیشن boot رمزگذاری و امن نشده باشد که معمولا چنین است:
۱-مهاجم میتواند فایل اجرایی را که با setUID = enabled پیکربندی نموده را در پارتیشن قرار داده و بعدا و پس از رمزگشایی هارددیسک به افزایش سطح دسترسی یک کاربر معمولی و تبدیل شدن به سطح دسترسی کاربر ارشد root بیانجامد.
۲-اگر فرآیند boot امن نشده باشد مهاجم میتواند kernel و initrd را جا به جا نماید.

• Information Disclosure (دستیابی به اطلاعات): مهاجم میتواند به کلیه اطلاعات هارددیسک رمزگذاری شده دسترسی پیدا نموده و آنرا کپی نموده و به هارد دیگر منتقل نماید تا بعدا آنرا مورد brute-force قرار دهد.

• Denial of Service (جلوگیری از دسترسی): مهاجم میتواند اقدام به پاک نمودن اطلاعات هارددیسک نموده و سیستم را از بین ببرد.

آسیب پذیری در عمل

این آسیب پذیری توسط اشتباه در فرآیند چک کردن پسورد در اسکریپت /scripts/local-top/cryptroot بوجود آمده است و از نظر برنامه نویسی و زمانی که کاربر به ماکزیمم تعداد, پسورد اشتباه (پیش فرض ۳ بار ) را وارد نموده است مربوط میشود. این اشتباه را میتوان در شکل ۳ به وضوح مشاهده نمود:



 
 


 
 

در شکل زیر اسکریپتی است که تابع() setup_mapping را در شکل بالا صدا میزند و مسئولیت اصلی آن هندل کردن error هایی است که در صورت مواجه سیستم با هارددیسک های با سرعت کند که نیاز به زمان بیشتری برای load کردن اطلاعات دارند میباشد. همچنین در این تابع به هارددیسک های با خطا مواجه شده هنگام load , 30 مرتبه دیگر نیز مجوز mount شدن داده میشود (این اتفاق بر روی سیستم های با معماری x86 سی مرتبه و سیستم های با معماری power pc یکصد و پنجاه مرتبه میباشد خطوط ۸۴ تا ۹۹ در شکل زیر) در حالیکه با هر فراخوانی اشتباه به منظور mount نمودن , به کاربر ۳ بار دیگر مجوز ورود پسور داده میشود (خط ۴۰۵ شکل ۳) بنابراین در معماری x86 کاربر میتواند ۹۳ بار پسورد خود را وارد نماید.


 
 


 
 

اما مشکل اصلی زمانی پیش می آید که اسکریپت شکل ۴ پس از ۳۰ مرتبه اجرا (۹۳ مرتبه ورود پسورد توسط کاربر) به خط ۱۱۴ رسیده و بدون اطلاع از سر منشا اصلی error که mount نشدن هارددیسک بدلیل عدم ورود پسورد صحیح توسط کاربر است, که در شکل ۳ اتفاق افتاده است و در خط ۱۲۴ اقدام به اجرای دستور panic به همراه انتقال کاربر به واسط busybox shell را مینماید. از آنجاییکه این واسط shell توسط سیستم فراخوانی شده است با دسترسی root خواهد بود.

نحوه اجرای Exploit

کاربر تنها میبایست به طور مداوم کلید Enter را به مدت ۷۰ ثانیه تقریبی نگه داشته تا busybox shell پدیدار شود.

نحوه برطرف نمودن این آسیب پذیری
تنها روش کنترل تعداد مراتب ورود پسورد غیر صحیح توسط کاربر و جلوگیری از اجرای فرآیند mount و بوت شدن کامپیوتر می باشد که بهترین روش برای رسیدن به این هدف اجرای reboot به هنگام رسیدن به ماکزیمم تعداد ورود پسورد غلط (۳ بار ) میباشد که در شکل زیر توضیح داده شده است.



 
 


 
 

به علاوه اینکه تابع panic میبایست به نحو موثرتری پیاده سازی شود به طوری که این تابع از در دسترس قرار دادن busybox shell به کاربر جلوگیری نموده و با اضافه نمودن پارامتر kernel panic به GRUB bootloader parameters از باز شدن هرگونه shell به طور کلی جلوگیری نمود. این عملیات در شکل های ۶ و ۷ نمایش داده شده است:


 
 


 
 


 

دیار