Jika Anda belum membaca, sebaiknya baca dulu pengantar seri ini: Mencari dan melaporkan bug security. Perlu dicatat: bug ini sudah dilaporkan (6 bulan yang lalu), sudah diperbaiki. Posting ini hanya untuk pelajaran bersama.
Sejujurnya: Sebelumnya saya belum pernah denger aplikasi Zohib Messenger (ZM) ini. Ternyata setelah dicari-cari, aplikasi ini pernah jadi aplikasi resmi Kominfo untuk para pemudik.
Saya ringkaskan dulu bug-bug yang saya temui sebelum masuk ke bagian cerita detail:
- Username/password kita disimpan di database dalam bentuk plaintext
- SSL dengan self signed certificate, dan certificatenya tidak dicek
- Unauthenticated/sessionless API access
Karena bug terakhir ini cukup umum, saya jelaskan lebih lanjut untuk yang awam: ketika kita login, server biasanya akan mengirimkan token atau session id random, sebagai bukti siapa diri kita, dan bahwa kita diberi akses oleh server. Jadi setiap request berikutnya, kita perlu mengirimkan lagi session id atau token ini. Analoginya begini: kalau saya mau masuk komplek tertentu di sini, saya perlu memberikan ID saya, lalu saya akan diberi kartu pengunjung. Kartu ini dikenali oleh semua satpam, jadi mereka tahu saya ini pengunjung, dan satpam juga bisa membantu atau membatasi (misalnya: “mas, maaf gak boleh parkir di sini, nanti Bu Dewi nggak bisa lewat”).
Jika API sifatnya sessionless/keyless/unauthenticated, maka siapapun bisa melakukan apapun: “dapatkan contact list user X” atau “update user X dengan password Y”, tanpa memperdulikan siapa yang meminta ini. Di aplikasi tertentu, API jenis ini boleh-boleh saja, misalnya “minta cuaca Chiang Mai saat ini” (ini permintaan umum, siapapun boleh minta).
Dengan API Zohib kita bisa mengubah profile seseorang, mendapatkan dan mengubah contact list seseorang. Contoh yang bisa saya lakukan jika saya orang jahat:
- Saya remove “Papa” di contact list Anda
- Saya add account saya dengan nama “Papa” di contact list Anda, dengan foto profile dan status yang sama
- Saya minta pulsa ke Anda
- Saya dapat pulsa
- Saya kembalikan contact list seperti sedia kala
Itu contoh serangan: Papa minta pulsa.
Risna (istri saya) menemukan varian lain serangan itu: approve contact gebetan. Ketika Risna browsing review di Play Store dia menemukan ini (foto dan namanya publik jadi saya tampilkan apa adanya). Saya yakin 90% cewek ini kena serangan API accept contact:
Serangan lain tentunya bisa lebih parah, misalnya kita bisa mengirim link ke seseorang, dan jika orang tersebut percaya dengan pihak pengirim, maka dia akan mau mengklik dan mungkin menginstall trojan/malware di phone mereka.
Sebelumnya API ini bahkan memungkinkan seseorang mengganti password orang lain, tapi waktu itu API-nya selalu mengembalikan “ditolak”. Dan ternyata fungsi ganti password sedang diremove dari aplikasi.
Awalnya saya mendengar aplikasi ini karena ada joke di sebuah group chat:
Group ini kebetulan isinya orang-orang di bidang security, dan ada yang menyarankan untuk pindah saja ke buatan Indonesia: Zohib Messenger. Karena terpicu rasa ingin tahu, saya install appnya, dan saya melakukan pengecekan sangat singkat untuk tahu seberapa tingkat keamanannya dibandingkan WhatsApp atau Telegram misalnya.
Yang pertama saya lakukan hanyalah mengecek apakah storagenya aman, ini pengecekan amat sangat sederhana. Standarnya sekarang semua dienkrip, misalnya jika memakai SQLite, maka memakai SQL Cipher supaya aman. Berikutnya lagi: apakah username/password kita disimpan apa adanya. Best practice adalah: kita login, kita mendapatkan token, token itu yang dipakai untuk autentikasi semua request. Jadi password kita tidak pernah tersimpan di ponsel kita.
Hal umum berikutnya adalah: semua request haruslah https. Koneksi HTTPS harus memeriksa apakah certificate valid atau tidak. Jika tidak valid, kemungkinan koneksi dibajak. Saya sudah membuat artikel perkenalan HTTPS di sini:
https://yohan.es/security/ssl/
Sejujurnya: tadinya saya hanya memeriksa hal dasar itu saja, untuk tahu keamanan dasarnya. Tapi ketika mendapatkan laporan ini, developernya tidak merespon dengan baik. Itulah kenapa saya membuat posting Facebook ini:
JANGAN PAKE ZOHIB MESSENGER—–UPDATE: Ternyata telah terjadi kesalahpahaman awal berkomunikasi. Saya, mas James dan…
Posted by Yohanes Nugroho on Wednesday, June 17, 2015
Akhirnya untuk mendapatkan perhatian dari pihak atasan di Zohib. Saya mengecek lebih detail API-nya, dan ternyata ada kesalahan fatal menggunakan API yang tidak diproteksi. Jadi saya tambahkan diri saya ke semua “friend list” developer Zohib di aplikasi Zohib. Kalo dipikir-pikir, ini agak “kurang ajar”, tapi saya sangat membatasi serangan saya, tidak mengambil atau mengubah data lain selain contact list beberapa orang. Setelah diskusi akhirnya dicapai kesepakatan dan pemahaman bersama.
Setelah itu, pihak Zohib segera memperbaiki aplikasinya. Selama beberapa hari aplikasi ini tidak bisa diakses secara sempurna karena dalam proses perbaikan, tapi akhirnya perbaikan selesai dilakukan.
Perlu dicatat: saya tidak meminta dan tidak mendapatkan imbalan apapun. Yang saya lakukan hanya atas dasar keingintahuan saja. Saya juga memahami bahwa Zohib bukan perusahaan besar dengan dana besar dengan tim security yang hebat.
Terus terang, saya belum memeriksa lagi detail aplikasi ini sejak kejadian itu. Sekilas bug-bug yang saya temukan sudah diperbaiki. Saya tidak menggunakan app ini sehari-hari (saya meminimasi penggunaan banyak app chat sekaligus, boros batere), jadi biarlah yang lain memeriksa lebih detail. Aplikasi terbaru dari play store sudah diobfuscate dengan baik, jadi ini akan cukup mempersulit proses reverse engineering app ini.
Pelajaran yang bisa dipetik dari bug ini:
- Aplikasi Messaging merupakan hal penting dalam kehidupan digital, tapi kita tidak bisa yakin aplikasi semacam ini 100% aman, jadi berhati-hatilah dengan segala pesan di messaging system, kalo perlu konfirmasi dulu via telepon.
- Aplikasi chat populer semacam Whatsapp dan Telegram sudah dipakai jutaan orang dan direview ratusan researcher, sedangkan aplikasi Zohib meski sudah lama ada, sepertinya belum ada yang memeriksa selain saya. Jika ingin mendukung aplikasi buatan Indonesia, bantulah juga masalah securitynya. Malu dong kalo ternyata ketika dipakai di negara lain, mereka yang menemukan bugnya.
- Untuk developer: Unauthenticated API bisa dengan mudah dilihat baik melalui sniffer ataupun dengan reverse engineering, jadi jangan mengganggap bahwa hanya karena attacker tidak punya sourcenya, ini menjadi aman.
Sampai ketemu di aplikasi berikutnya.
Saya kenal Zohib dari penggagasnya langsung tahun 2014 lalu. Idenya baik tapi eksekusinya tampak buruk. Saya pernah menulis ini sebagai artikel majalah, baru bicara dari sisi skalabilitas. Kebiasaan buruk bangsa kita, nafsu besar tenaga kurang.
https://oguds.wordpress.com/2015/07/30/zohib-messenger/
Terima kasih pencerahannya. Pernah tes catfiz messenger? Besutan orang Surabaya. Jadi mau tahu juga kemampuannya 😉
catfiz yang dolo lebih banyak bug dari webset juga ada kok