عنصر اصلی در كدنویسی امن با زبان های مختلف برنامه نویسی، مستند سازی خوب و استفاده از استانداردهای قابل اجرا است. استانداردهای كدنویسی، برنامه نویسان را ترغیب به پیروی از مجموعه ای متحدالشكل از قوانین و راهنماییها می كند كه بر اساس نیازمندی های پروژه و سازمان تعیین شده است، نه بر اساس سلایق و مهارت های مختلف برنامه نویسان. به محض تعیین استانداردهای مذكور، می توان از آن به عنوان معیاری برای ارزیابی كدهای منبع، چه به صورت دستی و چه به صورت اتوماتیك استفاده كرد.

از استانداردهای معروف در این زمینه می توان به استانداردCERT برای كدنویسی امن اشاره كرد كه یك سری از قوانین و پیشنهادات را برای كد نویسی امن با زبان های برنامه نویسی C، C++ و جاوا ارائه می دهد. هدف از این قوانین و پیشنهادات، حذف عادت های كدنویسی ناامن و رفتارهای تعریف نشده است كه منجر به آسیب پذیری های قابل سوءاستفاده می شود. به كارگیری استانداردهای مذكور منجر به تولید سیستم های با كیفیت بالاتر می شود كه در برابر حملات بالقوه، پایدارتر و مقاوم تر هستند.


قوانین در برابر پیشنهادات


استانداردهای CERT برای كدنویسی امن شامل یك سری قوانین و پیشنهادات می شوند. در زیر تعریف هر كدام از آنها آورده شده است.

قوانین


یك روش برنامه نویسی زمانی به عنوان قانون تعریف می شود كه دارای خصوصیات زیر باشد:
سرپیچی از روش فوق احتمالاً منجر به یك نقص امنیتی شده و ممكن است به یك آسیب پذیری قابل سوءاستفاده تبدیل شود.
پیروی از روش فوق را بتوان توسط تحلیل اتوماتیك، راهكارهای رسمی یا تكنیك های بازرسی دستی تشخیص داد.
پیاده ‌سازی قوانینی كه در استاندارد CERT برای برنامه نویسی امن آورده شده، برای اطمینان از امنیت سیستم هایی كه با زبان برنامه نویسی مربوطه ایجاد شده اند، شرط لازم است ولی كافی نیست. در این استانداردها قوانین با برچسب rule مشخص می شوند.


پیشنهادات


پیشنهادات در حقیقت یك سری از راهنمایی ها و توصیه ها است. یك روش كدنویسی زمانی به عنوان یك پیشنهاد در نظر گرفته می شود كه شرایط زیر را دارا باشد:

  1. به كارگیری روش كدنویسی مذكور، باعث ارتقای امنیت سیستم شود.
  2. شرایطی كه برای در نظر گرفتن روش مذكور به عنوان یك قانون لازم است، در مورد این روش كدنویسی صدق نكند.

در هر تجربه كدنویسی، مجموعه ای از پیشنهادات با توجه به نیازمندی های امنیتی محصول نهایی مورد استفاده قرار می گیرد. پروژه هایی كه نیازمند سطح امنیتی بالایی هستند، می توانند منابع بیشتری را به امنیت اختصاص دهند و در نتیجه مجموعه بیشتری از پیشنهادات را نیز به كار گیرند.
در استانداردهای CERT برای كدنویسی امن، از برچسب recommendation برای نشان دادن پیشنهادات استفاده می شود.


استثناءها


هر قانون یا پیشنهادی ممكن است حاوی مجموعه كوچكی از استثناءها باشد كه نشان می دهد تحت چه شرایطی به كار بردن قانون یا پیشنهاد مذكور برای بالا بردن سطح امنیتی محصول ضروری نیست. استثناءها فقط برای اطلاع كاربر عنوان می شوند و پیروی از آنها لازم نیست. استثناء ها در استاندارد CERT برای برنامه نویسی امن با برچسب exceptions مشخص می شوند.

شناسه ها


در استانداردهای مذكور، هر قانون یا پیشنهاد، دارای یك شناسه یكتا است.(برای مثال PRE30-C ) این شناسه ها از سه قسمت تشكیل شده اند:

  1. یك بخش سه حرفی كه نشان دهنده بخش استاندارد است برای مثال PRE كه نشان دهنده preprocessor است. این بخش نشان دهنده روش های كدنویسی مشابه در یك گروه است.
  2. یك عدد دو رقمی بین 00 تا 99 كه برای یكتا سازی شناسه به كار می رود. شماره های 00 تا 29 برای پیشنهادات و شماره های 30 تا 99 برای قانون ها ذخیره شده اند.
  3. قسمت سوم مربوط به نام زبان است برای مثال C.

به كارگیری استاندارد


قوانین استانداردهای مذكور می توانند با قوانین استانداردهای داخل سازمان تركیب شوند. البته واضح است كه استانداردهای داخل سازمان باید با استانداردهای CERT سازگاری داشته باشند.
بهتر است یك سری برنامه های آموزشی برای برنامه نویسان ترتیب داد و در طی آن شیوه به كارگیری صحیح استانداردهای مذكور را در برنامه نویسی آموزش داد.
زمانی كه یك استاندارد كدنویسی در تولید محصول پیاده سازی می شود، لازم است با استفاده از ابزارهایی، میزان تطابق محصول تولید شده با استاندارد به كار گرفته شده را سنجید. همان طور كه قبلاً نیز گفته شد یكی از شرایط تبدیل شدن یك روش برنامه نویسی به قانون، امكان بررسی به كار گیری آن در نرم افزار است. بررسی می تواند به صورت دستی و یا به صورت اتوماتیك انجام شود. طبیعی است كه بررسی دستی زحمت زیادی را می طلبد و همچنین احتمال خطا در آن بالا است. بررسی اتوماتیك نیز عاری از خطا نیست، زیرا برخی خطاها حالت دنباله دار داشته و ابزار اتوماتیك باید بتواند هر گونه تخطی از قانون را تشخیص داده و دنباله آن را نیز اصلاح كند. حتی با وجود چالش های مذكور نیز، روش اتوماتیك برای بررسی همخوانی محصول با استانداردها مقرون به صرفه تر است.
ابزارهای تحلیل نرم افزار می توانند گواهی همخوانی با یك استاندارد را دریافت كنند. سپس شركت های گواهی دهنده مجاز قادرند یك نرم افزار را با استفاده از ابزارهای تحلیل نرم افزار تأیید شده مورد بازرسی قرار داده و در صورت همخوانی با استاندارد، گواهی مربوطه را مبنی بر رعایت استانداردهای كدنویسی امن ابه آن نرم افزار عطا كنند.


معیار سنجش آسیب پذیری


معیار آسیب پذیری CERT، عددی بین 0 و 180 است كه میزان اهمیت یك آسیب پذیری را نشان می دهد. در نگاشت یك عدد به آسیب پذیری، معیارهای متفاوتی همچون میزان شناخته شده بودن آن، وجود كد سوءاستفاده موفق از آن، در خطر قرار گرفتن زیرساخت های شبكه، تعداد رایانه هایی كه در خطر آسیب پذیری مذكور قرار دارند و غیره دخیل هستند. البته معیار مذكور خطی نبوده و به این معنی نیست كه یك آسیب پذیری با درجه 40 دو برابر یك آسیب پذیری با درجه 20 خطرناك است.

ارزیابی خطر


در استانداردهای كدنویسی امن CERT، هر راهنما دارای بخشی به نام ارزیابی خطر یا Risk Assessment است كه به برنامه نویسان نشان می دهد در صورت رسیدگی نكردن به یك آسیب پذیری خاص در كد برنامه، ممكن است چه نتایج بالقوه ای به بار آید. این اطلاعات در اولویت بندی آسیب پذیری هایی كه باید رسیدگی شوند، توسط تیم برطرف كننده آسیب پذیری ها به كار گرفته می شود.
نادیده انگاشتن هر قانون منجر به ایجاد آسیب پذیری هایی می شود كه هر كدام از آنها از لحاظ جدیت خطر (severity)، احتمال سوءاستفاده (likelihood) و هزینه ترمیم (Remediation Cost) متفاوت هستند. در بخش ارزیابی خطر هر راهنما، موارد مذكور نشان داده می شود. در جداول زیر دسته بندی های مذكور نشان داده شده اند.

 

احتمال سوءاستفاده یا likelihood



هزینه ترمیم



سه مقدار مذكور در یكدیگر ضرب خواهند شد تا میزان اهمیت به كارگیری هر قانون را نشان دهند. عدد به دست آمده مقداری بین 1 تا 27 خواهد بود كه تنها ده رقم 1، 2، 3، 4، 6، 8، 9، 12، 18 و 27 مجاز هستند. قوانین و پیشنهاداتی كه دارای اولویت بین 1 تا 4 باشند سطح 3، 6 تا 9 سطح 2 و 12 تا 27 سطح 1 در نظر گرفته می شوند. در جدول زیر این سه سطح نشان داده شده اند.



به دلیل میزان جدیت حملات ایجاد شده و احتمال بالای سوءاستفاده در صورت رعایت نكردن قوانین سطح 1 ، این قوانین از اهمیت بیشتری برخوردار است. لذا در سری مقالات مرتبط با استاندارد كدنویسی امن، تنها به قوانین و پیشنهادات سطح اول خواهیم پرداخت.

نظر یادتون نره...