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

به همين منظور در اين مقاله مهمترين نكاتي را كه بايد براي برنامه نويسي امن به آنها توجه شود، توضيح مي دهيم.



1. اعتبارسنجي ورودي

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



2. جدي گرفتن هشدارهاي كامپايلر

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



3.معماري و طراحي براي به كارگيري سياست هاي امنيتي

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



4. سادگي

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



5.انكار پيش فرض

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



6. وفادار بودن به اصل حداقل حق دسترسي

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



7. محافظت از داده هايي كه به سيستم هاي ديگر فرستاده مي شوند

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



8.اجراي دفاع در عمق

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



9. استفاده از روش هاي موثر تضمين كيفيت

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



10. اتخاذ يك استاندارد كدنويسي امن

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



11.تعريف نيازمندي هاي امنيتي

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



12. مدلسازي تهديدها

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