فا

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

شماره : IRCAR201409232

تاريخ: 24/06/93

اولين موضوعي كه به طور كلي در برنامه نويسي امن (رجوع شود به مقاله اصول برنامه نويسي امن) و همچنين در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي گيرد مربوط به اعتبار سنجي ورودي و پاكسازي داده ها است. در اين موضوع چهارده قانون معرفي مي گردد كه سطوح امنيتي مختلفي دارند (رجوع شود به مقاله برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها - آشنايي). هشتمين قانون از اين موضوع داراي سطح امنيتي يك (L1) بوده و از اولويت (P12) برخوردار مي باشد.

قانون IDS07-J – داده نامطمئن و پاكسازي نشده را به متد Runtime.exec() ارسال نكنيد.

عموماً برنامه‌هاي بيروني براي اجراي عملياتي كه كل سيستم نيازمند آن است فراخواني مي‌شوند. اينكار شكلي از استفاده مجدد است و حتي ممكن است شكلي ناپخته از مهندسي نرم افزار مبتني بر اجزاء درنظر گرفته شود. آسيب پذيري‌هاي تزريق آرگومان و يا تزريق فرمان زماني اتفاق مي افتند كه برنامه كاربردي ورودي‌هاي نامطمئن را به درستي پاكسازي ننمايد و از آنها در اجراي برنامه‌هاي بيروني استفاده كند.

هر برنامه كاربردي جاوا، نمونه‌اي از كلاس Runtime را دارد كه به برنامه امكان برقراري ارتباط با محيطي را كه برنامه در آن درحال اجرا است مي‌دهد. زمان اجراي فعلي مي‌تواند از طريق متد Runtime.getRuntime() گرفته شود. معاني Runtime.exec() به خوبي تعريف نشده‌اند؛ بنابراين بهتر است جز در موارد ضروري به رفتار اين متد اعتماد نشود ولي معمولاً دستور مذكور مستقيماً و بدون پوسته(shell) فراخواني مي شود. در صورت   نياز به پوسته‌ ، از /bin/sh –c در POSIX يا cmd.exe در ويندوز استفاده كنيد. نسخه ‌هاي مختلفي از exec() كه خط دستور را به عنوان يك رشته تنها دريافت مي‌كنند، رشته را با استفاده از StringTokenizer تجزيه مي‌كنند. در ويندوز، اين توكن‌ها قبل از اجرا با هم تركيب شده و تشكيل يك رشته آرگومان را مي‌دهند.

در نتيجه، حملات تزريق فرمان به جز در مواردي كه مفسر فرمان صراحتاً فراخواني شود، نمي‌توانند موفق باشند. در حالي كه حملات تزريق آرگومان زماني اتفاق مي افتند كه آرگومان‌ها حاوي كاراكتر فاصله، نقل قول (double quotes)، و  غيره باشند يا زماني كه براي نشان دادن يك سوييچ با كاراكتر "– "يا "/" آغاز شده باشند.

اين قانون يك نمونه‌ مشخص از قانون IDS00 است. هر داده رشته‌اي كه از خارج محدوده مورد اعتماد برنامه سرچشمه مي‌گيرد بايد قبل از اجرا به عنوان دستور در پلت فرم جاري، پاكسازي شود.


يك نمونه ناسازگار با قانون (ويندوز)

برنامه زير، مثالي از فهرست كردن دايركتوري با استفاده از دستور cmd است. اينكار با استفاده از Runtime.exec() براي فراخواني دستور dir پياده سازي شده است.

 

بدليل اينكه Runtime.exec() داده پاكسازي نشده‌اي را از محيط مي‌گيرد، اين برنامه مستعد حمله تزريق فرمان است. مهاجم مي‌تواند با استفاده از دستور زير از برنامه سوء استفاده كند.

Java –Ddir= ‘dummy & echo bad’ Java

برنامه‌اي كه اجرا مي‌شود دو دستور دارد:

Cmd.exe /C dir dummy & echo bad

كه ابتدا تلاش بر فهرست كردن فولدر dummy كه وجود ندارد مي‌كند و سپس bad را در كنسول مي‌نويسد.

يك نمونه ناسازگار با قانون (POSIX)

برنامه ناسازگار زير عملكرد مشابهي با نمونه بالا دارد و فقط از دستور ls در POSIX استفاده شده است. تنها تفاوت نسبت به نسخه ويندوزي، آرگوماني است كه به Runtime.exec() ارسال گرديده است.


دستوري كه اجرا مي‌شود به صورت زير است:

Sh –c ‘ls dummy & echo bad’

راه حل سازگار با قانون (پاكسازي)

اين راه حل سازگار، ورودي نامطمئن كاربر را پاكسازي ميكند و اين كار را از طريق پذيرش گروهي از كاراكترهاي ليست سفيد در آرگومان ارسالي به Runtime.exec() انجام ميدهد؛ ساير كاراكترها در نظر گرفته نمي‌شوند.

 

اگرچه اين برنامه، راه حل سازگار با قانون است، اما اين رهيافت پاكسازي، دايركتوري‌هاي معتبر را هم رد مي‌كند. همچنين، بدليل اينكه مفسر فرمان كه فراخواني مي‌شود وابسته به سيستم است، اين راه حل لزوماً از تزريق‌هاي فرمان در هر پلت فرمي كه جاوا ممكن است اجرا شود جلوگيري نمي‌كند.

 

راه حل سازگار با قانون (محدوديت در انتخاب كاربر)

اين راه حل سازگار، از طريق ارسال رشته‌هاي مورد اعتماد به Runtime.exec()، از تزريق فرمان جلوگيري مي‌كند. كاربر روي اينكه كدام رشته استفاده شده است كنترل دارد اما نمي تواند مستقيماً رشته اي براي Runtime.exec() فراهم كند.

 
 

در اين راه حل سازگار، دايركتوري‌هايي كه ممكن است فهرست شود در متن برنامه قرار گرفته است.

اين راه حل، درصورتي كه تعداد زيادي دايركتوري وجود داشته باشد به سرعت غيرقابل مديريت خواهد شد. راه حل ديگر، خواندن تمام دايركتوري‌هاي مجاز از properties file در شي java.util.Properties است.

 
راه حل سازگار با قانون (اجتناب از Runtime.exec())

زماني كه فعاليت انجام شده توسط دستور سيستمي (system command) قابليت انجام از طرق ديگر را نيز دارد، توصيه مي شود از روشهايي به جز دستور سيستمي استفاده شود.

اين راه حل سازگاري از متد File.list() براي فهرست كردن دايركتوري و حذف احتمال حملات تزريق آرگومان و فرمان استفاده مي‌كند.

 
 
ارزيابي خطر

ارسال داده نامطمئن و پاكسازي نشده به متد Runtime.exec() مي‌تواند منجر به حملات تزريق آرگومان و فرمان شود.


تشخيص اتوماتيك

 

 

مطالب مرتبط:
برنامه‌نويسي امن با زبان جاوا - آشنايي

برنامه‌نويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي داده‌ها

برنامه‌نويسي امن با زبان جاوا – نشت اطلاعات حساس
برنامه‌نويسي امن با زبان جاوا – نشت قابليت ها
برنامه‌نويسي امن با زبان جاوا – انكار سرويس
برنامه‌نويسي امن با زبان جاوا – ارتقاي حقدسترسي

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

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

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

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

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

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

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

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

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

 
منبع:

 


نظرات

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

نوشته

 
تاریخ ایجاد: 1 آذر 1387

دسته‌ها

امتیاز

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