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

شماره:IRCAR201410235
تاريخ: 25/07/93
اولين موضوعي كه به طور كلي در برنامه نويسي امن (رجوع شود به مقاله اصول برنامه نويسي امن) و همچنين در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي گيرد مربوط به اعتبار سنجي ورودي و پاكسازي داده ها است. در اين موضوع چهارده قانون معرفي مي گردد كه سطوح امنيتي مختلفي دارند (رجوع شود به مقاله برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها - آشنايي). نهمين قانون از اين موضوع داراي سطح امنيتي سه (L3) بوده و از اولويت (P4) برخوردار مي باشد.
قانون IDS08-J –پاكسازي داده نامطمئن ارسالي به regex
عبارات منظم براي تطابق رشته‌ها با متن بسيار استفاده مي‌شوند. به طور مثال، امكان POSIX grep، از عبارات منظم براي پيداكردن پارامترها در متني معين پشتيباني مي‌كند. بسته java.util.regex، دو كلاسPattern  وMatcher  دارد. كلاس Pattern نمايشي كامپايل شده از عبارت منظم را بسته بندي مي‌كند و كلاس Matcher موتوري است كه از Pattern استفاده مي‌كند و براي اجراي عمليات تطابق روي CharSequence استفاده مي‌شود.
بايد از استفاده نابجا از عبارت منظم جاوا (regex) محافظت كرد. مهاجم ممكن است از ورودي مخربي استفاده كند كه عبارت منظم اصلي را طوري تغيير دهد كه تطابق regex با مشخصات برنامه امكانپذير نباشد. به اين بُردار حمله، تزريق regex گفته مي‌شود و ممكن است جريان كنترل را تحت تاثير قرار دهد، باعث نشت اطلاعات شود، يا منجر به آسيب پذيري‌هاي DoS گردد.
ساخته‌ها و خصوصيات خاصي از عبارات منظم جاوا مستعد سوء استفاده شدن است:
-          پرچم‌هاي تطابق: ورودي‌هاي نامطمئن مي‌تواند منجر به ابطال گزينه‌هاي تطابق كه ممكن است يا نيست به متد Pattern.compile() ارسال شوند گردد.
-          Greediness: ورودي نامطمئن، ممكن است منجر به تزريق regex اي شود كه regex اصلي را براي رسيدن به تعداد بيشتري تطابق تغيير دهد و اطلاعات حساس افشا شود.
-          گروه بندي: برنامه نويس مي‌تواند بخش هايي از عبارت منظم را در پرانتز قرار دهد تا يكسري عمليات معمول در گروه را انجام دهد. مهاجم ممكن است با استفاده از ورودي نامطمئن قادر به تغيير گروه بندي باشد.
براي جلوگيري از تزريق regex، ورودي نامطمئن بايد قبل از استفاده پاكسازي شود. موقعي كه كاربر بايد regex را به عنوان ورودي مشخص كند، بايد مراقب بود كه regex اصلي بدون محدوديت نمي‌تواند تغيير كند. فيلتر كردن كاراكترها براساس ليست سفيد (مانند حروف و ارقام)، قبل از ارسال رشته توليد شده توسط كاربر به تجزيه كننده (parser) regex، استراتژي خوبي براي پاك سازي ورودي است. برنامه نويس بايد فقط زيرمجموعه بسيار محدودي از عملكردهاي عبارات منظم را براي كاربر فراهم كند تا هرگونه فرصت سوء استفاده كاهش يابد.
يك نمونه تزريق Regex
فرض كنيد فايلي از لاگ‌هاي سيستمي داريم كه حاوي پيام‌هاي توليد شده توسط فرآيندهاي سيستمي مختلف است. برخي فرآيندها پيام‌هاي عمومي و برخي ديگر پيام‌هاي حساسي را كه به عنوان "private" علامت گذاري مي‌شوند توليد مي‌كنند. مثالي از لاگ فايل در ذيل مي‌آيد:
كاربر در لاگ فايل براي پيدا كردن پيام‌هايي جستجو مي‌كند اما نبايد بتواند پيام‌هاي private را ببيند. براي اينكار، برنامه ممكن است متن جستجويي مانند ذيل را كه بخشي از عبارت منظم است فراهم كند:
اما، اگر مهاجمي بتواند به جاي <SEARCHTEXT>، رشته‌اي مانند زير را جايگزين كند، مي‌تواند تزريق regex را انجام دهد:
هنگام تزريق عبارت فوق، regex به صورت ذيل مي‌شود:
اين regex با هر خط لاگ فايل از جمله موارد private مطابقت خواهد كرد.
يك نمونه ناسازگار با قانون
برنامه ناسازگار زير، به صورت دوره‌اي لاگ فايل را در حافظه بارگذاري مي‌كند و به كلاينت‌ها امكان بدست آوردن كلمات كليدي پيشنهادي براي جستجو را از طريق ارسال كلمه كليدي به عنوان آرگومان به suggestSearches() مي‌دهد.
 
 
اين كد به كاربر مورد اعتماد، امكان جستجوي پيام‌هاي لاگ عمومي مانند “error” را مي‌دهد. اما، در عين حال براي مهاجم امكان اجراي تزريق regex را كه توضيح داده شد، فراهم مي‌كند.
راه حل سازگار با قانون (فيلتر كردن با استفاده از ليست سفيد)
اين راه حل سازگار، كاراكترهاي غيرالفبايي را (به جز فاصله و single quote) از رشته جستجو فيلتر مي‌كند تا از تزريق regex جلوگيري شود.
اين راه حل مجموعه لغات جستجوي معتبر را محدود مي‌كند. به طور نمونه، كاربر ممكن است ديگر بدنبال “name=” نگردد چراكه كاراكتر = از regex پاك سازي خواهد شد.
 
راه حل سازگار با قانون
روش ديگر كاهش اين آسيب پذيري، فيلتر كردن اطلاعات حساس قبل از تطابق است. چنين راه حلي نيازمند انجام فيلتر در هر بازه زماني است كه لاگ فايل به روز رساني مي‌شود؛ اين راه حل پيچيدگي بيشتري را دارد و از نظر كارايي مناسب نيست. اگر قالب لاگ تغيير كند و كلاس براي تطابق با اين تغييرات refactor نشده باشد، اطلاعات حساس ممكن است هنوز در معرض سوء استفاده باشد.
 
ارزيابي خطر
قصور در عدم پاكسازي داده نامطمئن به عنوان بخشي از عبارات منظم مي‌تواند منجر به افشاي اطلاعات حساس شود.
 
مطالب مرتبط:
برنامه‌نويسي امن با زبان جاوا - آشنايي
برنامه‌نويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي داده‌ها
برنامه‌نويسي امن با زبان جاوا – نشت اطلاعات حساس
برنامه‌نويسي امن با زبان جاوا – نشت قابليت ها
برنامه‌نويسي امن با زبان جاوا – انكار سرويس
برنامه‌نويسي امن با زبان جاوا – ارتقاي حقدسترسي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجيورودي و پاكسازي داده‌ها - آشنايي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت دوم
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت اول
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS01-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS02-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS03-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS04-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS05-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS06-J
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS07-J
 
منبع:
https://www.securecoding.cert.org/

نظرات

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

نوشته

 
تاریخ ایجاد: 27 مهر 1393

دسته‌ها

امتیاز

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