برنامه‌نويسی امن با زبان جاوا – نشت قابليت‌ها

برنامه‌نويسی امن با زبان جاوا – نشت قابليت‌ها

تاریخ ایجاد

IRCAR201305175
تاريخ: 05/03/92

روز به روز بر تعداد گزارش‌هايي كه در مورد آسيب‌پذيري در نرم‌افزارها و يا سوءاستفاده از آنها منتشر مي‌شود، افزوده مي‌گردد و بسياري از اين گزارش‌ها منجر به هشدارهاي امنيتي فني مي‌شوند. براي برطرف ساختن اين تهديد كه بر روي دولت‌ها، شركت‌ها، موسسات آموزشي و افراد تأثير مي‌گذارد، لازم است سيستم‌هايي فارغ از آسيب‌پذيري‌هاي نرم‌افزاري طراحي و ايجاد شوند.
بخش عمده‌اي از آسيب‌پذيري‌هاي نرم‌افزارها بر اثر خطاهاي برنامه‌نويسي ايحاد مي‌شوند. براي مثال، 64 درصد آسيب‌پذيري‌هايي كه در سال 2004 شناخته شده‌اند مربوط به خطاهاي برنامه‌نويسي بوده‌اند.
زبان برنامه‌نويسي جاوا، زبان نسبتاً امني شناخته مي‌شود، چرا كه براي مثال اين زبان امكاني را براي دستكاري اشاره‌گرها به صورت صريح ندارد، حدود رشته‌ها و آرايه‌ها به صورت خودكار بررسي مي‌شوند، تلاش براي ارجاع به اشاره‌گر تهي ناكام مي‌ماند، عمليات‌ رياضي و تبديل انواع به خوبي تعريف شده و مستقل از پلت‌فرم هستند، همچنين امكان bytecode verifier تضمين مي‌كند كه اين بررسي‌ها همواره انجام مي‌شوند. علاوه بر اين، جاوا داراي مكانيزم‌هاي جامع امنيتي است به طوري كه مي‌تواند دسترسي به فايل‌ها، سوكت‌ها و ديگر منابع حساس را كنترل نمايد.
با اين وجود، امنيت برنامه‌هاي جاوا در شرايطي به خطر مي‌افتد. يكي از اين شرايط اعتبار سنجي وروديي است كه در مقاله "برنامه‌نويسي امن با زبان جاوا - اعتبارسنجي ورودي و پاكسازي داده‌ها" شرح داده شد، يكي ديگر از موارد مذكور شرايطي است كه منجر به نشت اطلاعات حساس مي شود كه آن نيز در مقاله "برنامه‌نويسي امن با زبان جاوا – نشت اطلاعات حساس" توضيح داده شد.
يكي ديگر از شرايطي كه بالقوه خطر آفرين است مربوط به نشت قابليت ها مي شود. اصطلاح قابليت اولين بار توسط Dennis و Van Horn مطرح شد. ايده اصلي اينست كه هر برنامه براي دسترسي به يك شئ بايد مجوز لازم را دارا باشد. اين مجوز، شئ مورد نظر را معين كرده و به برنامه اجازه اجراي مجموعه مشخصي از عمليات‌ها (مانند خواندن يا نوشتن) را بر روي شئ مذكور مي‌دهد. چنين مجوزي به عنوان قابليت شناخته مي‌شود.
قابليت يك مجوز غيرقابل جعل و ارتباط پذير است. برنامه كاربر بر روي يك سيستم عامل مبتني بر قابليت لازم است قابليت دسترسي به يك شئ را دارا باشد.
در يك زبان برنامه نويسي شئ- قابليت، وضعيت برنامه در اشيائي وجود دارد كه نمي توانند بدون يك مرجع خوانده يا نوشته شوند و اين وضعيت در خدمت يك مجوز غير قابل جعل قابليت است. همه منابع خارجي نيز به صورت اشياء نمايش داده مي شوند. اشياء، وضعيت دروني خود را پنهان كرده و تنها از طريق واسط هاي كاربري از پيش تعريف شده اجازه دسترسي به آن را به دارندگان مجوز مي دهد.
هر شئ در جاوا علاوه بر محتوياتش داراي يك هويت غير قابل جعل نيز مي باشد زيرا عملگر "==" معادل بودن مراجع را نيز تست مي كند. اين هويت غير قابل جعل اجازه استفاده از مرجع يك شئ را به عنوان يك توكن مي دهد كه به عنوان اثبات مجوز دسترسي براي اجراي كنش ها است.
يكي از منابع اصلي نشت قابليت‌ها كلاس‌هاي داخلي (Inner classes) هستند، زيرا كلاس‌ها به همه فيلدهاي كلاس‌هاي داخلي خود نيز دسترسي دارند. امكان bytecodes براي جاوا در اين زمينه كمبود داشته و از كلاس‌هاي داخلي پشتيباني نمي‌نمايد و در نتيجه در زمان كامپايل به صورت كلاس‌هاي معمولي در مي‌آيند.
قوانيني كه مرتبط با پيشگيري از نشت قابليت ها هستند عبارتند از:

  • قانون ERR01-J – به كدهاي نامعتمد اجازه پايان دادن به اجراي ماشين جاوا را ندهيد.
  • قانون FIO13-J – حق دسترسي متدهاي نهان يا بازنويسي شده را افزايش ندهيد.
  • قانون IDS03-J – عضوهاي خصوصي يك كلاس بزرگتر را از درون زير كلاس ها فاش نسازيد.
  • قانون MSC03-J – اجازه ندهيد بلاك هاي داراي حق دسترسي بالا داده هاي حساس را از طريق محدوده قابل اعتماد افشا سازند.
  • قانون SEC03-J – عمليات هاي حساس را با مدير امنيتي چك كنيد.
  • قانون SER08-J – حق دسترسي را قبل از باز كردن سريال ها از يك متن با حق دسترسي بالا، كاهش دهيد.

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

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

برچسب‌ها