انجمن گروه موج سازان

نسخه‌ی کامل: برنامه‌نویسی امن با زبان جاوا – نشت قابلیت ها
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
روز به روز بر تعداد گزارش‌هایی كه در مورد آسیب‌پذیری در نرم‌افزارها و یا سوءاستفاده از آنها منتشر می‌شود، افزوده می‌گردد و بسیاری از این گزارش‌ها منجر به هشدارهای امنیتی فنی می‌شوند. برای برطرف ساختن این تهدید كه بر روی دولت‌ها، شركت‌ها، موسسات آموزشی و افراد تأثیر می‌گذارد، لازم است سیستم‌هایی فارغ از آسیب‌پذیری‌های نرم‌افزاری طراحی و ایجاد شوند.

بخش عمده‌ای از آسیب‌پذیری‌های نرم‌افزارها بر اثر خطاهای برنامه‌نویسی ایحاد می‌شوند. برای مثال، 64 درصد آسیب‌پذیری‌هایی كه در سال 2004 شناخته شده‌اند مربوط به خطاهای برنامه‌نویسی بوده‌اند.

زبان برنامه‌نویسی جاوا، زبان نسبتاً امنی شناخته می‌شود، چرا كه برای مثال این زبان امكانی را برای دستكاری اشاره‌گرها به صورت صریح ندارد، حدود رشته‌ها و آرایه‌ها به صورت خودكار بررسی می‌شوند، تلاش برای ارجاع به اشاره‌گر تهی ناكام می‌ماند، عملیات‌ ریاضی و تبدیل انواع به خوبی تعریف شده و مستقل از پلت‌فرم هستند، همچنین امكان bytecode verifier تضمین می‌كند كه این بررسی‌ها همواره انجام می‌شوند. علاوه بر این، جاوا دارای مكانیزم‌های جامع امنیتی است به طوری كه می‌تواند دسترسی به فایل‌ها، سوكت‌ها و دیگر منابع حساس را كنترل نماید.

با این وجود، امنیت برنامه‌های جاوا در شرایطی به خطر می‌افتد. یكی از این شرایط اعتبار سنجی ورودیی است كه در مقاله "برنامه‌نویسی امن با زبان جاوا - اعتبارسنجی ورودی و پاكسازی داده‌ها" شرح داده شد، یكی دیگر از موارد مذكور شرایطی است كه منجر به نشت اطلاعات حساس می شود كه آن نیز در مقاله "برنامه‌نویسی امن با زبان جاوا – نشت اطلاعات حساس" توضیح داده شد.

یكی دیگر از شرایطی كه بالقوه خطر آفرین است مربوط به نشت قابلیت ها می شود. اصطلاح قابلیت اولین بار توسط Dennis و Van Horn مطرح شد. ایده اصلی اینست كه هر برنامه برای دسترسی به یك شئ باید مجوز لازم را دارا باشد. این مجوز، شئ مورد نظر را معین كرده و به برنامه اجازه اجرای مجموعه مشخصی از عملیات‌ها (مانند خواندن یا نوشتن) را بر روی شئ مذكور می‌دهد. چنین مجوزی به عنوان قابلیت شناخته می‌شود.

قابلیت یك مجوز غیرقابل جعل و ارتباط پذیر است. برنامه كاربر بر روی یك سیستم عامل مبتنی بر قابلیت لازم است قابلیت دسترسی به یك شئ را دارا باشد.

در یك زبان برنامه نویسی شئ- قابلیت، وضعیت برنامه در اشیائی وجود دارد كه نمی توانند بدون یك مرجع خوانده یا نوشته شوند و این وضعیت در خدمت یك مجوز غیر قابل جعل قابلیت است. همه منابع خارجی نیز به صورت اشیاء نمایش داده می شوند. اشیاء، وضعیت درونی خود را پنهان كرده و تنها از طریق واسط های كاربری از پیش تعریف شده اجازه دسترسی به آن را به دارندگان مجوز می دهد.

هر شئ در جاوا علاوه بر محتویاتش دارای یك هویت غیر قابل جعل نیز می باشد زیرا عملگر "==" معادل بودن مراجع را نیز تست می كند. این هویت غیر قابل جعل اجازه استفاده از مرجع یك شئ را به عنوان یك توكن می دهد كه به عنوان اثبات مجوز دسترسی برای اجرای كنش ها است.

یكی از منابع اصلی نشت قابلیت‌ها كلاس‌های داخلی (Inner classes) هستند، زیرا كلاس‌ها به همه فیلدهای كلاس‌های داخلی خود نیز دسترسی دارند. امكان bytecodes برای جاوا در این زمینه كمبود داشته و از كلاس‌های داخلی پشتیبانی نمی‌نماید و در نتیجه در زمان كامپایل به صورت كلاس‌های معمولی در می‌آیند.


قوانینی كه مرتبط با پیشگیری از نشت قابلیت ها هستند عبارتند از:

· قانون ERR01-J – به كدهای نامعتمد اجازه پایان دادن به اجرای ماشین جاوا را ندهید.

· قانون FIO13-J – حق دسترسی متدهای نهان یا بازنویسی شده را افزایش ندهید.

· قانون IDS03-J – عضوهای خصوصی یك كلاس بزرگتر را از درون زیر كلاس ها فاش نسازید.

· قانون MSC03-J – اجازه ندهید بلاك های دارای حق دسترسی بالا داده های حساس را از طریق محدوده قابل اعتماد افشا سازند.

· قانون SEC03-J – عملیات های حساس را با مدیر امنیتی چك كنید.

· قانون SER08-J – حق دسترسی را قبل از باز كردن سریال ها از یك متن با حق دسترسی بالا، كاهش دهید.

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