📱 BondoMan - IF3210-2024-Android-YBA
Table of content:
- 📱 BondoMan - IF3210-2024-Android-YBA
📃 Deskripsi aplikasi.
Bondoman merupakan aplikasi manajemen keuangan berbasis android yang digunakan untuk mencatat transaksi yang dilakukan seseorang, baik itu berupa pengeluaran ataupun pemasukan. Aplikasi Bondoman mengizinkan penggunanya untuk melakukan aksi berikut:
- Masuk ke aplikasi
- Melakukan penambahan pengubahan, dan penghapusan
transaksi dengan sistem secara otomatis mrekam tanggal transaksi - Melihat daftar transaksi yang sudah dilakukan
- Melakukan scan nota dan menambahkan transaksi baru
hasil scan ke daftar transaksi - Melihat graf rangkuman transaksi
- Menyimpan daftar transaksi dalam format
.xls
atau.xlsx
- Mengirimkan email berupa subject dan text message, serta attatchment daftar transaksi
- Menambahkan transaksi baru secara random
- Mengambil foto dengan menggunakan twibbon
📚 Library yang digunakan.
- Core KTX:
1.12.0
- Extension kotlin untuk komponen framework utama - AppCompat:
1.6.1
- Mendukung library untuk backward-compatible version dari komponen android - Material Components:
1.11.0
- Komponen material design untuk android - ConstraintLayout
2.1.4
- Layout Manager - Legacy Support V4:
1.0.0
- Mendukung backward-compatible version dari Android Framework APIs - LiveData KTX :
2.7.0
- Observable data holder class yang lifecycle-aware - ViewModel KTX :
2.7.0
- Menyimpan data yang berhubungan dengan UI - Lifecycle Runtime KTX :
2.4.0
- Menyediakan utility lifecycle runtime - Navigation Fragment KTX:
2.7.7
- Memfasilitasi navigasi fragment - Navigation UI KTX :
2.7.7
- Membantu dalam mengaitkan navigasi ke komponen UI - POI :
5.2.5
- Java API untuk dokumen Microsoft - POI-OOXML :
5.2.5
- Memfasilitasi Office Open XML format - Concurrent Futures KTX:
1.1.0
- Extension kotlin untuk melakukan asynchronus programming - CameraX Core:
1.3.2
- Fungsionalitas utama dari operasi kamera - Camera2 :
1.3.2
- Dukungan camera2 dalam camerax - Lifecycle :
1.3.2
- Lifecycle-aware camera operations - Camera View :
1.3.2
- Implementasi preview kamera - Camera extensions :
1.3.2
- Extension untuk fitur advanced kamera - Room KTX:
2.6.1
- Extension Kotlin untuk Room - Room Compiler:
2.6.1
- Annotation processor untuk room - Location:
21.2.0
- APIs untuk fitur lokasi - Kotlinx Coroutines Android :
1.7.3
: Support asynchronus programming dengan coroutines - Retrofit :
2.9.0
- Type-safe HTTP client - Moshi Coverter :
2.9.0
- Coverter untuk JSON serialization atau deserialization - OkHttp :
4.9.0
- HTTP & HTTP/2 client - Logging Interceptor:
4.9.0
- Log untuk HTTP request dan ressponse data - Moshi:
1.14.0
- JSON library untuk Android dan Java - Moshi Kotlin :
1.14.0
- Kotlin support for Moshi - Moshi Kotlin Codegen:
1.14.0
- Codegen for Moshi - Glide :
4.12.0
- Image loading dan caching library - MPAndroidChart:
v3.1.0
: Android chart view/graph view library - Security Crypto :
1.1.0-alpha06
- Operasi kriptografi
📷 Screenshot aplikasi (dimasukkan dalam folder screenshot).
⌛️ Pembagian kerja anggota kelompok.
- Dhanika Novlisariyanti (13521132)
- Menambahkan, menghapus, mengubah transaksi
- Chart
- Twibbon
- Randomize transaction
- Made Debby Almadea Putri (13521153)
- JWT
- Network sensing
- Accessibility testing
- OWASP
- Kandida Edgina Gunawan (13521155)
- Scan transaksi
- Mengirimkan email
- Menyimpan file
⏳ Jumlah jam persiapan dan pengerjaan untuk masing-masing anggota.
- Dhanika Novlisariyanti(13521132)
- Menambahkan, menghapus, mengubah transaksi a. Persiapan: 4 jam b. Pengerjaan: 10 jam
- Chart a. Persiapan: 4 jam b. Pengerjaan: 10 jam
- Twibbon a. Persiapan: 2 jam b. Pengerjaan : 4 jam
- Randomize transaction a. Persiapan: 4 jam b. Pengerjaan: 8 jam
- Made Debby Almadea Putri (13521153)
- JWT a. Persiapan: 4 jam b. Pengerjaan: 10 jam
- Network sensing a. Persiapan: 4 jam b. Pengerjaan: 8 jam
- Accessibility testing a. Persiapan: 2 jam b. Pengerjaan: 6 jam
- OWASP a. Persiapan: 4 jam b. Pengerjaan: 8 jam
- Kandida Edgina Gunawan (13521155)
- Scan transaksi a. Persiapan: 5 jam b. Pengerjaan: 12 jam
- Mengirim email a. Persiapan : 4 jam b. Pengerjaan: 8 jam
- Menyimpan file a. Persiapan: 4 jam b. Pengerjaan: 10 jam
📸 Screenshot before after ngubah accessibility
📌 Before
📌 After
💻 OWASP Analysis
📌 Insufficient Input/Output Validation (M4)
Insufficient Input/Output Validation terjadi ketika sebuah aplikasi gagal dalam melakukan validasi dan sanitasi user input dan output sehingga memungkinkan serangan seperti injection attacks (SQL injection, LDAP injection, dll.), cross-site scripting (XSS), dan sebagainya.
Beberapa layar yang rentan terhadap hal ini adalah layar yang menerima input user seperti
-
Login Screen Pada screen ini, aplikasi menerima input email dan password user. Perlu adanya validasi format email dan password sebelum dikirim ke server. Format email mengikuti format email pada umumnya dan format password adalah minimal 8 karakter. Hal ini sesuai dengan validasi yang ada di server.
Selain itu, digunakan juga validasi dari EditText component yaitu maxLength untuk setiap input 255 karakter untuk email dan 100 karakter untuk password.
-
Create/Edit Transaction Screen Pada screen ini, aplikasi menerima input nama, nominal, kategori, dan lokasi transaksi. Validasi input disesuaikan dengan constraint pada database yaitu untuk nama maksimum 50 karakter, nominal maksimum 999999999, dan lokasi maksimum 150 karakter. Untuk kategori digunakan radio button sehingga pengguna hanya bisa memilih 2 value.
Untuk setiap input, dipastikan bahwa tidak kosong.
Aplikasi juga menggunakan API dari luar sehingga rentan terhadap serangan jika API tersebut dieksploitasi. API yang digunakan adalah
- API untuk login
- API untuk mengecek JWT
- API untuk scan struk belanja
Server API ini dapat dieksploitasi seperti malicious user mengeksploitasi API dan membuat response dari API menjadi data lain selain JSON (misal: Script). Hal ini dapat menghasilkan beberapa skenario berikut
- Aplikasi mengonsumsi response yang tidak benar tersebut dan mengeksekusinya Moshi dapat mengatasi hal ini karena jika response bukan bertipe JSON maka Moshi akan menghasilkan exception
- Aplikasi crash karena exception tersebut tidak ditangani
Oleh karena itu, kami meng-handle exception yang dihasilkan dari API calls tersebut. Handling ini dilakukan pada
/remote/ApiHandler.kt
.
📌 Security Misconfiguration (M8)
Security Misconfiguration terjadi ketika konfigurasi yang tidak baik dalam pengaturan keamanan, permissions, dan control dari aplikasi sehingga memungkinkan unauthorized access.
Beberapa tempat yang vulnerable adalah
-
Penyimpanan token JWT Penjelasan mengenai penyimpanan token JWT ada di sini
-
Intent Aplikasi menggunakan Intent untuk berkomunikasi dari komponen dengan komponen lain. Intent dapat dikirim dari aplikasi kita atau dari aplikasi lain.
Broadcast receiver pada aplikasi hanya digunakan untuk mendengarkan intent yang dikirim oleh aplikasi tersebut saja (lokal). Oleh karena itu digunakan LocalBroadcastManager dibandingkan broadcast global. LocalBroadcastManager tidak memiliki isu keamanan karena tidak ada cross-app communication.
-
Service Background service yang digunakan pada aplikasi tidak di-expose ke luar sehingga aplikasi lain tidak dapat menggunakan service tersebut. Hal ini didefinisikan pada manifest Android
📌 Insecure Data Storage (M9)
Insecure Data Storage (M9) terjadi ketika penyimpanan data tidak aman sehingga memungkinkan unauthorized access.
Aplikasi ini menggunakan token JWT untuk melakukan authorization ke screen utama. Selain itu, token JWT juga diperlukan dalam melakukan request ke server. Oleh karena itu, token JWT harus disimpan secara aman, misal mengenkripsi token sebelum disimpan sehingga jika pengguna lain dapat mengakses penyimpanan tersebut, dia tidak mendapatkan value aslinya.
Token JWT saat ini disimpan dengan menggunakan encrypted shared preferences.
Encrypted shared preferences merupakan implementasi dari SharedPreferences yang mengenkripsi key dan valuenya. Berikut merupakan screenshot dari shared preference yang menyimpan token JWT serta alamat email dari pengguna
Dari gambar di atas, key dan value terlihat arbitary karena sudah dienkripsi sehingga tidak dapat didecode oleh mata manusia.
Enkripsi menggunakan master key dan subkeys. Master key digunakan untuk mengenkripsi subkeys. Subkeys digunakan untuk mengenkripsi data asli. Master key disimpan pada Sistem Android Keystore yang memiliki mekanisme untuk membuat key lebih susah diekstrak dari device. Subkeys disimpan langsung pada shared preferences.
Enkripsi menggunakan skema AES256 yang saat ini merupakan algoritma enkripsi yang paling sering digunakan dan paling aman.
Dengan menggunakan mekanisme encryption shared preferences akan menyulitkan unauthorized user untuk mendapatkan nilai token yang asli karena hanya aplikasi yang mengetahui master key yang digunakan untuk dekripsi.