ذخیره سازی ناامن داده(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 در کد خود قرار ندهید.
  • علاوه بر رمزنگاری داده ها به صورت پیش فرض توسط سیستم عامل، لایه دیگر رمزنگاری ایجاد کنید.

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);     


Sqlite

همانطور که می دانید یک از پرکاربردترین و قدیمی ترین پایگاه داد ها برای نگهداری داده های sqlite است. فایل های با پسوند .db حاوی رکورد های این پایگاه داده است.

اتصال به پایگاه داده با نام کاربری و کلمه عبور hardcode شده در کد اتصال دارای ریسک است.

برای مثال کد زیر را در نظر بگیرید:

SQLiteDatabase notSoSecure = openOrCreateDatabase("privateNotSoSecure", MODE_PRIVATE, null);
notSoSecure.execSQL("CREATE TABLE IF NOT EXISTS Accounts(Username VARCHAR, Password VARCHAR);");
notSoSecure.execSQL("INSERT INTO Accounts VALUES('admin','AdminPass');");
notSoSecure.close();

برای جلوگیری از این آسیب پذیری می توان از کتابخانه SQLCipher به صورت زیر استفاده نمود:

SQLiteDatabase secureDB = SQLiteDatabase.openOrCreateDatabase(database, "password123", null);
secureDB.execSQL("CREATE TABLE IF NOT EXISTS Accounts(Username VARCHAR,Password VARCHAR);");
secureDB.execSQL("INSERT INTO Accounts VALUES('admin','AdminPassEnc');");
secureDB.close();

نکته مهم:

برای جلوگیری از درج کلمه عبور پایگاه داده به صورت مستقیم در کد، می توانید هنگام ورود برنامه کلمه عبور رمزنگاری شده ارتباط با پایگاه داده را با اطلاعات وارد شده از طرف کاربر رمزگشایی کنید.