فا

‫ برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها- قوانين IDS10-J و IDS11-J

شماره:IRCAR201502246
تاريخ: 28/11/93
اولين موضوعي كه به طور كلي در برنامه نويسي امن (رجوع شود به مقاله اصول برنامه نويسي امن) و همچنين در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي‌گيرد مربوط به اعتبار سنجي ورودي و پاكسازي داده‌ها است. در اين موضوع چهارده قانون معرفي مي‌گردد كه سطوح امنيتي مختلفي دارند (رجوع شود به مقاله برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها - آشنايي).
قانون IDS10-J – عدم شكل دهي به رشته‌هاي حاوي كاركترهاي خاص
اين قانون در نسخه جديد قوانين برنامه نويسي امن با جاوا، به  به ذيل قوانين مربوط به موضوع «كاراكترها و رشته‌ها (STR)» منتقل شده است.
قانون IDS11-J – اجراي هرگونه تغيير رشته قبل از اعتبارسنجي
رشته بعد از اجراي اعتبارسنجي نبايد تغيير كند، چرا كه در غير اين صورت ممكن است مهاجم بتواند اعتبارسنجي را دور بزند. به طور مثال، برنامه ممكن است برچسب‌هاي <script> را از ورودي HTML با هدف جلوگيري از حمله XSS و ساير آسيب‌پذيري‌ها حذف كند. اما اگر نشانه تعجب(!) در ورودي بعد از اعتبار سنجي حذف شود، مهاجم ممكن است رشته <scr!ipt> را ارسال كند و در نتيجه برنامه هنگام اعتبارسنجي برچسب <script> را شناسايي نمي‌كند و بعد از آن، نشانه تعجب را حذف مي‌كند كه اينكار منجر به ايجاد برچسب <script> به عنوان ورودي مي‌شود.
دسته‌هاي مختلفي از كاراكترها وجود دارد كه برنامه نويس ممكن است تصميم به حذف آنها داشته باشد. به طور مثال، استاندارد يونيكد (Unicode Standard) دسته‌هاي كاراكتري زير را تعريف مي‌كند:
برنامه‌هاي مختلف ممكن است هر كاراكتر متعلق به مجموعه تعريف شده‌اي از كاراكترها را حذف يا جايگزين كنند. هرگونه تغيير رشته بايد قبل از اعتبارسنجي رشته انجام شود.
 
يك نمونه ناسازگار با قانون (كدهاي غيركاراكتري(
در برخي نسخه‌هاي قبل از نسخه 5.2 استاندارد يونيكد، طبق بند C7 امكان حذف كد‌هاي غيركاراكتري وجود دارد. به طور مثال، در بند C7 از نسخه 5.1 استاندارد آمده است كه:
C7. زماني كه در برنامه‌اي لازم است تفسير دنباله‌اي از كاراكترهاي صحيح تغيير نكند، آن دنباله كاراكترهاي كد شده نبايد تغيير كند مگر اينكه با دنباله كاراكتري كه از نظر canonical با آن دنباله يكسان هستند و يا با استفاده از حذف كدهاي غيركاراكتري جايگزين شود.
اما اگر طبق اين قاعده عمل شود، "حذف كدهاي غيركاراكتري" مي‌تواند منجر به مخاطرات امنيتي گردد:
هر زماني كه كاراكتري به جاي جايگزيني به صورت نامشهود حذف مي‌شود، مانند آنچه كه در نسخه قبلي بندC7  استاندارد آمده است، ممكن است مشكلات امنيتي بروز كند. به طور مثال: درگاه ورودي ممكن است در جستجوي دنباله حساسي از كاراكترها، مثلاً "delete"، باشد. اگر رشته‌اي كه به عنوان ورودي ارسال مي‌شود "deXlete" باشد به طوريكه X غيركاراكتري باشد، درگاه ورودي ممكن است اين رشته را بپذيرد. اما فرض كنيد كه بعد از عبور از درگاه، X به صورت نامشهود حذف گردد. در اين حالت، دنباله حساسي از كاراكترها شكل گرفته است كه مي‌تواند منجر به نقض امنيتي گردد.
متد filterString() در نمونه كد ناسازگار زير رشته ورودي را نرمال كرده، آنرا از جهت نداشتن برچسب <script> بررسي مي‌كند، و هر كد غيركاراكتري را از رشه ورودي حذف مي‌كند. بدليل اينكه اعتبارسنجي ورودي قبل از حذف هر گونه كد غيركاراكتري انجام مي‌شود، مهاجم مي‌تواند كد غيركاراكتري را در برچسب <script> قرار دهد تا اعتبار سنجي را دور بزند.
راه حل سازگار با قانون (كد غيركاراكتري)
اين راه حل سازگاري، كاراكترهاي ناشناخته يا غيرقابل نمايش را با دنباله يونيكد \uFFFD -كه براي مشخص كردن اين شرايط رزرو شده است- جايگزين مي‌كند. بعلاوه، در اين راه حل، عمليات جايگزيني قبل از اجراي هر نوع عمليات امن‌سازي و به ويژه جستجو براي <script> انجام مي‌شود. اين كار باعث مي‌شود ورودي‌هاي مخرب نتوانند فيلترها را دور بزنند.
با توجه به گزارش فني شماره 36 استاندارد يونيكد، استفاده از U+FFFD معمولاً مشكلي ايجاد نمي‌كند، چرا كه صراحتاً براي اين هدف طراحي شده است. اين عبارت (uFFFD) معني نحوي در زبان‌هاي برنامه نويسي و ساختمان داده‌ها نداشته و صرفاً منجر به شكست در تجزيه رشته مي‌شود. در جايي كه مجموعه كاراكتر خروجي يونيكد نباشد، ممكن است اين كاراكتر وجود نداشته باشد.
 
ارزيابي خطر
اعتبارسنجي ورودي قبل از حذف يا تغيير كاراكترهاي رشته ورودي مي‌تواند امكان دورزدن بررسي‌هاي اعتبارسنجي را براي ورودي مخرب فراهم كند.
مطالب مرتبط:
برنامه‌نويسي امن با زبان جاوا - آشنايي
برنامه‌نويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي داده‌ها
برنامه‌نويسي امن با زبان جاوا – نشت اطلاعات حساس
برنامه‌نويسي امن با زبان جاوا – نشت قابليت ها
برنامه‌نويسي امن با زبان جاوا – انكار سرويس
برنامه‌نويسي امن با زبان جاوا – ارتقاي حقدسترسي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجيورودي و پاكسازي داده‌ها - آشنايي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت دوم
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت اول
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS01-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS02-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS03-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS04-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS05-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS06-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS07-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS08-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS09-J
 
منبع:

نظرات

بدون نظر
شما برای نظر دادن باید وارد شوید

نوشته

 
تاریخ ایجاد: 28 بهمن 1393

دسته‌ها

امتیاز

امتیاز شما
تعداد امتیازها:0