خطرناک‌ترين 25 خطای برنامه‌نويسی- قسمت اول

خطرناک‌ترين 25 خطای برنامه‌نويسی- قسمت اول

تاریخ ایجاد

IRCRE200902001
متخصصان 30 شركت فعال در زمينه امنيت رايانه با هم همكاري كرده اند تا ليستي از مهم ترين و خطرناك ترين خطاهاي برنامه نويسي را تهيه كنند. متأسفانه تعداد زيادي از برنامه نويسان حتي از وجود چنين خطاهايي بي اطلاع هستند و اغلب در برنامه هايشان مرتكب اشتباهات مشابهي مي شوند. از طرفي چنين نقصهايي معمولاً در نرم افزارهايي كه براي فروش آماده مي شوند، مورد توجه قرار نمي گيرند. تنها دو خطا از ليست فوق منجر به نفوذ در 1.5 ميليون وب سايت در سال 2008 شده است. متأسفانه اين نفوذها به رايانه هاي بازديد كننده از وب سايتهاي مذكور گسترش پيدا مي كنند و آنها را به زامبي هايي براي سوء استفاده هاي بعدي خود تبديل مي كنند. اين ليست براي آگاه سازي تيم هاي برنامه نويسي تهيه شده است تا پروسه اي را براي پيشگيري، تشخيص و ترميم چنين خطاهايي تعريف كنند. ليست مزبور توسط شركتهاي CWE/Sans با جزئيات و مفصلاً منتشر شده است كه براي اطلاعات بيشتر مي توانيد به آن مراجعه كنيد. 25 خطاي خطرناك به سه گروه تقسيم شده اند:

  1. تعامل نا امن بين اجزاي برنامه (9 خطا)
    كاستي هاي اين قسمت مربوط به روش هاي نا امن ارسال و دريافت داده بين اجزا، ماژول ها، برنامه ها، پردازه ها و رشته هاي يك نرم افزار و يا در تعامل با سيستم است.
  2. مديريت پر خطر منابع (9 خطا)
    كاستي هاي اين قسمت مربوط به مديريت نامناسب ايجاد، استفاده، انتقال و يا از بين بردن منابع مهم سيستمي است.
  3. دفاع پرخلل (7 خطا)
    كاستي هاي اين قسمت مربوط به استراتژي هاي دفاعي است كه اغلب بد استفاده مي شوند و يا به راحتي ناديده انگاشته مي شوند.

در اين قسمت از گزارش به توضيح خطاهاي گروه اول مي پردازيم.

تعامل نا امن بين اجزاي برنامه

  • اعتبارسنجي نامناسب ورودي
    اين خطا كه مي تواند منجر به اجراي كد، انكار سرويس و گم شدن داده ها شود، دشمن شماره يك سلامت نرم افزار است. اگر مطمئن نشويد اطلاعات ورودي دقيقاً با انتظارات همخواني دارند، صد در صد با مشكل مواجه خواهيد شد. براي مثال در جايي كه انتظار داريد يك شناسه عددي وارد شود، ورودي به هيچ وجه نبايد شامل داده هاي كاراكتري باشد. در برنامه هاي كاربردي واقعي نيازهاي اعتبارسنجي اغلب پيچيده تر از حالت ساده مذكور مي باشند. اعتبار سنجي نادرست منجر به آسيب پذيري مي شود، زيرا مهاجمان قادرند ورودي را با روشهاي غير قابل انتظار دستكاري كنند. امروزه بسياري از آسيب پذيري هاي مشترك و معمول مي توانند با اعتبار سنجي درست ورودي از بين رفته و يا به حداقل كاهش پيدا كنند.
     
  • رمزگذاري نامناسب يا خروجي رها شده
    اين خطا كه مي تواند منجر به اجراي كد و گم شدن داده ها شود، يكي ديگر از خطاهاي معمول برنامه نويسان است. بهتر است توجه كنيد رايانه ها عادت دارند آنچه را مي گوييد انجام دهند نه آنچه را منظورتان است. رمز گذاري ناكافي خروجي كه در رديف اعتبارسنجي ضعيف ورودي است، معمولاً ناديده انگاشته مي شود. اما بايد توجه داشت همين امر، ريشه بسياري از حملات تزريقي است كه امروزه بسيار رايج است. زماني كه قسمتي از برنامه شما خروجي ساخت يافته براي ديگر اجزاي برنامه توليد مي كند، بايد دقت كنيد كه داده هاي كنترلي و ابرداده ها از داده هاي واقعي جدا شوند و همگي از طريق يك جريان ارسال نشوند. در غير اين صورت مهاجمان مي توانند كنترل برنامه را به جاي شما به دست گيرند.
     
  • ضعف در حفظ ساختار پرس و جوي SQL (تزريق SQL)
    امروزه به نظر مي رسد عمده كار نرم افزارها با داده ها است: آنها را به پايگاه داده ها مي فرستند، از پايگاه داده بازيابي مي كنند و به صورت پيغامهاي اطلاعاتي در مي آورند تا آنها را به هر مقصد ديگري ارسال كنند. اگر مهاجمان بتوانند به SQL شما نفوذ كنند، آنگاه مي توانند به پايگاه داده ها دسترسي پيدا كرده و هر گونه خرابكاري ممكن را از سرقت داده ها گرفته تا دستكاري آنها و تخريب زيربناهاي پايگاه داده انجام مي دهند. آنها ممكن است حتي اطلاعات را بايت به بايت دريافت كنند و خيلي خوب هم مي دانند كه چگونه اين كار را انجام دهند.
     
  • ضعف در حفظ ساختار صفحات وب (Cross-Site Scripting)
    XSS يا Cross-site scripting يكي از متداولترين، سرسخت ترين و خطرناك ترين آسيب پذيريها در برنامه­هاي كاربردي وب است. البته با توجه به طبيعت HTTP، اختلاط داده و اسكريپت در HTML ، تعدد انتقال داده بين وب سايتها، الگوهاي رمزگذاري متنوع و مرورگرهاي وب با ظاهرهاي آراسته، بروز اينگونه آسيب پذيريها اجتناب ناپذير مي نمايد. اگر شما بادقت و آگاه نباشيد، مهاجمان قادرند كدهاي جاوا اسكريپت يا كدهايي كه توسط مرورگرها قابل اجرا هستند را در برنامه شما تزريق كنند و به اين ترتيب بدافزارها از طريق صفحات وب شما به رايانه هاي مشاهده كنندگان سايت راه پيدا مي كنند. دقت كنيد كه در اين صورت، اين وب سايت شما است كه منبع گسترش بدافزارها مي شود. در واقع برنامه شما در خدمت كدي در مي آيد كه شما آن را توليد نكرده ايد.
     
  • ضعف در حفظ ساختار دستورات سيستم عامل (تزريق دستور سيستم عاملي)
    معمولاً نرم افزار شما پلي بين كاربران و سيستم عامل است، وقتي شما درخواستي به يكي از برنامه هاي سيستم عامل مي فرستيد و اجازه مي دهيد تا وروديهاي غير قابل اعتماد، وارد رشته دستور توليدي براي برنامه مقصد شوند، در اين صورت مهاجمان را دعوت به شكستن پل و دسترسي به منابع سيستمي، با استفاده از اجراي دستورات خودشان به جاي دستورات شما، مي كنيد.
     
  • انتقال اطلاعات حساس به صورت متن معمولي
    اگر نرم افزار شما اطلاعات حساسي مانند داده هاي خصوصي يا گواهي هاي تصديق هويت را از طريق اينترنت ارسال مي كند، بايد دقت داشته باشيد كه داده هاي شما براي رسيدن به مقصد از گره هاي بسياري عبور مي كند. مهاجمان بدون تلاش زيادي و با روشهاي خاص خودشان، قادرند اطلاعاتي را كه در حال تبادل هستند، شنود كرده و مورد سوءاستفاده قرار دهند. در ضمن بايد گفت الگوهايي مانند Base64 و رمزگذاري URL هيچگونه مصونيتي براي داده هاي شما ايجاد نمي كنند. رمزگذاريهاي مذكور براي نرمال سازي ارتباطات به كار مي روند نه براي تغيير داده ها به صورتي كه ناخوانا شوند. لذا اطلاعات حساس را هميشه بايستي پيش از ارسال با استفاده از الگوريتمهاي مناسب رمزنگاري كرد.
     
  • جعل تقاضاهاي Cross-Site
    اين اشتباه برنامه نويسي كه منجر به حمله CSRF مي شود را مي توان به تحويل گرفتن ساكي دربسته از فردي ناشناس براي وارد كردن به هواپيما تشبيه كرد. بله اين خطا به همان اندازه خطرناك است. در اين مورد مهاجم يك كاربر را فريب مي دهد تا درخواستي را براي وب سايت شما ارسال كند، البته ممكن است خود كاربر حتي متوجه ارسال اين درخواست نشود. به هرحال وقتي درخواست به سرور شما مي رسد، به عنوان درخواستي از يكي از كاربران شما تلقي مي شود نه درخواستي از يك مهاجم. شايد اين مسئله فريبي بزرگ به نظر نرسد ولي در نظر بگيريد كه مهاجم به اين ترتيب دسترسي هاي كاربران را خواهد داشت و اگر اين كاربر دسترسي مدير سايت را داشته باشد، آنگاه مهاجم كنترل كامل وب سايت شما را در اختيار خواهد گرفت. وقتي اين حمله با حمله كرمهاي XSS تركيب شود، نتايج گسترده و ويرانگري به جا خواهد گذاشت. شايد قبلاً درباره كرمهاي XSS كه ظرف مدت چند دقيقه تعداد زيادي وب سايت را در مي نوردند، شنيده باشيد. بايد حدس زده باشيد كه در اين حالت كرمها معمولاً توسط حمله CSRF تغذيه مي شوند. براي مقابله با اين حمله بهتر است از بسته هاي ضد CSRF مانند OWASP استفاده كنيد و مطمئن شويد كه برنامه شما شامل دستورات Cross-Site Scripting نيست، چراكه بسياري از ديوارهاي دفاعي CSRF توسط اسكريپت هاي كنترلي مهاجمان شكسته مي شوند.
     
  • شرايط رقابتي
    تصادفات ترافيكي زماني رخ مي دهند كه دو وسيله قصد استفاده از منبع يكساني مانند جاده، را درست در يك زمان دارند. شرايط رقابتي در رايانه شما نيز وضعيت مشابهي را دارا هستند با اين تفاوت كه مهاجم آگاهانه سعي در ايجاد شرايط رقابتي دارد تا با ايجاد هرج و مرج، برنامه شما را در حالتي قرار دهد كه اطلاعات ارزشمندي لو بروند. شرايط رقابتي منجر به خرابي داده ها و انكار سرويس مي شوند. خوشبختانه در حال حاضر هنوز روش مطمئني براي اجراي كد از طريق شرايط رقابتي ابداع نشده است. فشار شرايط رقابتي مي تواند محلي يا عمومي باشد و اين بستگي به محل وقوع آن دارد كه آيا در رشته ها، پردازه ها و يا سيستم اتفاق بيفتد. هم چنين بستگي به محل اثرگذاري آن مانند منطق امنيتي برنامه يا متغيرهاي حالت دارد.
     
  • نشت اطلاعات از پيغام هاي خطا
    اگر از پيغامهاي خطا با توضيحات زياد استفاده كنيد، آنگاه اين پيغامها مي توانند به فاش سازي اسرار براي مهاجمي بپردازند كه مشتاقانه سيستم شما را نادرست مورد استفاده قرار مي دهد. اسرار فاش شده دامنه وسيعي از اطلاعات از داده هاي شخصي گرفته تا تنظيمات سرور را شامل مي شوند. بعضي اوقات اطلاعات ذكر شده در خطا، اطلاعات بي ضرري به نظر مي رسند كه براي راحتي بيشتر كاربران ارائه شده اند مانند مسير نصب نرم افزار. ولي در واقع اين اطلاعات كوچك نيز مي توانند كمكي براي حمله هاي بزرگ و متمركز ديگر باشند كه هر روزه اتفاق مي افتند. دقت كنيد كه امكان آشكار سازي اطلاعات چه شما خطا را به كاربر برگردانيد، چه آن را در فايلي ثبت كنيد، صادق است.

خطاهاي باقيمانده مربوط به گروه دوم و سوم در قسمت دوم گزارش بررسي شده است.

برچسب‌ها