سیستم مدیریت کسب وکارها و ارتباطات

تولید نرم افزار امن

    مهندس برزویی
    • نمایش 8
    توسط مهندس برزویی
    تولید نرم افزار امن

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

    اعتبارسنجی ورودی
    تمام ورودی ها از منابع داده نامطمئن را اعتبارسنجی کنید. اعتبارسنجی صحیح ورودی، گستره وسیعی از آسیب پذیری ها نرم افزار را حذف می کند. بهتر است به اکثر منابع داده خارجی همچون خط دستور، واسطهای شبکه، متغیرهای محیطی و فایل های تحت اختیار کاربر، مشکوک باشید. اعتبار سنجی ورودی تا حد زیادی از بروز حملات تزریق SQL جلوگیری به عمل می آورد.
    جدی گرفتن هشدارهای کامپایلر
    کد خود را با استفاده از بالاترین سطح هشدار ممکن، کامپایل کنید و هشدارها را با اعمال تغییرات در کد از بین ببرید.
    معماری و طراحی برای به کارگیری سیاست های امنیتی
    یک معماری نرم افزار ایجاد کرده و نرم افزار خود را به گونه ای طراحی کنید که سیاست های امنیتی در آن پیاده سازی و اجرا شود. برای مثال، در صورتی که سیستم شما نیازمند حقوق دسترسی متفاوت در زمان های متفاوتی است، سیستم را به زیرسیستم های مجزا تقسیم کنید به طوری که هر زیر سیستم دارای حق دسترسی مناسب باشد.
    سادگی
    تا جایی که امکان دارد طراحی را ساده و کوچک نگاه دارید. طراحی های پیچیده احتمال بروز خطا را در پیاده سازی، تنظیمات و به کارگیری افزایش می دهند. به علاوه طراحی پیچیده تلاش لازم برای رسیدن به سطح مطلوب تضمین امنیت را به طرز قابل توجهی بالا می برد، زیرا مکانیزم های امنیتی نیز به همان نسبت پیچیده تر می شوند.
    انکار پیش فرض
    اساس همه دسترسی ها را بر مبنای اجازه دادن به افراد مجاز به جای مستثنی کردن افراد غیرمجاز قرار دهید. یعنی به صورت پیش فرض از دسترسی ها جلوگیری شود و تنها تعیین کننده شرایطی که تحت آنها اجازه دسترسی صادر می شود، الگوی حفاظت باشد.
    وفادار بودن به اصل حداقل حق دسترسی
    هر پردازه ای باید با کمترین حقوق دسترسی که برای کامل کردن آن مورد نیاز است، اجرا شود. هر حق دسترسی بالاتری باید در کمترین زمان ممکن در اختیار پردازه قرار گیرد. این راهکار فرصت های مهاجم را برای اجرای کد دلخواه با حق دسترسی ارتقا یافته، کاهش می دهد.
    محافظت از داده هایی که به سیستم های دیگر فرستاده می شوند
    از تمام داده هایی که به زیرسیستم های پیچیده همچون واسط های فرمان، پایگاه داده های رابطه ای و برنامه های آماده فرستاده می شوند، محافظت به عمل آورید. مهاجمان ممکن است بتوانند از قابلیت های استفاده نشده در زیر سیستم های مذکور، با استفاده از SQL، دستور (command) و یا دیگر حمله های تزریق، سوءاستفاده کرده و زیرسیستم های مذکور را فراخوانی کنند. البته دقت کنید که این مشکل لزوماً مشکل اعتبار سنجی داده های ورودی نیست زیرا زیرسیستم های پیچیده قادر به تشخیص زمینه ای که در آن درخواست ها انجام می شود، نیستند. از آنجایی که پردازه ای که زیرسیستم ها را فراخوانی می کند، قادر به تشخیص زمینه است، بنابراین پردازه مذکور، مسئول محافظت از داده ها، قبل از فراخوانی زیر سیستم های پیچیده است.
    اجرای دفاع در عمق
    مدیریت خطر را با استفاده از استراتژی دفاع چندلایه انجام دهید، در این صورت اگر یکی از لایه های دفاعی نتواند به خوبی کار کند، لایه دفاعی دیگری از تبدیل شدن یک نقص امنیتی به یک آسیب پذیری قابل سوءاستفاده جلوگیری به عمل می آورد و یا نتایج سوء یک حمله موفق را کاهش می دهد. برای مثال، ترکیب تکنیک های برنامه نویسی امن با محیط اجرای امن منجر به کاهش احتمال سوءاستفاده از آسیب پذیری های باقیمانده در کد، در زمان اجرای برنامه و در محیط عملیاتی می شود.
    استفاده از روش های موثر تضمین کیفیت
    تکنیک های تضمین کیفیت خوب، در شناسایی و حذف آسیب پذیری ها بسیار مؤثر عمل می کنند. تست نفوذ، تست fuzz (یک تکنیک تست نرم افزار که در آن از ورودی های دور از انتظار، غیرمعمول و تصادفی استفاده میشود) و ممیزی های کد منبع همگی باید به عنوان قسمتی از یک برنامه تضمین کیفیت مؤثر در نظر گرفته شوند. همچنین مرور امنیتی نرم افزار توسط یک گروه که مستقل از تولید کنندگان هستند، می تواند منجر به امنیت بالاتر سیستم شود. در واقع مرورگران بیرونی دیدگاه جدیدی را با خود می آورند و در نتیجه برای حل برخی مشکلات همچون شناسایی و اصلاح پیش فرض های نادرست بسیار مفید واقع می شوند.
    اتخاذ یک استاندارد کدنویسی امن
    لازم است یک استاندارد کدنویسی امن را بر مبنای زبان برنامه نویسی و سکویی که برای توسعه نرم افزار استفاده می شود، ایجاد کرده و یا از انواع موجود آن استفاده کنید. در سری مقالات بعدی در مورد استاندارد CERT برای کدنویسی امن با زبان های برنامه نویسی C، C++ و جاوا صحبت خواهیم کرد.
    تعریف نیازمندی های امنیتی
    نیازمندی های امنیتی را هر چه زودتر در چرخه حیات توسعه نرم افزار مشخص کرده و وارد کنید. سپس در مراحل بعدی تولید نرم افزار از همخوانی آنها با نیازمندی های امنیتی اطمینان حاصل کنید. زمانی که نیازمندی های امنیتی تعریف نشده اند، امنیت سیستم تولید شده نمی تواند به صورت مؤثر ارزیابی شود.
    مدلسازی تهدیدها
    از مدلسازی تهدید برای پیش بینی تهدیدهایی که نرم افزار در آینده با آن مواجه خواهد شد استفاده کنید. مدلسازی تهدید شامل مشخص کردن دارایی های کلیدی، تجزیه برنامه کاربردی، تعیین و دسته بندی تهدیدهای مربوط به هر دارایی و بخش، درجه بندی تهدیدها بر اساس یک معیار درجه بندی خطر و سپس توسعه استراتژی های کاهش تهدیدها می شود که باید در قسمت های طراحی، کد و تست پیاده سازی شوند.

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

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

    مدل سازي تهديدهاي امنيتي در راستاي امن سازی معماري نرم افزار
    يکی از بزرگترين مسائلی که طراحان و معماران نرم افزارهای کاربردی در توليد، توسعه و پشتيبانی سيستم‌های نرم افزاری با آن روبرو می‌باشند، شناسائی و تعيين تهديدات امنيتی موجود در محيط عملياتی سيستم نرم افزاری مطلوب است. پاسخ کاربردی به اين نيازمندی تنها راه حل ممکن، در راستای برآورده سازی امنيت نرم افزاری مناسب می باشد.
    در اين ميان، روشهای صوری شناسائی و ارزيابی تهديدات امنيتی می توانند به عنوان ابزاری کارآمد و کاربردی مورد استفاده و بهره برداری قرار گيرند. اين روشهای صوری که اغلب از آنها با نام تکنيکهای مدل سازی تهديدات امنيتی ياد می شود، در قالب يک فرآيند چرخشی/ افزايشی با چرخه حيات نرم افزار درگير شده و بر مبنای نيازهای امنيتی در هر مرحله، بر آن منطبق می گردند. شکل زیر این فرآیند چرخشی را نشان می‌دهد.


    شکل 1 مدلسازی تهدیدات امنیتی

    همانطور که گفته شد، فرآيند مدل سازی تهديدات يک فرآيند چرخشی/ افزايشی است که اين فرآيند به دفعات و به صورت اعمال تدريجی به چرخه حيات نرم افزار تزريق می گردد. از این رو شرکت چشم انداز توسعه و فناوری اطلاعات رجاء برای مدلسازی تهدیدات امنیتی خود از این فرآیند استفاده می‌کند.

    چرخه تولید نرم‌افزار امن
    شرکت چشم انداز توسعه و فناوری اطلاعات رجاء فعالیت‌های امنیتی خود را برای برنامه‌های کاربردی منطبق بر فازهای SDLC تعیین می‌کند. SDLC متدولوژیی، جهت اطمينان سازی از اينکه سیستم‌ها بر اساس رويکرد منظم، منطقی و گام به گام طراحی و اجرا شده، بنا شده است و فازهای آن عبارتند از : تحليل، طراحي، توسعه، يكپارچه سازي، تست، اجرا. که در شکل 1 می‌توان فازهای مرتبط با آن را مشاهده کرد.


    شکل 2 فازهای SDLC

    همانطور که می‌دانیم، امروزه اکثر شرکت‌های تولید نرم‌افزار از متدولوژی RUP برای توسعه برنامه‌های کاربردی خود استفاده می‌کنند. این متدولوژی‌ توسط شرکت Rationalکه یکی از پرکاربردترین فرآیند تولید و توسعه نرم افزاری در دنیای کنونی است و به عنوان یک استاندارد صنعتی بالفعل در دنیای IT پذیرفته شده است.ارائه شده‌اند به گزارش رویتر در سال 2001 میلادی بیش از ششصد هزار شرکت تولید کننده نرم افزار، از ابزارهای شرکت Rational استفاده می‌کرده‌اند که این تعداد کماکان هم در حال افزایش است. این متدولوژی، برای انواع پروژه‌های نرم‌افزاری در دامنه‌های مختلف ( مانند سیستم‌های اطلاعاتی، سیستم‌های صنعتی، سیستم‌های بلادرنگ، سیستم‌های تعبیه شده، ارتباطات راه دور، سیستم‌های نظامی و ...) و در اندازه‌های متفاوت، از پروژه‌های بسیار کوچک (یک نفر در یک هفته) تا پروژه‌های بسیار بزرگ (چند صد نفر تولید کننده با پراکندگی جغرافیایی)، کاربرد دارد. در شکل زیر فازهای موجود دراین متدولوژی آورده شده است:


    شکل 3 فازهای متدولوژی RUP

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

    از این‌رو موسسه چشم انداز توسعه و امنیت ملاحظات و فعالیت هایی امنیتی که در هر یک از فازها بایستی صورت گیرد، را مبتنی بر این متدولوژی‌ها در نظر گرفته است. همچنین به توسعه دهندگان برنامه‌های کاربردی توصیه می‌کند که از این متدولوژی برای برنامه‌های کاربردی خود استفاده کنند.

    استراتژی تست برنامه‌های کاربردی
    شرکت چشم انداز توسعه و فناوری اطلاعات رجاء استراتژی‌هایی را برای تست برنامه‌های کاربردی در نظر گرفته است، هدف از این استراتژی تست تعیین فعالیت‌های اصلی، تصمیمات کلیدی و چالش های پیشروی تست مي‌باشد این کار شامل موارد زیر است:
    1. تعیین قلمرو تست
    2. پیاده سازی تکنیک های تست
    3. انتخاب test case ها: معمولاً براساس درکی که از برنامه بر پایه ی جریان داده مشخص شده، test case ها به وجود می‌آید. در انتخاب این موارد بایستی گزینه‌هایی که در ادامه آورده شده است مورد توجه قرار گیرند :
    a. تعریف پیش شرط ها
    b. تعریف ورودی های خاص و یا کلی
    c. تعیین نتایج مورد انتظار
    d. تعیین مراحل تست
    4. تعیین شرایط خروج از تست

    تکنیک‌های انجام تست و ارزیابی برنامه‌های کاربردی
    برای تست و ارزیابی برنامه‌های کاربردی از روش‌های زیر استفاده می‌گردد:
    • روش تست جعبه سفید (White Box)
    - ممیزی کدهای برنامه های کاربردی
    • روش تست جعبه سیاه (Block Box)

    تست جعبه سفید
    تفاوت اصلی تست جعبه سفید و جعبه سیاه در میزان اطلاعاتی از سیستم مورد تست است که در اختیار تست کننده قرار می‌گیرد. در تست جعبه سفید به تست کننده اطلاعات کاملی از ساختار مورد تست، شامل دیاگرام‌های شبکه، کد منبع، و اطلاعات آدرس دهی IP داده می‌شود. در حقیقت تست جعبه سفید به شبیه سازی آنچه در یک حمله داخلی ممکن است رخ دهد می‌پردازد، یعنی حملاتی که در آن‌ها حمله کننده به کد منبع، ساختار شبکه، و احتمالا برخی کلمات عبور دسترسی دارد.. در ادامه یکی از روش های تست جعبه سفید آورده شده است:
    بازبینی کد منبع :
    یکی از روش‌های تست white box مي‌باشد. بازبینی کد منبع، فرایند بررسی دستی کد منبع برنامه‌ی کاربردی برای مراقبت از نکات امنیتی مي‌باشد. همانطور که می‌دانیم کدهای برنامه محلی برای آغاز خطاهای امنیتی است. امروزه ارزیابی و مرور کد نسبت به روش‌های قدیمی تست جعبه سیاه، راه‌حل مناسب‌تر و کاراتری به شمار می‌آید. در بسیاری موارد در کدهای نوشته شده آسیب‌پذیری‌های عمده مشاهده می‌شود، با از بین بردن این خطاها می‌توان برنامه‌ی خود را در برابر نفوذ، از دست دادن اطلاعات و فاش شدن اطلاعات حساس مربوط به سازمان محافظت کرد.

    ارزیابی و ممیزی کدهای برنامه کاربردی می‌تواند به صورت دستی و یا خودکار صورت گیرد، در ادامه برخی از مؤلفه‌های مرتبط با آن آورده شده است:
    • مطالعه مؤلفه‌های برنامه کاربردی
    • بررسی ریسک‌ها و حملات
    • تحلیل تاثیرات تجاری
    • تحلیل خطاهای تکنیکی
    • گزارش ریسک تجاری
    • گزارش مفهومی برنامه‌کاربردی
    • مستنداتی برای حملات خاص

    کد منبع برنامه کاربردی براساس ساختار آنها و گزارش مفهومی برنامه کاربردی تحلیل می‌شود و گزارش اطلاعات تکنیکی براساس خطاهای امنیتی کشف شده تولید می‌شود. در این گزارش می‌توان به موارد زیر دست یافت :
    • ماهیت خطا
    • موقعیت و محل خطا
    • تاثیر خطا
    • توصیه‌هایی برای رفع خطا
    • اطلاعات مرتبط دیگر

    مزایای استفاده از این روش عبارتند از: کامل و موثر بودن، دقیق بودن، سریع بودن. معایب استفاده از این روش عبارتند از: نیازبه مهارت بالای امنیتی توسعه‌دهندگان دارد، نکات امنیتی مربوط به کتابخانه های کامپایل شده مورد بررسی قرار نمی‌گیرند.

    تست جعبه سیاه
    در فرایند تست جعبه سیاه، یک برنامه ی کاربردی بدون هیچگونه اطلاعی از عملکرد داخلی آن اجرا مي‌شود و سعی مي‌شود یک آسیب پذیری پیدا شده و سپس از این آسیب پذیری برای نفوذ به سیستم بهره برداری شود. معمولا تیم تست‌کننده نفوذ همانند دیگر کاربران به برنامه کاربردی دسترسی دارند. تست کننده همانند یک نفوذگر عمل کرده و تلاش می کند که یک آسیب پذیری را پیدا نموده و از آن بهره برداری نماید. در اغلب موارد تست کننده یک نام کاربری از سیستم در اختیار دارد. ابزارهایی برای خود کار کردن تست نفوذ تولید شده اند اما به خاطر طبیعت برنامه‌هاي تحت وب معمولاً ضعیف عمل می‌کنند.
    مزایای استفاده از این روش عبارتند از: سریع و ارزان بودند، به سطح مهارت کمتری نسبت به روش بازبینی کد منبع نیاز دارند، تعداد زیادی از تست کنندگان نفوذ به برنامه کاربردی در دسترس هستند، در این روش معمولا کدی تست مي‌شود که بکار گرفته شده است.