ذخیره سازی ناامن داده(Insecure Data Storage)

از Secure Coding

با استفاده از این آسیب پذیری می توان به داده های اپلیکیشن سمت کاربر دسترسی پیدا نمود. از داده های مهم که به هیچ عنوان نباید به صورت مستفیم سمت کاربر ذخیره شود می توان به:

  • نام کاربری یا username
  • توکن احراهویت
  • کوکی ها
  • اطلاعات موقعیت مکانی
  • گزارشات یا log های برنامه
  • تاریخچه تراکنش های بانکی
  • اطلاعات کارت های بانکی
  • UDID یاEMEI
  • اطلاعات هویتی مانند کدملی، آدرس ها
  • نام دستگاه
  • اطلاعات شبکه

اشاره نمود.

همچنین نگهداری داده ها به صورت مستقیم در

  • پایگاه داده های sqlite
  • فایل های log
  • فایل های plist
  • فایل های xml و Manifest
  • فایل های binary
  • نگهداری در sd card
  • نگهداری دقیق و همگام با فایل های cloud

دارای ریسک است.

راه حل های کلی برای جلوگیری از این آسیب پذیری را عبارتنند از:

  • برای استفاده از local storage می توانید از setStorageEncryption استفاده کنید.
  • برای ذخیره سازی داده در SD Card می توانید از javax.crypto استفاده کنید.
  • داده های حساس را به صورت مستقیم در shared preferences قرار ندهید.
  • هنگام استفاده از رمزنگاری کلید رمز خود را به صورت مستقیم یا به اصطلاح hardcode در کد خود قرار ندهید.
  • علاوه بر رمزنگاری داده ها به صورت پیش فرض توسط سیستم عامل، لایه دیگر رمزنگاری ایجاد کنید.
    1. SharedPreferences

برای مثال در کد زیر اطلاعات حساسی مانند نام کاربری و کلمه عبور مستقیم در shared preferences قرار گرفته

SharedPreferences sharedPref = getSharedPreferences("key", MODE_WORLD_READABLE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("username", "administrator");
editor.putString("password", "supersecret");
editor.commit();

برای جلوگیری می توان به موارد زیر اشاره نمود.

1. ذخیره <ننمودن> داده های حساس در shared preferences 2. استفاده از کتابخانه های رمزنگاری مانند Secure-preferences:

SharedPreferences prefs = new SecurePreferences(context);