Font Size

SCREEN

Profile

Layout

Menu Style

Cpanel

اصول برنامه نویسی امن

در اغلب موارد، اشتباهات برنامه نویسی كه به سادگی قابل اجتناب هستند منجر به بروز آسیب پذیری های قابل سوءاستفاده در نرم افزارها می شوند. گروه پاسخگویی به فوریتهای رایانه ای (CERT) در تحلیل هایی كه بر روی هزاران آسیب پذیری گزارش شده به این گروه انجام داده، به این نتیجه رسیده است كه اكثر آسیب پذیری ها از تعداد كمی خطاهای برنامه نویسی مشترك ناشی می شوند. در صورت آشنایی برنامه نویسان و توسعه دهندگان نرم افزار با روش های نا امن برنامه نویسی و جایگزین كردن آنها با روش های امن، می توان گام بزرگی را برای كاهش و یا حذف آسیب پذیری های یك نرم افزار، قبل از انتشار آن، برداشت.

به همین منظور در این مقاله مهمترین نكاتی را كه باید برای برنامه نویسی امن به آنها توجه شود، توضیح می دهیم. برای تكمیل اطلاعات در این زمینه، مطالعه سری گزارش های تحلیلی خطرناك ترین 25 خطای رایج برنامه نویسی توصیه می شود.

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

جدی گرفتن هشدارهای كامپایلر
كد خود را با استفاده از بالاترین سطح هشدار ممكن، كامپایل كنید و هشدارها را با اعمال تغییرات در كد از بین ببرید.

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

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

انكار پیش فرض
اساس همه دسترسی ها را بر مبنای اجازه دادن به افراد مجاز به جای مستثنی كردن افراد غیرمجاز قرار دهید. یعنی به صورت پیش فرض از دسترسی ها جلوگیری شود و تنها تعیین كننده شرایطی كه تحت آنها اجازه دسترسی صادر می شود، الگوی حفاظت باشد.

وفادار بودن به اصل حداقل حق دسترسی
هر پردازه ای باید با كمترین حقوق دسترسی كه برای كامل كردن آن مورد نیاز است، اجرا شود. هر حق دسترسی بالاتری باید در كمترین زمان ممكن در اختیار پردازه قرار گیرد. این راهكار فرصت های مهاجم را برای اجرای كد دلخواه با حق دسترسی ارتقا یافته، كاهش می دهد.

محافظت از داده هایی كه به سیستم های دیگر فرستاده می شوند
از تمام داده هایی كه به زیرسیستم های پیچیده همچون واسط های فرمان، پایگاه داده های رابطه ای و برنامه های آماده فرستاده می شوند، محافظت به عمل آورید. مهاجمان ممكن است بتوانند از قابلیت های استفاده نشده در زیر سیستم های مذكور، با استفاده از SQL، دستور (command) و یا دیگر حمله های تزریق، سوءاستفاده كرده و زیرسیستم های مذكور را فراخوانی كنند. البته دقت كنید كه این مشكل لزوماً مشكل اعتبار سنجی داده های ورودی نیست زیرا زیرسیستم های پیچیده قادر به تشخیص زمینه ای كه در آن درخواست ها انجام می شود، نیستند. از آنجایی كه پردازه ای كه زیرسیستم ها را فراخوانی می كند، قادر به تشخیص زمینه است، بنابراین پردازه مذكور، مسئول محافظت از داده ها، قبل از فراخوانی زیر سیستم های پیچیده است.

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

استفاده از روش های موثر تضمین كیفیت
تكنیك های تضمین كیفیت خوب، در شناسایی و حذف آسیب پذیری ها بسیار مؤثر عمل می كنند. تست نفوذ، تست fuzz (یك تكنیك تست نرم افزار كه در آن از ورودی های دور از انتظار، غیرمعمول و تصادفی استفاده میشود) و ممیزی های كد منبع همگی باید به عنوان قسمتی از یك برنامه تضمین كیفیت مؤثر در نظر گرفته شوند. همچنین مرور امنیتی نرم افزار توسط یك گروه كه مستقل از تولید كنندگان هستند، می تواند منجر به امنیت بالاتر سیستم شود. در واقع مرورگران بیرونی دیدگاه جدیدی را با خود می آورند و در نتیجه برای حل برخی مشكلات همچون شناسایی و اصلاح پیش فرض های نادرست بسیار مفید واقع می شوند.

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

تعریف نیازمندی های امنیتی
نیازمندی های امنیتی را هر چه زودتر در چرخه حیات توسعه نرم افزار مشخص كرده و وارد كنید. سپس در مراحل بعدی تولید نرم افزار از همخوانی آنها با نیازمندی های امنیتی اطمینان حاصل كنید. زمانی كه نیازمندی های امنیتی تعریف نشده اند، امنیت سیستم تولید شده نمی تواند به صورت مؤثر ارزیابی شود.

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

 

 

 

کتب و جزوات