جزییات بازدید : 10750
تاریخ انتشار : 10 / بهمن / 1398
در اغلب موارد، اشتباهات برنامه نویسی که به سادگی قابل اجتناب هستند منجر به بروز آسیب پذیری های قابل سوءاستفاده در نرم افزارها می شوند. گروه پاسخگویی به فوریتهای رایانه ای (CERT) در تحلیل هایی که بر روی هزاران آسیب پذیری گزارش شده به این گروه انجام داده، به این نتیجه رسیده است که اکثر آسیب پذیری ها از تعداد کمی خطاهای برنامه نویسی مشترک ناشی می شوند. در صورت آشنایی برنامه نویسان و توسعه دهندگان نرم افزار با روش های نا امن برنامه نویسی و جایگزین کردن آنها با روش های امن، می توان گام بزرگی را برای کاهش و یا حذف آسیب پذیری های یک نرم افزار، قبل از انتشار آن، برداشت.
از استانداردهاي معروف در اين زمينه مي توان به استانداردCERT براي كدنويسي امن اشاره كرد كه يك سري از قوانين و پيشنهادات را براي كد نويسي امن با زبان هاي برنامه نويسي C، C++ و جاوا ارائه مي دهد. هدف از اين قوانين و پيشنهادات، حذف عادت هاي كدنويسي ناامن و رفتارهاي تعريف نشده است كه منجر به آسيب پذيري هاي قابل سوءاستفاده مي شود. به كارگيري استانداردهاي مذكور منجر به توليد سيستم هاي با كيفيت بالاتر مي شود كه در برابر حملات بالقوه، پايدارتر و مقاوم تر هستند.
اعتبارسنجی ورودی
تمام ورودی ها از منابع داده نامطمئن را اعتبارسنجی کنید. اعتبارسنجی صحیح ورودی، گستره وسیعی از آسیب پذیری ها نرم افزار را حذف می کند. بهتر است به اکثر منابع داده خارجی همچون خط دستور، واسطهای شبکه، متغیرهای محیطی و فایل های تحت اختیار کاربر، مشکوک باشید. اعتبار سنجی ورودی تا حد زیادی از بروز حملات تزریق SQL جلوگیری به عمل می آورد.
جدی گرفتن هشدارهای کامپایلر
کد خود را با استفاده از بالاترین سطح هشدار ممکن، کامپایل کنید و هشدارها را با اعمال تغییرات در کد از بین ببرید.
معماری و طراحی برای به کارگیری سیاست های امنیتی
یک معماری نرم افزار ایجاد کرده و نرم افزار خود را به گونه ای طراحی کنید که سیاست های امنیتی در آن پیاده سازی و اجرا شود. برای مثال، در صورتی که سیستم شما نیازمند حقوق دسترسی متفاوت در زمان های متفاوتی است، سیستم را به زیرسیستم های مجزا تقسیم کنید به طوری که هر زیر سیستم دارای حق دسترسی مناسب باشد.
سادگی
تا جایی که امکان دارد طراحی را ساده و کوچک نگاه دارید. طراحی های پیچیده احتمال بروز خطا را در پیاده سازی، تنظیمات و به کارگیری افزایش می دهند. به علاوه طراحی پیچیده تلاش لازم برای رسیدن به سطح مطلوب تضمین امنیت را به طرز قابل توجهی بالا می برد، زیرا مکانیزم های امنیتی نیز به همان نسبت پیچیده تر می شوند.
انکار پیش فرض
اساس همه دسترسی ها را بر مبنای اجازه دادن به افراد مجاز به جای مستثنی کردن افراد غیرمجاز قرار دهید. یعنی به صورت پیش فرض از دسترسی ها جلوگیری شود و تنها تعیین کننده شرایطی که تحت آنها اجازه دسترسی صادر می شود، الگوی حفاظت باشد.
وفادار بودن به اصل حداقل حق دسترسی
هر پردازه ای باید با کمترین حقوق دسترسی که برای کامل کردن آن مورد نیاز است، اجرا شود. هر حق دسترسی بالاتری باید در کمترین زمان ممکن در اختیار پردازه قرار گیرد. این راهکار فرصت های مهاجم را برای اجرای کد دلخواه با حق دسترسی ارتقا یافته، کاهش می دهد.
محافظت از داده هایی که به سیستم های دیگر فرستاده می شوند
از تمام داده هایی که به زیرسیستم های پیچیده همچون واسط های فرمان، پایگاه داده های رابطه ای و برنامه های آماده فرستاده می شوند، محافظت به عمل آورید. مهاجمان ممکن است بتوانند از قابلیت های استفاده نشده در زیر سیستم های مذکور، با استفاده از SQL، دستور (command) و یا دیگر حمله های تزریق، سوءاستفاده کرده و زیرسیستم های مذکور را فراخوانی کنند. البته دقت کنید که این مشکل لزوماً مشکل اعتبار سنجی داده های ورودی نیست زیرا زیرسیستم های پیچیده قادر به تشخیص زمینه ای که در آن درخواست ها انجام می شود، نیستند. از آنجایی که پردازه ای که زیرسیستم ها را فراخوانی می کند، قادر به تشخیص زمینه است، بنابراین پردازه مذکور، مسئول محافظت از داده ها، قبل از فراخوانی زیر سیستم های پیچیده است.
اجرای دفاع در عمق
مدیریت خطر را با استفاده از استراتژی دفاع چندلایه انجام دهید، در این صورت اگر یکی از لایه های دفاعی نتواند به خوبی کار کند، لایه دفاعی دیگری از تبدیل شدن یک نقص امنیتی به یک آسیب پذیری قابل سوءاستفاده جلوگیری به عمل می آورد و یا نتایج سوء یک حمله موفق را کاهش می دهد. برای مثال، ترکیب تکنیک های برنامه نویسی امن با محیط اجرای امن منجر به کاهش احتمال سوءاستفاده از آسیب پذیری های باقیمانده در کد، در زمان اجرای برنامه و در محیط عملیاتی می شود.
استفاده از روش های موثر تضمین کیفیت
تکنیک های تضمین کیفیت خوب، در شناسایی و حذف آسیب پذیری ها بسیار مؤثر عمل می کنند. تست نفوذ، تست fuzz (یک تکنیک تست نرم افزار که در آن از ورودی های دور از انتظار، غیرمعمول و تصادفی استفاده میشود) و ممیزی های کد منبع همگی باید به عنوان قسمتی از یک برنامه تضمین کیفیت مؤثر در نظر گرفته شوند. همچنین مرور امنیتی نرم افزار توسط یک گروه که مستقل از تولید کنندگان هستند، می تواند منجر به امنیت بالاتر سیستم شود. در واقع مرورگران بیرونی دیدگاه جدیدی را با خود می آورند و در نتیجه برای حل برخی مشکلات همچون شناسایی و اصلاح پیش فرض های نادرست بسیار مفید واقع می شوند.
اتخاذ یک استاندارد کدنویسی امن
لازم است یک استاندارد کدنویسی امن را بر مبنای زبان برنامه نویسی و سکویی که برای توسعه نرم افزار استفاده می شود، ایجاد کرده و یا از انواع موجود آن استفاده کنید.
تعریف نیازمندی های امنیتی
نیازمندی های امنیتی را هر چه زودتر در چرخه حیات توسعه نرم افزار مشخص کرده و وارد کنید. سپس در مراحل بعدی تولید نرم افزار از همخوانی آنها با نیازمندی های امنیتی اطمینان حاصل کنید. زمانی که نیازمندی های امنیتی تعریف نشده اند، امنیت سیستم تولید شده نمی تواند به صورت مؤثر ارزیابی شود.
مدلسازی تهدیدها
از مدلسازی تهدید برای پیش بینی تهدیدهایی که نرم افزار در آینده با آن مواجه خواهد شد استفاده کنید. مدلسازی تهدید شامل مشخص کردن دارایی های کلیدی، تجزیه برنامه کاربردی، تعیین و دسته بندی تهدیدهای مربوط به هر دارایی و بخش، درجه بندی تهدیدها براساس یک معیار درجه بندی خطر و سپس توسعه استراتژی های کاهش تهدیدها می شود که باید در قسمت های طراحی، کد و تست پیاده سازی شوند.
کد نویسی امن را از کجا یاد بگیریم؟
شرکت های زیادی اقدام به ارائه ی آموزش در این حوزه نموده اند اما می توان گفت در این میان آموزش های شرکت SANS تا حدودی بر دیگر آموزش ها بر تری دارد. از دوره های کد نویسی امن این شرکت می توان به موارد زیر اشاره کرد:
* DEV541: Secure Coding in Java/JEE: Developing Defensible Applications
* DEV522: Defending Web Applications Security Essentials
* DEV544: Secure Coding in .NET: Developing Defensible Applications