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

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

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

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

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

[عکس: JSC_Filter.jpg]

اجزای نرم‌افزار جاوا موقعیت‌های بسیاری را برای خروج اطلاعات حساس فراهم می‌آورند. به همین منظور قوانینی در جاوا مطرح شده‌اند كه منجر به كاهش احتمال افشای اطلاعات حساس می‌شوند. این قوانین به شرح زیر هستند:

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

·         قانون FIO13-J – اطلاعات حساس را بیرون از محدوده قابل اعتماد ثبت نكنید.

·         قانون IDS03-J – ورودی از كاربر بدون مجوز را ثبت نكنید.

·         قانون MSC03-J – هرگز اطلاعات حساس را درون كد برنامه ذخیره نكنید. (hard code)

·         قانون SER03-J – اطلاعات حساسی را كه رمزنگاری نشده‌اند، سریال سازی نكنید.

·         قانون SER04-J – پروسه‌های سریال‌سازی و بازكردن سریال‌ها نباید مدیر امنیتی را دور بزنند.

·         قانون SER06-J – از اجزایی كه در حین پروسه باز كردن سریال‌ها تغییر می‌كنند، كپی تهیه نمایید.

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


امنیت نوع

جاوا به عنوان یك زبان با نوع امن شناخته می‌شود. به همین دلیل قاعدتاً نباید بتوان یك برنامه جاوا را از طریق استفاده نادرست از انواع سیستمی مورد مصالحه قرار داد. برای اینكه به اهمیت امنیت نوع پی ببرید، كد زیر را در نظر بگیرید:

کد:
public class TowerOfLondon {

 private Treasure theCrownJewels;
 ...
}


public class GarageSale {

 public Treasure myCostumeJewelry;
 ...
}

در صورتی كه این دو نوع بتوانند با هم تداخل پیدا كنند، می توان به فیلد خصوصی theCrownJewels همچون فیلد عمومی MyCostumeJewerly دسترسی پیدا كرد. در واقع می توان گفت كه یك حمله "تداخل نوع" امنیت جاوا را در اختیار سوءاستفاده كنندگان قرار می دهد. یك گروه از محققان امنیتی دانشگاه پرینستون آمریكا نشان دادند كه هر نوع تداخل نوعی می تواند برای غلبه كامل بر مكانیزم های امنیتی جاوا به كار گرفته شود.

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

فیلدی كه به صورت عمومی تعریف شده است می تواند توسط هر جزء برنامه مورد دستیابی قرار گیرد و می تواند از هر جای برنامه ویرایش شود. واضح است كه فیلدهای حساس نباید به صورت عمومی تعریف گردند زیرا می توانند توسط هر فردی كه ماشین جاوایی را كه برنامه را اجرا می كند  هك كرده است، مورد دسترسی قرار گیرند.