قابلیتهای امنیتی اوپنبیاسدی
سیستمعامل اوپنبیاسدی به خاطر تمرکزش بر روی امنیت و همینطور به خاطر ابداع و پیادهسازی کردن تعدادی تکنولوژی و قابلیت امنیتی شناخته میشود. این مقاله به بررسی این قابلیتها میپردازد.
باگها و مشکلات نرمافزاری عمدتاً به خاطر اشتباهاتی که برنامهنویس در حین نوشتن برنامه مرتکب میشود، به وجود میآیند. یک اشتباه رایج، استفاده از توابع strcpy و strcat در زبان برنامهنویسی سی است. این توابع حدود آرایه را بررسی نمیکنند و باعث میشوند آرایهای که رشته در آنها ذخیره شده، سرریز شود. برای حل کردن این مشکل، دو تابع به نامهای strncpy و strncat به عنوان جایگزینی برای آن دو تابع معرفی شدهاند. با این حال، فهمیدن و درک کردن این دو تابع جایگزین، مشکل است و احتمال اینکه به صورت نادرست مورد استفاده قرار گیرند، بسیار بالاست. به همین دلیل، دو تن از توسعهدهندگان اوپنبیاسدی به نامهای تاد سی. میلر و تئو درات توابع strlcpy و strlcat را به عنوان جایگزینی برای این توابع طراحی کردند. این دو تابع به صورت منطقی بوده و استفاده از آنها آسان است و احتمال اینکه یک برنامهنویس اشتباهاً بافری را به صورت unterminated رها کند (یعنی کاراکتر null را در انتهای آن قرار ندهد) و باعث سرریز شدن بافر شود را کاهش میدهد. این دو تابع، توسط سیستمعاملهای فریبیاسدی و نتبیاسدی هم مورد پذیرش قرار گرفته و در آنها هم گنجانده شدهاست، با این حال، این دو تابع در کتابخانه سی گنو مورد پذیرش قرار نگرفت، چرا که اولریش دریپر، نگهدارنده این کتابخانه، با ادغام این توابع در کتابخانه سی گنو به شدت مخالفت کرد و اظهار داشت که هرچند ممکن است استفاده از این دو تابع توسط برنامهنویسان، احتمال به وجود امدن مشکلاتی که این دو تابع به خاطر حل آن به وجود آمدهاند را کم کند، اما باز هم این احتمال وجود دارد که این دو تابع خود به گونهای دیگر باعث پیش آمدن مشکل شوند.
در اوپنبیاسدی، برنامه linker طوری تغییر یافته که در صورت پیدا شدن توابع نامطمئنی همچون strcpy, strcat یا sprintf هشداری را نمایش دهد. تمام این توابع در درخت کد منبع اوپنبیاسدی جایگزین شدهاند. به علاوه، یک static bounds checker هم در اوپنبیاسدی گنجانده شده تا اشتباهات رایج در برنامهنویسی را در حین کامپایل شدن برنامهها تشخیص دهد. از دیگر رابطهای برنامهنویسی نرمافزاری که توسط اوپنبیاسدی طراحی شدهاند، میتوان به issetugid و arc4random اشاره کرد.
حفاظت از حافظه
اوپنبیاسدی تعدادی تکنولوژی به همراه خود دارد تا از حملات سرریز بافر و سرریز عدد صحیح جلوگیری کند.
افزونه ProPolice که توسط Hiroaki Etoh طراحی شدهاست، افزونهای برای کامپایلر جیسیسی است که برنامهها را از حملات stack-smashing محافظت میکند. برای دست یافتن به این هدف، این افزونه چند کار را انجام میدهد. در ترتیب قرارگیری متغیرهای محلی پشته تغییری ایجاد شده تا بافرها پس از اشارهگرها قرار گیرند تا اگر سرریز بافر رخ داد، آسیبی نبینند. اگر در فهرست آرگومانهای تابع، آرگومانی از نوع اشارهگر وجود داشته باشد، این نوع آرگومانها قبل از بافرهای محلی قرار میگیرند و همینطور یک مقدار canary هم پس از بافرهای محلی قرار میگیرد. وقتی که اجرای تابع به اتمام میرسد و تابع خارج میشود (برمیگردد) این مقدار canary بررسی میشود. اگر تغییر نکرده بود، سرریز بافر رخ نداده است، اما اگر تغییر کرده بود، احتمال رخ دادن سرریز بافر وجود دارد. البته این کار میتواند سرباری اضافه به سیستم تحمیل کند. به همین دلیل، ProPolice با اسفاده از یک فناوریهای هوشمند، تشخیص میدهد که یک بافر چقدر آسیبپذیر است و آیا نیاز به محافظت دارد یا نه. بدین ترتیب با بررسی نکردن بافرهای قابل اطمینان، سربار تحمیل شده بر روی سیستم هم کم میشود. این قابلیت در دسامبر ۲۰۰۲ در جیسیسی موجود در اوپنبیاسدی پیادهسازی شد و اولین بار در نسخه ۳٫۳ در دسترس قرار گرفت. در همه معماریهایی که اوپنبیاسدی از آنها پشتیبانی میکند، میتوان از این قابلیت استفاده کرد و به صورت پیشفرض هم فعال شدهاست. بنابراین، هر گونه کدی که به زبان سی نوشته شده، در صورتی که بر روی اوپنبیاسدی کامپایل شود، به شکل پیشفرض مورد حفاظت قرار خواهد گرفت، بدون اینکه نیاز به مداخله کاربر باشد.
در اوپنبیاسدی ۳٫۴ قابلیت جدیدی به نام W^X که مخفف Write XOR Execute است، معرفی شد. به موجب این قابلیت، هر صفحه در فضای آدرس یک فرایند یا خواندنی است یا نوشتنی، اما نمیتواند بهطور همزمان هر دو باشد. نام این قابلیت از عملگر بولی XOR آمدهاست. این قابلیت از بروز برخی حملات سررسیز بافر جلوگیری میکند. در حالی که پیادهسازی کردن این قابلیت در معماریهایی نظیر AMD64 به دلیل داشتن بیت اناکس سختافزاری آسان است، اوپنبیاسدی یکی از معدود سیستمعاملهایی است که از این قابلیت در معماری i386 هم پشتیبانی میکند که فاقد قابلیت کنترل کردن بیت اجرا به ازای هر صفحه است.
در حین توسعه نسخه ۳٫۸، تغییراتی در توابع اختصاص حافظه malloc صورت گرفت. در سیستمعاملهای سنتی یونیکس، تابع malloc حافظه را با گسترش دادن سگمنت داده یونیکس، به برنامهها اختصاص میدهد. این روش باعث میشود تا پیادهسازی کردن راهکارهای قدرمتند در برابر مشکلات امنیتی سختتر شود. malloc در اوپنبیاسدی طوری پیادهسازی شدهاست که از فراخوان سیستمی mmap استفاده کند و این فراخوان سیستمی هم به نوبه خود طوری پیادهسازی شده که همیشه یک آدرس تصادفی از حافظه را برگرداند تا این اطمینان حاصل شود که نواحی مختلف به صورت پشت سر هم به برنامه اختصاص داده نشوند. علاوه بر آن، اختصاص دادن بلاکهای کوچک در نواحی مشترک حافظه به شکل تصادفی است و تابع free هم طوری تغییر یافته که به جای اینکه حافظه را به صورت map شده برای فرایند رها کند، آن را بلافاصله به هسته سیستم برگرداند. تعدادی بررسی اضافه و اختیاری به منظور تسهیل توسعه اضافه گشته است. این قابلیتها شناسایی کردن باگهای برنامه را آسانتر میکنند و سوءاستفاده از باگهای برنامه را دشوارتر میکنند. به جای اینکه حافظه خراب شود یا یک دسترسی غیرمجاز نادیده گرفته شود، برنامه یک خطای segmentation fault دریافت خواهد کرد و اجرای آن متوقف خواهد شد. این قابلیت باعث آشکار شدن چند اشکال در نرمافزارهای اجرا شده در اوپنبیاسدی ۳٫۸ شدهاست، به خصوص برنامههایی که اطلاعات را فراتر از بخش آغازین یا پایانی یک بافر میخوانند که اینگونه باگها در گذشته مستقیما شناسایی نمیشدند، اما اکنون میتوانند باعث بوقوع پیوستن یک خطا شوند. پیادهسازی این قابلیتها بیش از سه سال به طول انجامیده است و کارایی چشمگیری هم از دست نرفتهاست و مشابه اهدافی هستند که برای کتابخانه اشکالزدایی malloc نوشته شده توسط بروس پرنز، به نام الکتریک فنس هستند.
اکس
بر روی نسخهای از سیستم پنجره اکس که در اوپنبیاسدی استفاده میشود و زینوکارا نام دارد، تعدادی تغییر و ویژگی امنیتی با خود دارد. بخش سرور و برخی از برنامههای پیشفرض مجهز به تکنیکی به نام جداسازی اختیارات و دیگر بهینهسازیها هستند و علاوه بر آن اوپنبیاسدی یک درایور «aperture» فراهم کرده تا دسترسی سیستم X به حافظه را محدود کند. با این حال، پس از فعالیتهای اخیر Loïc Duflot بر روی نواقص امنیتی، تئو درات اظهار داشت که درایور aperture «بهترین کاریست که ما میتوانیم انجام دهیم» و همچنین اکس «تمامی مدلهای امنیتی که شما در دانشگاه با آنها آشنا شدهاید را نقض میکند. او سپس از توسعهدهندگان اکس بابت خواست تا «برای برطرف کردن این حفره قدیمی بزرگتر از ۱۰ سال وقت صرف کنند» اخیرا، یک دایور هسته VESA توسعه داده شدهاست ک که X را کمی آهستهتر اجرا میکند، اما بدون استفاده از آن درایور aperture.
بعدها مشکلات امنیتی X برطرف شد و هماکنون X را میتوان بدون داشتن هرگونه امتیازی بر روی اوپنبیاسدی اجرا کرد.
دیگر قابلیتها
جداسازی اختیارات، بازپسگیری اختیارات، chroot کردن و بارگذاری کتابخانهها به صورت تصادفی در حافظه اصلی نقش مهمی را در بالا بردن امنیت سیستم ایفا میکنند. بسیاری از این قابلیتها به برنامههایی که در اوپنبیاسدی وجود دارند، از جمله apache و tcpdump و همچنین سیستم احراز هویت BSD Authentication هم اعمال شدهاند.
منابع
- مشارکتکنندگان ویکیپدیا. «OpenBSD security features». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۲۸ دی ۱۳۹۲.