فا

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

IRCAR201312195
اولين موضوعي كه به طور كلي در برنامه نويسي امن (رجوع شود به مقاله اصول برنامه نويسي امن) و همچنين در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي گيرد مربوط به اعتبار سنجي ورودي و پاكسازي داده ها است. در اين موضوع چهارده قانون معرفي مي گردد كه سطوح امنيتي مختلفي دارند (رجوع شود به مقاله برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجيورودي و پاكسازي داده‌ها - آشنايي). سومين قانون از اين موضوع داراي سطح امنيتي سه (L3) بوده و از اولويت (P4) برخوردار مي باشد.
قانون IDS02-J – قبل از اعتبارسنجي نام مسيرها آنها را استانداردسازي كنيد.
با توجه به API 2006 براي كلاس java.io.File:
نام مسير چه به صورت انتزاعي، يا به شكل رشته مي تواند مطلق يا نسبي باشد. يك نام مسير مطلق، كامل است به طوري كه اطلاعات ديگري براي پيدا كردن محل فايل مورد نياز نيست. يك نام مسير نسبي بايد بر اساس اطلاعاتي كه از يك نام مسير ديگر گرفته مي شود، تفسير گردد.
نام مسيرهاي نسبي يا مطلق ممكن است حاوي لينك هايي به فايلها همچون لينكهاي سمبليك (نرم)، لينكهاي سخت، ميانبرها، سايه ها، نام هاي مستعار و يا پيوندها باشند. اين لينك ها بايستي پيش از هر عمليات اعتبارسنجي بازيابي شوند. براي مثال مقصد نهايي يك لينك سمبليك به نام trace ممكن است يك نام مسير به شكل /home/system/traceباشد. همچنين نام هاي مسير ممكن است حاوي اسامي فايلهاي خاصي باشند كه اعتبارسنجي را مشكل مي سازد:
  1. "." به خود دايركتوري اشاره مي كند.
  2. درون يك دايركتوري، نام فايل ".." به دايركتوري مادر اشاره مي كند.
علاوه بر اين مشكلات خاص، گستره وسيعي از قراردادهاي نامگذاري مخصوص به سيستم عامل يا فايل سيستم ها وجود دارد كه اعتبارسنجي را مشكل مي سازد.
استانداردسازي نام فايلها اعتبارسنجي نام مسير را ساده تر مي سازد. بيش از يك نام مسير مي تواند به يك فايل يا دايركتوري يكسان منجر شود. علاوه بر اين، نمايش متني يك نام مسير ممكن است هيچ اطلاعاتي در مورد فايل يا دايركتوري مورد اشاره ندهد. در نتيجه، همه نامهاي مسير بايد قبل از اعتبارسنجي استانداردسازي شوند.
يك نمونه ناسازگار با قانون
اين نمونه ناسازگار با قانون يك مسير فايل را به عنوان آرگومان خط فرمان پذيرفته و از تابع File.getAbsolutePath() براي پيدا كردن مسير مطلق فايل استفاده مي كند. اين برنامه همچنين از تابع isInSecureDir() كه در FIO00-J تعريف شده است براي اطمينان از اينكه فايل در يك دايركتوري امن است استفاده مي كند. اين برنامه نه لينك ها را بازيابي مي كند و نه خطاهاي مرتبط را از بين مي برد.
publicstaticvoidmain(String[] args) {
File f = newFile(System.getProperty("user.home") + System.getProperty("file.separator") + args[0]);
String absPath = f.getAbsolutePath();
if(!isInSecureDir(Paths.get(absPath))) {
thrownewIllegalArgumentException();
}
if(!validate(absPath)) { // Validation
thrownewIllegalArgumentException();
}
}
اين نمونه ناسازگار با قانون تمايل به محدود ساختن كاربر به عدم اجراي عمليات بر روي فايلهايي خارج از دايركتوري خانه را دارد. با وجود اينكه تابع validate() سعي دارد تا اطمينان حاصل سازد كه نام مسير در اين دايركتوري قرار دارد، مي تواند به سادگي فريب بخورد. براي مثال كاربر مي تواند لينكي را در دايركتوري مادر ايجاد كند كه به يك دايركتوري يا فايل خارج از دايركتوري مادر اشاره مي كند.
راه حل سازگار با قانون ( getCanonicalPath() )
اين راه حل سازگار از تابع getCanonicalPath() كه در جاوا2 معرفي شده است،استفاده مي كند. اين تابع همه نام هاي مستعار، ميانبرها و لينك هاي سمبليك را بر روي همه پلتفرم ها بازيابي مي كند. نام فايل هاي خاص همچون ".." نيز حذف مي شوند و به اين ترتيب ورودي به شكل استاندارد درآمده و سپس اعتبارسنجي انجام مي شود. با وجود تابع validate() مهاجم نمي تواند از توالي هاي “../” براي شكستن دايركتوري استفاده كند.
publicstaticvoidmain(String[] args) throwsIOException {
File f = newFile(System.getProperty("user.home") + System.getProperty("file.separator")+ args[0]);
String canonicalPath = f.getCanonicalPath();
if(!isInSecureDir(Paths.get(canonicalPath))) {
thrownewIllegalArgumentException();
}
if(!validate(canonicalPath)) { // Validation
thrownewIllegalArgumentException();
}
}
تابع getCanonicalPath() زماني كه در اپلت ها مورد استفاده قرار مي گيرد منجر به بروز يك استثناء امنيتي مي شود، زيرا اطلاعات زيادي را در مورد سيستم ميزبان فاش مي سازد. تابع getCanonicalFile() همچون تابع getCanonicalPath() رفتار مي كند با اين تفاوت كه به جاي رشته يك شئ File جديد باز مي گرداند.
راه حل سازگار با قانون (Security Manager )
يك روش ديگر براي مديريت اين مشكل دادن دادن حق دسترسي به برنامه فقط براي كار با فايلهايي است كه در يك دايركتوري مشخص قرار دارند. در اين مثال دايركتوري خانه كاربر مدنظر است. در راه حل سازگار با قانون ارائه شده مسير مطلق برنامه در فايل سياست هاي امنيتي مشخص شده و براي java.io.FilePermission مقصد ${user.home}/* و عمليات هاي خواندن و نوشتن در نظر گرفته شده است.
grant codeBase "file:/home/programpath/"{
permission java.io.FilePermission "${user.home}/*", "read, write";
};
اين راه حل نيازمند اين است كه دايركتوري خانه يك دايركتوري امن باشد.
ارزيابي خطر
استفاده از نام هاي مسير منابع نامعتمد بدون اينكه قبل از اعتبارسنجي متمركز گردند ممكن است منجر به آسيب پذيري هاي پيمايش دايركتوري و معادلسازي مسير گردد.
تشخيص اتوماتيك
مطالب مرتبط:
برنامه‌نويسي امن با زبان جاوا - آشنايي
برنامه‌نويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي داده‌ها
برنامه‌نويسي امن با زبان جاوا – نشت اطلاعات حساس
برنامه‌نويسي امن با زبان جاوا – نشت قابليت ها
برنامه‌نويسي امن با زبان جاوا – انكار سرويس
برنامه‌نويسي امن با زبان جاوا – ارتقاي حقدسترسي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجيورودي و پاكسازي داده‌ها - آشنايي
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت دوم
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت اول
برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS01-J

نظرات

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

نوشته

 
تاریخ ایجاد: 18 مرداد 1393

دسته‌ها

امتیاز

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