حملاتي که به سيستمهاي عامل انجام ميشود، بهطور كلي حافظه و مشکلات مديريت آن را هدف ميگيرند و در واقع، تخريب حافظه يکي از راههاي معمول براي نفوذ به سيستمهاي کامپيوتري مدرن است. ماجرا از اين قرار است که يک سرريزي بافر ميتواند کار را به حملات پيچيده تخريب حافظه بکشاند و نظام يکپارچه پروسهها و حافظه سيستم را بههم بزند.
امنيت سيستمها هر چند که در طول ساليان مختلف و از هر نگارش به نگارش بعدي بهبود يافته است، اما تکنيکهاي هجوم به اين بخش از سيستم در طول زمان پيچيدهتر شده و در توزيعهاي مختلف لينوکس براي آزمون امنيت بهکار ميرود. بسياري از کارشناسان معتقدند برخي از مکانيزمهاي امنيت در مقايسه با ديگر روشها، مقاومتر هستند. علاوه بر اين، تعدادي از اين روشها تاثير زيادي روي بازدهي سيستم ميگذارند و حتي ميتوانند هنگام کامپايل نرمافزاري خاص، از نظر تطبيق با سيستم مشکلساز شوند.
ميتوان اشاره کرد که اين دو فاکتور، يعني تاثير در بازدهي سيستم و امکان از دست رفتن کنترل روي نگهداري سيستم، بزرگترين دغدغههايي است که تمام مکانيزمها و روشهاي مقاومت در برابر حفرههاي امنيتي در توزيعهاي لينوکس با آن مواجهند. در هر نرمافزار و توسعه نرمافزاري آن ميتوان بدون هيچ تعجبي مشاهده کرد که اين مساله حتي ميتواند بحثهاي شديدتري بين چندين پروژه بهوجود بياورد (همانطور که بحثهاي زيادي ميان اعضاي پروژه Grsecurity و تيم توسعه هسته لينوکس بهوجود آمد).
با اين وجود، در اين مقاله تلاش شده است تا بين 5توزيع محبوب لينوکس، دبيان، فدورا، اوبونتو، اوپنسوسه و جنتوهاردند مقايسهاي از نظر پيادهسازي مکانيزمهاي محافظت انجام شود. 4 توزيع نخست بسيار پرکاربرد هستند و جنتو بهعنوان توزيع ميزان براي بهدست آوردن ديدگاهي از يک توزيع امن انتخاب شده است.
مکانيزمهاي امنيتي که در اين مقايسه انجام شده، بهصورت زير است:
- نگاشت حافظه غيراجرايي (استفاده از بيت سختافزاري NX)
- کد يا برنامه مستقل از محل (PIC/PIE)
- پيادهسازي قابليت FORTIFY_SOURCE از glibc
- محافظت از نابودي پشته (SSP)
- RELRO يا محکم کردن برنامههاي ELF با مرتبسازي بخشهايي از فايل و تبديل آنها به حالت فقطخواندني.
همچنين ابزارهاي زير براي مقايسه استفاده شد:
- checksec.sh – با اصلاح کوچکي که وضعيت FORTIFY_SOURCE را نشان دهد.
- اسکريپت پايتوني که قابليتهاي checksec.sh را افزايش ميدهد.
دادههاي آزمايش نيز از طريق کاربري که وارد سيستم X شده و يک دمون sshd و مرورگر فايرفاکس را اجرا کرده، گردآوري شده است. از آنجا که برخي از توزيعها نسبت به ديگران هنگام اجرا تعداد پروسههاي مختلفي دارند (مثلا اوبونتو 96 و جنتو تنها 34 پروسه دارد)، اين اقدام باعث ميشود که نتايج يکسان دربيايد.
در ويکيپديا آمده است که هسته لينوکس بيت NX را از زمان توزيع 8/6/2 پشتيباني کرده است. از اينرو براي سختافزارهاي 32 و 64بيتي که اين بيت را در مدار خود دارند، فعال است. براي بهره بردن از نگاشت حافظه غيراجرايي در سختافزارهايي که از اين قابليت استفاده نميکنند، لازم است که وصله grsecurity يا بسته Exec Shield را از رد هت دريافت کنيد. همچنين بايد اشاره شود که بدون محافظت اضافه، مهاجم بهسادگي ميتواند بيت NX را دور بزند و دسترسيها را بهصورت دستي تنظيم کند. از آنجا که اين مساله به هسته لينوکس برميگردد در شمارههاي آينده در مورد آن صحبت خواهد شد.
همچنين بايد اشاره شود که بهجز بيت NX، تمام مکانيزمهاي امنيتي که در اين مقاله به آن اشاره شده است در بخش فضاي کاربري حافظه پيادهسازي شدهاند و در سطح هسته نيستند. همچنين مهم است بدانيم حفرهاي که در هسته لينوکس وجود دارد، صرف نظر از مکانيزمهاي امنيتي که براي پروسسهاي فضاي کاربر فعال شده است، ميتواند مورد تهاجم قرار بگيرد. از اينرو ميتوان هستههاي سيستم عامل امروزي را با پشتيباني نابودي پشته کامپايل کرد، هرچند بهبود امنيت هسته اغلب به نصب وصلههاي زيادي از جمله وصله grsecurity منجر ميشود. برخي از توزيعها براي خود وصلههاي خاص امنيتي منتشر ميکنند.
RELRO
حفاظت ساختمان داده داخلي يک فايل ELF بر عهده RELRO است تا نگذارد اطلاعات آن را مهاجم ببيند يا جريان اجراي آن را کنترل کند. اين امنيت را با اصلاح جدول اتصال روندها (PLT) يا جدول عمومي آفستها (GOT) که بخشي از فايل ELF است، تضمين ميکنند.
وقتي RELRO استفاده ميشود، کل بخش GOT به حالت فقطخواندني تغيير پيدا ميکند و از اين رو وقتي پروسس اجرا ميشود نميتواند توسط هيچ مهاجمي قابل تغيير باشد. اگر RELRO بهصورت جزيي پيادهسازي شود، فقط PLT و GOT بهعنوان فقطخواندني علامت زده ميشوند. هر دوي اين گزينهها البته ساختمان داده ELF را از نو مرتب ميکنند تا مهاجم نتواند اين بخشها را با بخشهاي ديگر ELF روي هم بيندازد.
همچنين لازم به ذکر است که RELRO كاملا نيازمند آن است که تمامي سمبلها هنگام اجراي برنامه شناسايي شود تا بتوان کل GOT را بهصورت فقط خواندني در آورد. از اين رو برنامههاي بزرگتر با کندي بيشتري هنگام بازشدن روبهرو ميشوند و تعداد زيادي از سمبلها از کتابخانههاي اشتراکيافته بايد بارگذاري شوند.
همانطور که در شکل نيز اشاره شده است، دبيان و فدورا هنوز بهطور کامل اين مکانيزم را پياده نکردهاند و براي درصد اندکي از باينريهاي خود، بهصورت جزيي آن را فعال کردهاند. در مثال ما فدورا و دبيان براي هيچ کدام از برنامههايي که بهصورت پيشفرض اجرا ميشوند، آن را فعال نکرده بودند. از سوي ديگر، اوبونتو و اوپنسوسه RELRO را بهصورت جزيي براي تمام پروسسها فعال و RELRO کامل را براي بخشي از آنها فعال کردهاند. جنتو RELRO را بهطور کامل براي تمام برنامهها بهجز يکي فعال کرده است که آن هم بهصورت جزيي RELRO دارد.
از سوي ديگر تنها باينرياي که در اوپنسوسه قابليت RELRO کامل را داشت، pulseaudio بود.
محافظ خرابي پشته
محافظ خرابي پشته سوء استفاده از سرريزي بافر را با پيادهسازي بررسيهاي امنيتي بيشتر در پروسس پشته دشوارتر ميکند. افزونه SSP در کامپايلر GCC از زمان نگارش 1/4 به اين برنامه اضافه شد.
همانطور که در نمودار بالا ميتوان مشاهده کرد، فدورا، اوپنسوسه و اوبونتو نتيجهاي بهنسبت مساوي دارند و تقريبا 80 درصد از اين توزيعها، اين قابليت را براي پروسسهاي خود فعال کردهاند. تفاوتهاي قابل مشاهده در دبيان و جنتو وجود دارد و 10درصد از پروسسها اين مکانيزم را فعال کردهاند. در مورد جنتو بايد گفت که اين مساله يک مشکل داخلي بود که اول بايد آن را برطرف ميکردند و بعد اين قابليت را بهصورت کلي در سيستم پياده ميکردند. گفتني است که در نگارش بعدي جنتو و کامپايلر gcc، اين قابليت آزموده و فعال شده است و احتمالا در بهروزرساني بعدي gcc به سيستم اضافه شود.
محمدرضا قرباني