استاندارد CERT برای برنامه نویسی امن
عنصر اصلی در کدنویسی امن با زبان های مختلف برنامه نویسی، مستند سازی خوب و استفاده از استانداردهای قابل اجرا است. استانداردهای کدنویسی، برنامه نویسان را ترغیب به پیروی از مجموعه ای یکپارچه از قوانین و راهنماییها می کند که بر اساس نیازمندی های پروژه و سازمان تعیین شده است، نه بر اساس سلیقه و مهارت های مختلف برنامه نویسان.
عنصر اصلی در کدنویسی امن با زبان های مختلف برنامه نویسی، مستند سازی خوب و استفاده از استانداردهای قابل اجرا است. استانداردهای کدنویسی، برنامه نویسان را ترغیب به پیروی از مجموعه ای متحدالشکل از قوانین و راهنماییها می کند که بر اساس نیازمندی های پروژه و سازمان تعیین شده است، نه بر اساس سلایق و مهارت های مختلف برنامه نویسان. به محض تعیین استانداردهای مذکور، می توان از آن به عنوان معیاری برای ارزیابی کدهای منبع، چه به صورت دستی و چه به صورت اتوماتیک استفاده کرد.
از استانداردهای معروف در این زمینه می توان به استانداردCERT برای کدنویسی امن اشاره کرد که یک سری از قوانین و پیشنهادات را برای کد نویسی امن با زبان های برنامه نویسی C، C++ و جاوا ارائه می دهد. هدف از این قوانین و پیشنهادات، حذف عادت های کدنویسی ناامن و رفتارهای تعریف نشده است که منجر به آسیب پذیری های قابل سوءاستفاده می شود. به کارگیری استانداردهای مذکور منجر به تولید سیستم های با کیفیت بالاتر می شود که در برابر حملات بالقوه، پایدارتر و مقاوم تر هستند.
قوانین در برابر پیشنهادات
استانداردهای CERT برای کدنویسی امن شامل یک سری قوانین و پیشنهادات می شوند. در زیر تعریف هر کدام از آنها آورده شده است.
قوانین
یک روش برنامه نویسی زمانی به عنوان قانون تعریف می شود که دارای خصوصیات زیر باشد:
سرپیچی از روش فوق احتمالاً منجر به یک نقص امنیتی شده و ممکن است به یک آسیب پذیری قابل سوءاستفاده تبدیل شود.
پیروی از روش فوق را بتوان توسط تحلیل اتوماتیک، راهکارهای رسمی یا تکنیک های بازرسی دستی تشخیص داد.
پیاده سازی قوانینی که در استاندارد CERT برای برنامه نویسی امن آورده شده، برای اطمینان از امنیت سیستم هایی که با زبان برنامه نویسی مربوطه ایجاد شده اند، شرط لازم است ولی کافی نیست. در این استانداردها قوانین با برچسب rule مشخص می شوند.
پیشنهادات
پیشنهادات در حقیقت یک سری از راهنمایی ها و توصیه ها است. یک روش کدنویسی زمانی به عنوان یک پیشنهاد در نظر گرفته می شود که شرایط زیر را دارا باشد:
به کارگیری روش کدنویسی مذکور، باعث ارتقای امنیت سیستم شود.
شرایطی که برای در نظر گرفتن روش مذکور به عنوان یک قانون لازم است، در مورد این روش کدنویسی صدق نکند.
در هر تجربه کدنویسی، مجموعه ای از پیشنهادات با توجه به نیازمندی های امنیتی محصول نهایی مورد استفاده قرار می گیرد. پروژه هایی که نیازمند سطح امنیتی بالایی هستند، می توانند منابع بیشتری را به امنیت اختصاص دهند و در نتیجه مجموعه بیشتری از پیشنهادات را نیز به کار گیرند.
در استانداردهای CERT برای کدنویسی امن، از برچسب recommendation برای نشان دادن پیشنهادات استفاده می شود.
استثناءها
هر قانون یا پیشنهادی ممکن است حاوی مجموعه کوچکی از استثناءها باشد که نشان می دهد تحت چه شرایطی به کار بردن قانون یا پیشنهاد مذکور برای بالا بردن سطح امنیتی محصول ضروری نیست. استثناءها فقط برای اطلاع کاربر عنوان می شوند و پیروی از آنها لازم نیست. استثناء ها در استاندارد CERT برای برنامه نویسی امن با برچسب exceptions مشخص می شوند.
شناسه ها
در استانداردهای مذکور، هر قانون یا پیشنهاد، دارای یک شناسه یکتا است.(برای مثال PRE30-C ) این شناسه ها از سه قسمت تشکیل شده اند:
یک بخش سه حرفی که نشان دهنده بخش استاندارد است برای مثال PRE که نشان دهنده preprocessor است. این بخش نشان دهنده روش های کدنویسی مشابه در یک گروه است.
یک عدد دو رقمی بین 00 تا 99 که برای یکتا سازی شناسه به کار می رود. شماره های 00 تا 29 برای پیشنهادات و شماره های 30 تا 99 برای قانون ها ذخیره شده اند.
قسمت سوم مربوط به نام زبان است برای مثال C.
به کارگیری استاندارد
قوانین استانداردهای مذکور می توانند با قوانین استانداردهای داخل سازمان ترکیب شوند. البته واضح است که استانداردهای داخل سازمان باید با استانداردهای CERT سازگاری داشته باشند.
بهتر است یک سری برنامه های آموزشی برای برنامه نویسان ترتیب داد و در طی آن شیوه به کارگیری صحیح استانداردهای مذکور را در برنامه نویسی آموزش داد.
زمانی که یک استاندارد کدنویسی در تولید محصول پیاده سازی می شود، لازم است با استفاده از ابزارهایی، میزان تطابق محصول تولید شده با استاندارد به کار گرفته شده را سنجید. همان طور که قبلاً نیز گفته شد یکی از شرایط تبدیل شدن یک روش برنامه نویسی به قانون، امکان بررسی به کار گیری آن در نرم افزار است. بررسی می تواند به صورت دستی و یا به صورت اتوماتیک انجام شود. طبیعی است که بررسی دستی زحمت زیادی را می طلبد و همچنین احتمال خطا در آن بالا است. بررسی اتوماتیک نیز عاری از خطا نیست، زیرا برخی خطاها حالت دنباله دار داشته و ابزار اتوماتیک باید بتواند هر گونه تخطی از قانون را تشخیص داده و دنباله آن را نیز اصلاح کند. حتی با وجود چالش های مذکور نیز، روش اتوماتیک برای بررسی همخوانی محصول با استانداردها مقرون به صرفه تر است.
ابزارهای تحلیل نرم افزار می توانند گواهی همخوانی با یک استاندارد را دریافت کنند. سپس شرکت های گواهی دهنده مجاز قادرند یک نرم افزار را با استفاده از ابزارهای تحلیل نرم افزار تأیید شده مورد بازرسی قرار داده و در صورت همخوانی با استاندارد، گواهی مربوطه را مبنی بر رعایت استانداردهای کدنویسی امن ابه آن نرم افزار عطا کنند.
معیار سنجش آسیب پذیری
معیار آسیب پذیری CERT، عددی بین 0 و 180 است که میزان اهمیت یک آسیب پذیری را نشان می دهد. در نگاشت یک عدد به آسیب پذیری، معیارهای متفاوتی همچون میزان شناخته شده بودن آن، وجود کد سوءاستفاده موفق از آن، در خطر قرار گرفتن زیرساخت های شبکه، تعداد رایانه هایی که در خطر آسیب پذیری مذکور قرار دارند و غیره دخیل هستند. البته معیار مذکور خطی نبوده و به این معنی نیست که یک آسیب پذیری با درجه 40 دو برابر یک آسیب پذیری با درجه 20 خطرناک است.
ارزیابی خطر
در استانداردهای کدنویسی امن CERT، هر راهنما دارای بخشی به نام ارزیابی خطر یا Risk Assessment است که به برنامه نویسان نشان می دهد در صورت رسیدگی نکردن به یک آسیب پذیری خاص در کد برنامه، ممکن است چه نتایج بالقوه ای به بار آید. این اطلاعات در اولویت بندی آسیب پذیری هایی که باید رسیدگی شوند، توسط تیم برطرف کننده آسیب پذیری ها به کار گرفته می شود.
نادیده انگاشتن هر قانون منجر به ایجاد آسیب پذیری هایی می شود که هر کدام از آنها از لحاظ جدیت خطر (severity)، احتمال سوءاستفاده (likelihood) و هزینه ترمیم (Remediation Cost) متفاوت هستند. در بخش ارزیابی خطر هر راهنما، موارد مذکور نشان داده می شود. در جداول زیر دسته بندی های مذکور نشان داده شده اند.
جدیت یا Severity
احتمال سوءاستفاده یا likelihood
هزینه ترمیم
سه مقدار مذکور در یکدیگر ضرب خواهند شد تا میزان اهمیت به کارگیری هر قانون را نشان دهند. عدد به دست آمده مقداری بین 1 تا 27 خواهد بود که تنها ده رقم 1، 2، 3، 4، 6، 8، 9، 12، 18 و 27 مجاز هستند. قوانین و پیشنهاداتی که دارای اولویت بین 1 تا 4 باشند سطح 3، 6 تا 9 سطح 2 و 12 تا 27 سطح 1 در نظر گرفته می شوند. در جدول زیر این سه سطح نشان داده شده اند.
به دلیل میزان جدیت حملات ایجاد شده و احتمال بالای سوءاستفاده در صورت رعایت نکردن قوانین سطح 1 ، این قوانین از اهمیت بیشتری برخوردار است. لذا در سری مقالات مرتبط با استاندارد کدنویسی امن، تنها به قوانین و پیشنهادات سطح اول خواهیم پرداخت.