Insecure Data Storage Vulnerabilities – Android

Avatar photo

Insecure Data Storage atau Penyimpanan Data yang Tidak Aman adalah salah satu masalah keamanan yang sering ditemukan dalam pengembangan aplikasi Android. Masalah ini terjadi ketika data sensitif seperti informasi pribadi pengguna, kata sandi, token otentikasi, dan sebagainya disimpan secara tidak aman pada perangkat. Berikut adalah beberapa tempat penyimpanan yang sering digunakan di Android dan risiko yang terkait :

1. Shared Preferences

  • Description : Shared Preferences digunakan untuk menyimpan data dalam pasangan kunci-nilai (key-value pair).
  • Risk : Data disimpan dalam bentuk teks biasa (plaintext) di file XML di dalam direktori penyimpanan aplikasi. Data ini bisa diakses oleh aplikasi lain jika perangkat di-root atau jika ada kerentanan lainnya.
  • Insecure Code :
SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("username", "user123");
editor.putString("password", "mypassword");
editor.apply();

2. Internal Storage

  • Description : Internal Storage digunakan untuk menyimpan file yang hanya dapat diakses oleh aplikasi itu sendiri.
  • Risk : Meski lebih aman daripada penyimpanan eksternal, data tetap bisa diakses jika perangkat di-root. Data sensitif tidak dienkripsi secara default.
  • Insecure Code :
String filename = "myfile.txt";
String content = "Sensitive data here";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(content.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}

3. External Storage

  • Description : External Storage adalah penyimpanan yang bisa diakses oleh semua aplikasi dan pengguna, biasanya berupa SD card atau penyimpanan sekunder lainnya.
  • Risk : Data yang disimpan di sini bisa diakses oleh aplikasi lain dan pengguna lain. Data tidak dienkripsi secara default dan sangat rentan terhadap pencurian data.
  • Insecure Code :
String filename = "myfile.txt";
String content = "Sensitive data here";
File file = new File(Environment.getExternalStorageDirectory(), filename);
try {
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(content.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}

4. SQLite Database

  • Description : SQLite adalah database lokal yang sering digunakan untuk menyimpan data aplikasi dalam bentuk tabel.
  • Risk : Data disimpan dalam bentuk plaintext di dalam file database di penyimpanan internal. Jika perangkat di-root atau file database dibaca oleh aplikasi lain, data sensitif dapat terekspos.
  • Insecure Code :
SQLiteDatabase db = this.openOrCreateDatabase("MyDatabase", MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS Users (username VARCHAR, password VARCHAR);");
db.execSQL("INSERT INTO Users (username, password) VALUES ('tegalsec', 'mypassword');");

Exploiting the Insecure Data Storage

Untuk praktiknya, saya menggunakan aplikasi Damn Insecure Vulnerable Application (DIVA) (https://github.com/payatu/diva-android)

Practical #1

Step 1 : Decompile the App

Untuk melihat bagaimana aplikasi menyimpan data, kita perlu mendekompilasi aplikasi tersebut. Kita dapat menggunakan jadx untuk melakukan dekompilasi.

Dari kode di atas, kita memahami bahwa Diva menggunakan PreferenceManager untuk menyimpan data plaintext.PreferenceManager’ menyimpan data dalam format XML pada path aplikasi.

Step 2 : Input Credential

Masukkan beberapa data acak ke dalam aplikasi untuk melihat bagaimana data tersebut disimpan.

Step 3: Access Stored Data

Aplikasi mana pun yang memiliki akses root dapat membaca informasi sensitif tersebut. Untuk melihat informasi sensitif, pergilah ke:

data/data/jakhar.aseem.diva/shared_prefs/jakhar.aseem.diva_prefernces.xml

Remidiation

Gunakan EncryptedSharedPreferences API atau algoritma enkripsi lainnya untuk menyimpan informasi sensitif. Dengan menggunakan cara ini, informasi sensitif akan dienkripsi sehingga lebih aman dari akses yang tidak sah.

Practical #2

Step 1 : Decompile the App

Gunakan JADX untuk mendekompilasi aplikasi.

Step 2: Input Credential

Masukkan kredensial ke dalam aplikasi.

Step 3: Read file in Database

Untuk membaca file dari database, pindah ke sistem file aplikasi:

data/data/jakhar.aseem.diva/databases

Dari file database, kita dapat melihat bahwa kredensial disimpan dalam plaintext.

Remidiation

Gunakan SQLCipher untuk menambahkan kemampuan enkripsi ke SQLite, atau enkripsi data sensitif menggunakan algoritma kriptografi yang aman sebelum menyimpannya ke dalam basis data. Dengan menggunakan cara ini, data sensitif akan terenkripsi dan lebih aman dari akses yang tidak sah.

Practical #3

Step 1 : Decompile the App

Gunakan JADX untuk mendekompilasi aplikasi.

Step 2: Input Credential

Masukkan beberapa data acak untuk melihat bagaimana aplikasi menyimpan data sensitif.

Step 3: Read File

Lihat file yang disimpan oleh aplikasi.

Remidiation

Gunakan algoritma hash seperti MD5 atau SHA1 untuk mencegah penyimpanan data plaintext. Dengan menggunakan hashing, data akan terlindungi dengan lebih baik karena tidak dapat diubah kembali menjadi plaintext dengan mudah.

Total
0
Shares
Leave a Reply

Your email address will not be published. Required fields are marked *

Previous Post

Hacking Risks in Android Content Providers

Related Posts