اين روش با جلوگيري از سرريز بافر به وسيله جايگزيني توابع ناايمن با توابع همانند آنها ولي امن، امنيت را تامين ميکند. همچنين اگر سرريزي رخداد، اين مکانيزم اجراي پروسس را متوقف ميکند. گفتني است اندازه بافر هنگام کامپايل يا اجرا تشخيص داده نميشود و برخي از نفوذها ممکن است توسط اين مکانيزم شناخته نشوند. همچنين اين مکانيزم براي حفرههاي امنيتي رشتهها نيز تدابيري انديشيده است.
بهتر است اشاره شود که اسکريپت ميتواند براي تملک FORTIFY_SOURCE از طريق يک سمبل اقدام کند و متوجه شود که اين باينري مسلح به مکانيزم دفاعي است يا نه؟ يعني بهصورت فرضي، يک باينري ميتواند از هيچيك از توابع FORTIFY استفاده نکند يا شرايطي رخ دهد که اين مکانيزم فعال نشود (سايز بافر تا پيش از اجرا مشخص نباشد) که نتيجه مثبت، نادرست از آب در خواهد آمد.
همچنين اگر اندازه تمام بافرها پيش از کامپايل مشخص باشد، نيازي به استفاده توابع FORTIFY وجود ندارد و از اينرو باز هم نتيجه غلط، نادرست ميشود. براي اين که اين مکانيزم فعال شود، فايل باينري بايد پيش از کامپايل پرچم بهينهسازي را با مقدار حداقل2 پر کند. اين کار را ميتوان با فرستادن گزينه
O2– به gcc هنگام کامپايل انجام داد.
همانطور که از نمودار بالا ميتوان دريافت، تمام توزيعهاي مقايسه شده بهجز دبيان از اين سيستم محافظتي خوب استفاده ميکنند و حدود 80 درصد از باينريها با اين مکانيزم محافظت شدهاند. جنتو به 90درصد رسيده است و اين نشان ميدهد که ديگر توزيعها ميتوانند براي چند باينري ديگر اين سيستم را فعال کنند. با اين وجود بايد اشاره کرد که جنتو بهصورت پيشفرض پروسسهاي کمتري را اجرا ميکند. در اين مقايسه، دبيان تنها براي دو پروسه اين مکانيزم را فعال کرده است (3درصد) و هر دوي آنها متعلق به بسته Kerneloops بودهاند.
اجراييهاي مستقل از مکان (PIE)
توانمندي پيشبيني آدرسهاي حافظه يک پروسه و بخشهاي آن کمک بزرگي به مهاجم است تا به سيستم نفوذ کند. هرچند در سالهاي اخير تصادفيکردن آدرسهاي حافظه در سيستمهايعامل بهکار رفته، اما بيشتر باينريها هنوز به شيوه قديمي در لينوکس بارگذاري ميشوند، مگر اين که بهصورت فايل اجرايي مستقل از مکان کامپايل شوند.
کامپايل کردن باينري بهعنوان مستقل از مکان به سيستمعامل اجازه ميدهد تمام بخشهاي يک پروسس را هنگام اجرا در آدرسهاي تصادفي قرار دهد. اين اقدام باعث ميشود نفوذ به سيستم بسيار دشوار باشد و اين تصادفي قرار دادن پروسسها، به يک آنتروپي منجر شود؛ يک سيستم 64 بيتي ميتواند سيستم تصادفي بهتري از يک سيستم 32 بيتي داشته باشد، چراکه رنج آدرسدهي آن به مراتب وسيعتر از سيستمهاي 32 بيتي است.
تمام هستههاي مدرن قابليت تصادفيسازي بخشهايي از حافظه فضاي آدرس يک پروسه را دارند حتي اگر اين پروسه بهصورت مستقل از مکان کامپايل نشده باشد. اين موضوع از طريق تنظيمات randomise_va_space در سيستم فايل proc کنترل ميشود. وقتي اين مقدار 2 باشد، لينوکس درخواستهاي پشته، هيپ و (mmap)را بهصورت تصادفي قرار ميدهد. وقتي به 1 تغيير پيدا ميکند، فقط فضاي پشته بهصورت تصادفي چيده خواهد شد.
همانطور که پيش از اين اشاره شد، بخشهايي از حافظه يک پروسس ميتواند وجود داشته باشد که به يک مکان خاص حافظه اشاره ميکند، هرچند کد يک پروسس بهصورت مستقل از مکان کامپايل شده باشد. مهاجم در اين حالت بايد يا از طريق حدس، يا از طريق Bruteforce اين مکان از حافظه را حدس بزند.
البته بهتر است اشاره شود که کدهاي مستقل از مکان در معماري x86 مشکل بازدهي دارند و بين 1 تا 5 درصد نسبت به کدهاي غيرهمنوع کندتر عمل ميکنند. برخي از نرمافزارها خصوصا اگر به زبان ماشين نوشته شده باشند، نميتوانند بهصورت مستقل از مکان کامپايل شوند.
همانطور که در نمودار بالا ميتوان مشاهده کرد، بيشتر توزيعهاي مقايسه شده از اين مکانيزم در وسعت بالا استفاده نميکنند. مقادير از 8 درصد (دبيان) تا اوپنسوسه (21درصد) متغير است ولي جنتو به 100درصد رسيده است. همچنين بهتر است اشاره شود که توزيعها از اين قابليت تنها براي پروسههاي فوق حساس، از جمله سرويسهاي تحت شبکه SSH استفاده ميکنند. با اين وجود، صرف نظر از جنتو، تنها اوبونتو مکانيزم مستقل از مکان را براي فايرفاکس فعال کرده است.
چراکه بيشتر حملات از طريق مرورگر و حفرههاي موجود در آنها انجام ميشود، از اين رو بهتر است اين نوع پروسسها در مقابل حملات مقاومتر شوند. تجربه نشان داده است کاربر به سيستمهاي امنيتي پايه بسنده ميکند و تنظيماتي را که بهصورت پيشفرض توسط توليدکننده فعال نشده، فعال نخواهد کرد. از اينرو بهتر است پروسسهاي غيرسيستمي اما مهم نيز در مکانيزمهاي امنيتي شريک شوند.
هرچند اين مکانيزمهاي امنيتي هر کدام تاثير بهخصوصي در بهبود امنيت سيستم دارند، بسته به نوع ديدگاه يک توزيع، پيادهسازيهاي اين مکانيزمها با يکديگر متفاوت است و گاهي برخي پروسسهاي حساس از جمله پروسسهاي مبتني بر شبکه با مکانيزمهاي بيشتري کنترل شدهاند و برخي چون مرورگرهاي وب خيلي امن نيستند.
بهنظر ميرسد هيچ گلوله سيميني در سينه هيچ توزيع لينوكسي فرو نخواهد رفت. توزيعهاي مختلف مکانيزمهاي مختلف امنيتي دارند و بهنظر ميرسد برنده اين مقايسه مشخص نيست.
هرچند پروژه Gentoo Hardened، بالاترين نرخ استفاده از مکانيزمهاي امنيتي فضاي حافظه سمت کاربر را دارد و براي بهترين نتيجه امنيتي بايد کمي دستها را خاکي کرد و بهترين نتيجه را از تنظيمات گرفت.
از مسائل امنيتي سمت کاربر گفتيم اما بدون تنظيمات اضافه در سمت هسته سيستم، بيشتر مکانيزمهايي که شرح داديم نميتوانند بهطور کامل فعال شوند، از اينرو بهتر است به بخشي از ويژگيهاي هسته بپردازيم که تاثير مستقيمي روي امنيت باينريهاي در حال اجرا دارند.
جهت اختصار، برخي از فريمورکهاي امنيتي از جمله SELinux، Grsecurty RBAC، AppArmor و مانند آنها در اين مقاله گنجانيده نشدهاند.
بيشتر قابليتهاي هستهاي که در اين بخش شرح داده ميشوند، به سيستمهاي حفاظتي فضاي سمت کاربر کمک ميکنند. هرچند برخي از آنها مستقيما روي امنيت خود هسته تاثير دارند. امنيت هسته بسيار مساله مهمي است و حمله کننده ميتواند کد خود را در فضاي هسته اجرا کند. اين مساله نشان ميدهد که بايد امنيت هسته را فعال کرد.
هسته لينوکس توسعه سريعي دارد و بهطور مداوم قابليتهاي جديدي به آن اضافه ميشود و همچنين تطابق آن با دستگاههاي جديد روز بهروز بيشتر ميشود.
از اينرو بايد اشاره کرد که تاثير مستقيم و غيرمستقيم اين مسائل در امنيت هسته لينوکس انکارناپذير است. همچنين نامعقول نيست که فعال کردن قابليتهاي امنيتي هسته منجر به کند شدن سيستم و هسته شود.
آزمون
در اين آزمون، خروجيها از تنظيمات زير گرفته شده و ابزارهاي مورد استفاده بهصورت زير هستند:
- 'mmap_min_addr' (/proc/sys/vm/mmap_min_addr)
- 'randomize_va_space' (/proc/sys/kernel/randomize_va_space)
- paxtest-0.9.9.tgz
گزينه اول براي تنظيم حداقل تعداد آدرسهاي مجازي است که ميتواند در فضاي کاربر تعريف شود.
اين دستور مشکلات امنيتي زيادي دارد؛ مثلا اگر مهاجم بتواند يک پوينتر NULL را فراخواني کند، بهراحتي ميتواند به هسته آسيب بزند. اگر صفحهاي در آدرس
0 قرار داشته باشد و با داده دلخواه پرشود، در اين صورت تمام حافظه در اختيار مهاجم قرار ميگيرد.
استفاده از اين تنظيمات هسته و تغيير آن به مقدار امنتري، مثلا حداقل 64 کيلوبايت ميتواند از نفوذها بکاهد.
دومين تنظيم مشخص ميکند که بخشهاي حافظهاي يک پروسس هنگام اجرا آدرسهاي تصادفي دريافت ميکنند. دومين تنظيم اگر به مقدار
0 تغيير کند، در اين صورت عمليات تصادفيسازي بهطور کامل غيرفعال ميشود. اگر 1 تنظيم شود، آدرسهاي پايه در پشته و همچنين صفحههاي VDSO و درخواستهاي mmap تصادفيساز ميشوند.
اين يعني کتابخانههاي اشتراکي در آدرسهاي کاملا تصادفي بارگذاري شده و همانند باينريهاي مستقل از زمان، فراخواني ميشوند.
اگر اين مقدار به 2 تغيير پيدا کند، بهعلاوه تمام حفاظتهاي پيشتر گفته شده، آدرسهاي پايه در حافظه هيپ نيز تصادفيسازي ميشوند. البته توزيعهايي که بسته Pax را براي هسته خود قرار داده باشند، چه در حالت 1 و چه در حالت2، اين قابليت را براي آدرسهاي پايه حافظه هيپ فعال کردهاند.
محمدرضا قرباني