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

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

تاریخ ایجاد

IRCRE200902003
در بخش اول گزارش اشاره كرديم كه متخصصان 30 شركت فعال در زمينه امنيت رايانه با هم همكاري كرده اند تا ليستي از مهم ترين، شايع ترين و خطرناك ترين خطاهاي برنامه نويسي را تهيه كنند.
آنها 25 خطاي رايج و خطرناك را به سه گروه تقسيم كرده اند:

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

در قسمت اول به خطاهاي بخش اول يعني تعامل ناامن بين اجزاي برنامه پرداختيم و در اين قسمت بخش مديريت پرخطر منابع را بررسي خواهيم كرد.

مديريت پرخطر منابع

  • عدم رعايت ظرفيت حافظه بافر
    خطاي سرريز بافر، خطاي رايجي است كه منجر به اجراي كد، انكار سرويس و گم شدن داده ها مي شود. خطاي مذكور، مدتهاست كه مانند شلاقي بالاي سر برنامه نويسان C قرار دارد و همچنان در مقابل روشهايي كه براي حذفش به كار مي برند، مقاومت نشان مي دهد. سادگي است اگر فكر كنيم مشكل فقط استفاده نادرست از strcpy()، يا چك نكردن اندازه ورودي ها بوده و با مراقبت از اين موارد، مشكل سرريز بافر را حل كرده ايم. همچنان كه روشهاي تشخيص سرريز بافر پيشرفته تر مي شوند، روشهاي حمله از اين طريق نيز پيشرفته تر مي شوند و امروزه حمله هاي سرريز بافر در نگاه اول و حتي در دومين نگاه هم قابل تشخيص نيستند! از طرفي، شايد تصور كنيد از آنجا كه برنامه هاي خود را با استفاده از زبانهاي سطح بالا و نه C مي نويسيد، كاملاً در امان هستيد. اما مفسر زبان "امن" شما به چه زباني نوشته شده است؟ API هاي سيستم عامل به چه زباني نوشته شده اند؟ كدهاي محلي كه فراخواني مي كنيد به چه زباني نوشته شده اند؟ در مورد نرم افزارهايي كه زيرساخت هاي اينترنت را اجرا مي كنند، چه مي گوييد؟ بهتر است كمي در اين مورد بيشتر فكر كنيد. براي مقابله با مشكل سرريز بافر روشهاي متعددي مانند استفاده از زبانهاي مطمئن­تر برنامه نويسي ، وارسي مجدد اندازه بافرها در مبدأ و مقصد و دقت در استفاده از strcpy()، استفاده از ابزارهاي اتوماتيك تحليل كد، استفاده از روش ASLR (Address Space Layout Randomization) و غيره وجود دارند كه با تحقيق، مطالعه و به كارگيري آنها مي توانيد نرم افزار امن تري توليد كنيد.
  • كنترل داده هاي مهم از بيرون برنامه
    راه هاي بسياري براي ذخيره داده هاي كاربران، بدون ايجاد سربار براي بانك اطلاعات وجود دارد. اما متأسفانه اگر اين داده ها را در مكاني ذخيره كنيد كه مهاجمان قادر به دستكاري آن باشند، سربار يك سوءاستفاده موفق را نيز كاهش داده ايد. براي مثال داده ها مي توانند در فايلهاي پيكربندي، پروفايل ها، كوكي ها، فيلدهاي نهان فرم، متغيرهاي محيطي، كليدهاي رجيستري و هر مكان ديگري كه براي مهاجمان قابل دستيابي باشد، ذخيره گردند. در پروتكل هايي مانند HTTP، در هر درخواست برخي از اطلاعات وضعيت كاربر گرفته مي شود و به اين ترتيب در دسترس مهاجمان نيز قرار مي گيرد. اگر شما برخي از كنترل هاي امنيتي مهم، مانند اينكه آيا كاربر فعلي مدير است، را از اين طريق انجام دهيد، مي­توانيد مطمئن باشيد كه كسي با دستكاري داده ها، برنامه شما را فريب خواهد داد و آن را وادار به انجام كاري خواهد كرد كه شما مايل به انجامش نبوده ايد.
  • كنترل مسير يا نام فايل از بيرون برنامه
    اگر زماني كه انتقال داده ها از طريق فايل صورت مي گيرد، از ورودي هاي بيرون برنامه براي ساختن نام فايل استفاده كنيد، مسير ايجاد شده مي تواند جايي خارج از فولدر مورد نظر برنامه شما باشد. مهاجمان مي توانند با استفاده از چندين ".." يا توالي هاي هاي مشابه، مرورگر سيستم عامل را به خارج از محدوده برنامه شما هدايت كنند. در ضمن با كنترل بيروني نام و مسير فايل، راه را براي حمله هاي فايلي ديگر هموار مي كنيد. يكي از اين حمله ها Symbolic link following است كه باعث مي شود برنامه شما فايلهايي را بخواند يا دستكاري كند كه مهاجم دسترسي مستقيم به آنها ندارد. اگر برنامه شما نام فايل را به عنوان وروردي گرفته و با اولويت بالابرده اجرا شود، همين اتفاق تكرار خواهد شد. هم چنين اگر به كاربر بيروني اجازه دهيد URL دلخواه خود را تعيين كرده تا برنامه شما كدي را از آن دريافت كرده و اجرا كند، در واقع از كرمها براي نفوذ به سيستمتان دعوت به عمل آورده ايد.
  • مسير جستجوي غير قابل اعتماد
    گاهي اوقات نرم افزار شما نياز به يك مسير جستجو براي پيدا كردن منابع مهمي مانند كتابخانه ها يا فايل هاي پيكربندي دارد. اگر كنترل مسير جستجو در دستان يك مهاجم قرار گيرد، آنگاه آن را به سمت منابعي كه خود مي­خواهد هدايت كرده و باعث مي­شود برنامه شما به منابع نادرستي در زمان نامناسبي دسترسي پيدا كند. خطر فوق، حتي زماني كه تنها يك قسمت از مسير جستجو مانند دايركتوري جاري، به دست مهاجم بيفتد، نيز وجود دارد.
  • شكست در كنترل توليد كد (تزريق كد)
    گاهي اوقات نمي توانيد با استفاده از چندين خط برنامه كارايي مورد لزوم نرم افزار خود را ايجاد كنيد. از طرفي مديريت و ايجاد كد به صورت پويا جذاب تر است، ولي بايد بدانيد اين مسئله به همان اندازه كه براي شما دلپذير است، به كام مهاجمان نيز خوش مي آيد. يكي از آسيب­پذيري هاي جدي زماني رخ مي دهد كه كد شما قابليت فراخواني توسط افراد متفرقه و تأييد نشده را دارا باشد، به خصوص زماني كه ورودي ها بر روي انتخاب كد اجرايي مؤثر باشند و بدتر از اين زماني رخ مي دهد كه ورودي ها مستقيماً وارد كد برنامه شوند. نتيجه اين وضعيت مشخص است: كد شما متعلق به مهاجمان است.
  • باركردن كد بدون وارسي جامع
    زماني كه كدي را بارگذاري كرده و اجرا مي كنيد، در واقع به بدخواه نبودن منبع كد اعتماد كرده ايد. ممكن است بگوييد تنها از وب سايتهايي كه به آنها اعتماد داريد، كدها را بار مي كنيد، ولي مهاجمان قادرند كد مورد نظر را با استفاده از انواع فريبها قبل از اينكه به دست شما برسد، تغيير دهند. ممكن است سايت مورد نظر شما را هك كنند و يا با جعل هويت و استفاده از انواع روشها، سيستم را براي هدايت به سايت ديگري متقاعد كنند يا حتي قادرند كد را در حين انتقال از شبكه مورد دستكاري قرار دهند. سناريوي فوق، حتي زماني كه شما به روزرساني هاي محصول خود را بارگذاري و نصب مي­كنيد ، قابل اجرا خواهد بود. اگر يكي از اتفاقات ذكر شده رخ دهد، نرم افزار شما كدي را كه انتظار نداريد اجرا خواهد كرد كه براي شما بسيار بد و براي مهاجمان بسيار خوشايند است.
  • آزادسازي نامناسب منابع
    زماني كه استفاده شما از منابع سيستم به پايان مي رسد، لازم است كه آنها را به درستي آزاد سازيد. در غير اينصورت محيط برنامه شما بسيار متراكم و آلوده خواهد شد. آزاد سازي در مورد حافظه، فايلها، كوكي ها، ساختارهاي داده، Sessionها، پايپ هاي ارتباطي و ديگر منابع مشابه صدق مي كند. مهاجمان مي توانند از آزادسازي نامناسب منابع سوءاستفاده كرده و از منابعي كه شما به ظاهر استفاده اي از آن نمي كنيد، بهره برداري كنند. اين مسئله منجربه مصرف جدي منابع مي شود زيرا در واقع هر منبعي كه گرفته مي شود به سيستم برنمي­گردد. هم چنين اگر زباله هاي برنامه يا Garbage را پاكسازي نكنيد، مهاجمان با دست يافتن به آن قادرند بعضي اطلاعات ارزشمند را بازيابي كنند.
  • راه اندازي اوليه نامناسب
    همان طور كه يك صبحانه خوب به كارايي شما در طول روز كمك شاياني مي كند، يك راه اندازي اوليه صحيح نيز، تضمين مي كند برنامه شما وسط يك رويداد مهم متوقف نخواهد شد. اگر شما داده ها و متغيرهاي خود را مقداردهي اوليه نكنيد، مهاجمان اين كار را براي شما انجام خواهند داد. آنها همچنين مي توانند اطلاعات به جا مانده از اجراي بخش هاي قبلي را نيز مورد استفاده قرار دهند. امكان دستكاري شدن متغيرهايي كه مقداردهي اوليه نشده اند و در عمليات هاي مهم امنيتي، مانند تصميم تأييد هويت مورد استفاده قرار مي گيرند، وجود دارد و منجر به تغيير سياستهاي امنيتي برنامه مي شود. امكان مقدار دهي اوليه نادرست در هرجايي وجود دارد، ولي شايعترين مورد، شرايط استثنائي برنامه است كه سهواً ازآن پرش مي كنيد و منجر به خطاهاي مبهم و ناپيدا مي شود. بنابراين بيشتر مراقب شرايطي كه احتمال وقوع آن به ندرت براي برنامه شما وجود دارد باشيد، زيرا مهاجمان از اين شرايط به خوبي بهره برداري مي كنند.
  • محاسبات نادرست
    رايانه ها قادرند محاسباتي را انجام دهند كه نتايج آن با منطق رياضي جور در نمي­آيد. براي مثال اگر دو عدد مثبت و بزرگ را در هم ضرب كنيد، ممكن است نتيجه به علت سرريز عدد صحيح، يك عدد كوچك شود. در بعضي موارد انجام محاسبات براي رايانه غيرممكن است مانند مورد تقسيم بر صفر. زماني كه مهاجمان، كنترلي هرچند محدود بر وروديهاي استفاده شده در محاسبات عددي برنامه دارند، اين ضعفها مي­توانند منجر به مشكلات امنيتي مهمي شوند. ممكن است برنامه شما بسيار بيشتر يا بسيار كمتر از حد لزوم منابع را مورد استفاده قرار دهد. ممكن است منطق تجاري برنامه را به خطر اندازد، مانند زماني كه نتيجه محاسبات، يك مبلغ منفي را ارائه مي دهد و بالاخره ممكن است دچار انكار سرويس شويد، مانند زماني كه تقسيم بر صفر منجر به از كار افتادن سيستم مي شود.

در مطلب بعدي به خطاهاي رايج در بخش دفاع پر خلل خواهيم پرداخت.
منابع: http://cwe.mitre.org/top25

برچسب‌ها