انجمن گروه موج سازان

نسخه‌ی کامل: برنامه‌نویسی امن با زبان جاوا – انكار سرویس
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
روز به روز بر تعداد گزارش‌هایی كه در مورد آسیب‌پذیری در نرم‌افزارها و یا سوءاستفاده از آنها منتشر می‌شود، افزوده می‌گردد و بسیاری از این گزارش‌ها منجر به هشدارهای امنیتی فنی می‌شوند. برای برطرف ساختن این تهدید كه بر روی دولت‌ها، شركت‌ها، موسسات آموزشی و افراد تأثیر می‌گذارد، لازم است سیستم‌هایی فارغ از آسیب‌پذیری‌های نرم‌افزاری طراحی و ایجاد شوند.
بخش عمده‌ای از آسیب‌پذیری‌های نرم‌افزارها بر اثر خطاهای برنامه‌نویسی ایحاد می‌شوند. برای مثال، 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 – از عدم بروز خطاهای تقسیم بر صفر اطمینان حاصل كنید.

این قوانین در قسمت های آتی سلسله مقالات برنامه نویسی امن با جاوا با تفصیل شرح داده خواهند شد.