IRCAR201306177
تاريخ: 04/04/92
روز به روز بر تعداد گزارشهايي كه در مورد آسيبپذيري در نرمافزارها و يا سوءاستفاده از آنها منتشر ميشود، افزوده ميگردد و بسياري از اين گزارشها منجر به هشدارهاي امنيتي فني ميشوند. براي برطرف ساختن اين تهديد كه بر روي دولتها، شركتها، موسسات آموزشي و افراد تأثير ميگذارد، لازم است سيستمهايي فارغ از آسيبپذيريهاي نرمافزاري طراحي و ايجاد شوند.
بخش عمدهاي از آسيبپذيريهاي نرمافزارها بر اثر خطاهاي برنامهنويسي ايحاد ميشوند. براي مثال، 64 درصد آسيبپذيريهايي كه در سال 2004 شناخته شدهاند مربوط به خطاهاي برنامهنويسي بودهاند.
زبان برنامهنويسي جاوا، زبان نسبتاً امني شناخته ميشود، چرا كه براي مثال اين زبان امكاني را براي دستكاري اشارهگرها به صورت صريح ندارد، حدود رشتهها و آرايهها به صورت خودكار بررسي ميشوند، تلاش براي ارجاع به اشارهگر تهي ناكام ميماند، عمليات رياضي و تبديل انواع به خوبي تعريف شده و مستقل از پلتفرم هستند، همچنين امكان bytecode verifier تضمين ميكند كه اين بررسيها همواره انجام ميشوند. علاوه بر اين، جاوا داراي مكانيزمهاي جامع امنيتي است به طوري كه ميتواند دسترسي به فايلها، سوكتها و ديگر منابع حساس را كنترل نمايد.
با اين وجود، امنيت برنامههاي جاوا در شرايطي به خطر ميافتد. يكي از اين شرايط اعتبار سنجي وروديي است كه در مقاله "برنامهنويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي دادهها" شرح داده شد، يكي ديگر از موارد مذكور شرايطي است كه منجر به نشت اطلاعات حساس يا نشت قابليت ها مي شود كه آن نيز در مقاله هاي "برنامهنويسي امن با زبان جاوا – نشت اطلاعات حساس" و " برنامهنويسي امن با زبان جاوا – نشت قابليت ها" توضيح داده شده است.
حملات انكار سرويس فرسودگي منابع
يك نوع از حملات انكار سرويس زماني رخ مي دهد كه حجم ورودي ها براي استفاده از منابع در مقايسه با منابع در دسترس بسيار بالا باشد.
در زير مثال هايي از حملات احتمالي آورده شده است:
- تقاضاي يك تصوير با اندازه بسيار بزرگ براي بردار گرافيكي براي مثال SVG يا فايلهاي فونت.
- "Zip Bombs" كه در آن يك فايل كوچك به شدت فشرده سازي مي شود براي مثال در صورتي كه توسط ZIP يا GIF يا gzip محتواي HTTP فشرده سازي شود.
- حمله ميلياردها خنده يا "Billion laughs attack" كه منجر به بزرگ شدن بيش از اندازه فايل XML در زمان تجزيه مي شود.
- استفاده بسيار زياد از فضاي حافظه
- وارد كردن كليدهاي زياد با كد درهم سازي يكسان در يك جدول درهم سازي كه منجر به بدترين حالت كارايي (O(n²)) به جاي كارايي نرمال (O(n)) مي شود.
- ايجاد اتصالات زياد به طوري كه سرور براي هر اتصال منابع زيادي را اختصاص دهد. براي مثال مي توان به حملات SYN flood كلاسيك اشاره كرد.
قوانيني كه مرتبط با پيشگيري از حملات انكار سرويس فرسودگي منابع هستند عبارتند از:
- قانون FIO03-J – قبل از خروج از برنامه فايل هاي موقتي را پاك نماييد.
- قانون FIO04-J – منابعي را كه ديگر به آنها نيازي نيست، آزاد سازيد.
- قانون FIO07-J – اجازه ندهيد پردازه هاي خارجي بافرهاي ورودي/خروجي را مسدود نمايند.
- قانون FIO14-J – در زمان خروج از برنامه پاكسازي هاي مناسب را انجام دهيد.
- قانون IDS04-J – فايلهاي مربوط به ZipInputStream را به صورت امن گسترده سازيد.
- قانون MET12-J – از پايان دهنده ها (Finalizers) استفاده نكنيد.
- قانون MSC04-J – اجازه نشت اطلاعات از حافظه را ندهيد.
- قانون MSC05-J – بيش از اندازه از فضاي heap استفاده نكنيد.
- قانون SER10-J – در زمان سريال سازي اجازه نشت از حافظه و منابع را ندهيد.
- قانون TPS00-J – از استخرهاي رشته براي مقابله با كاهش خدمات در زمان هاي اوج ترافيك استفاده كنيد.
- قانون TPS01-J – كارهاي وابسته به يكديگر را در يك استخر رشته محدود اجرا نكنيد.
- قانون VNA03-J – فرض نكنيد كه گروهي از فراخواني ها به متدهاي تجزيه ناپذير مستقل، خود تجزيه ناپذير هستند.
اين قوانين در قسمت هاي آتي سلسله مقالات برنامه نويسي امن با جاوا با تفصيل شرح داده خواهند شد.
حملات انكار سرويس همزماني
برخي از حملات انكار سرويس از طريق تداخل در مشكلات همزماني منابع همچون بن بست رشته، قحطي رشته و شرايط رقابتي اجرا مي شوند. قوانيني كه مرتبط با پيشگيري از حملات انكار سرويس همزماني هستند عبارتند از:
- قانون LCK00-J – از اشياء خصوصي قفل نهايي براي همزمان سازي كلاس هايي كه ممكن است با كدهاي نامعتمد سر و كار داشته باشند، استفاده كنيد.
- قانون LCK01-J – بر روي اشيائي كه احتمال استفاده مجدد از آنها وجود دارد، همزمان سازي را اجرا نكنيد.
- قانون LCK07-J – از بن بست هايي كه بر اثر درخواست و آزاد سازي قفل ها به صورت مكرر اتفاق مي افتند، اجتناب كنيد.
- قانون LCK08-J – اطمينان حاصل كنيد كه قفل ها قابليت آزادسازي در شرايط استثنائي را دارا هستند.
- قانون LCK09-J – عملياتي را كه ممكن است در زمان نگهداري قفل، متوقف شود اجرا نكنيد.
- قانون LCK11-J – در زمان استفاده از كلاس هايي كه به استراتژي قفل سازي پايبند نيستند، از قفل كردن سمت كاربر اجتناب كنيد.
- قانون THI04-J – از پايان يافتن رشته هايي كه عمليات قفل سازي را انجام مي دهند، اطمينان حاصل نماييد.
- قانون TPS02-J – اطمينان حاصل كنيد كه كارهايي كه در استخر رشته ثبت مي شوند غير قابل وقفه مي باشند.
- قانون TSM02-J – در زمان ايجاد كلاس ها از رشته هاي پشت صحنه استفاده نكنيد.
اين قوانين در قسمت هاي آتي سلسله مقالات برنامه نويسي امن با جاوا با تفصيل شرح داده خواهند شد.
ديگر حملات انكار سرويس
قوانين ديگري كه مرتبط با پيشگيري از حملات انكار سرويس هستند عبارتند از:
- قانون ERR09-J – اجازه ندهيد كه يك كد نامطمئن ماشين جاوا (JVM) را خاموش كند.
- قانون IDS00-J – داده هاي نامطمئن را كه از يك محدوده قابل اعتماد عبور مي كنند، پاكسازي نماييد.
- قانون IDS06-J – به كاربر اجازه ورود رشته هاي قالب را ندهيد.
- قانون IDS08-J – داده هاي نامطمئن را كه به regex ارسال ميشوند، پاكسازي نماييد.
اين قوانين در قسمت هاي آتي سلسله مقالات برنامه نويسي امن با جاوا با تفصيل شرح داده خواهند شد.
آسيب پذيري هاي منجر به انكار سرويس
قوانين ديگري نيز وجود دارند كه منجر به كاهش آسيب پذيري هايي مي شوند كه مي توانند منجر به فعال شدن حملات انكار سرويس شوند، اما به تنهايي قادر به ايجاد حملات انكار سرويس نيستند. اين قوانين عبارتند از :
- قانون ERR01-J – اجازه ندهيد استثناءها اطلاعات حساس را افشا نمايند.
- قانون ERR02-J – در هنگام ثبت داده ها، مانع از بروز استثناءها شويد.
- قانون EXP01-J – هيچ گاه اشاره گرهاي تهي را ارجاع دهي مجدد ننماييد.
- قانون FIO00-J – برروي فايل هايي كه در دايركتوري هاي مشترك قرار دارند، كار نكنيد.
- قانون NUM02-J – از عدم بروز خطاهاي تقسيم بر صفر اطمينان حاصل كنيد.
اين قوانين در قسمت هاي آتي سلسله مقالات برنامه نويسي امن با جاوا با تفصيل شرح داده خواهند شد.
مطالب مرتبط
برنامهنويسي امن با زبان جاوا - آشنايي
برنامهنويسي امن با زبان جاوا – نشت اطلاعات حساس
برنامهنويسي امن با زبان جاوا – نشت قابليت ها
- 7