{"id":312,"date":"2015-02-27T07:39:51","date_gmt":"2015-02-27T00:39:51","guid":{"rendered":"http:\/\/sybond.web.id\/blog\/?p=312"},"modified":"2016-01-07T08:31:07","modified_gmt":"2016-01-07T01:31:07","slug":"e-money-hack","status":"publish","type":"post","link":"https:\/\/sybond.web.id\/blog\/2015\/02\/27\/e-money-hack\/","title":{"rendered":"Membedah: mandiri e-money isi ulang"},"content":{"rendered":"<p><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=id.co.bankmandiri.mandiriemoneynfc\" target=\"_blank\"><img loading=\"lazy\" class=\"alignleft\" src=\"https:\/\/lh4.ggpht.com\/vVpgVsyVoMnrwd228kRbNQyKLtN9Cxhc9dDlQa0bs4EXe_1_BHNz_sc4InFUT2lC0g8=w300-rw\" alt=\"\" width=\"115\" height=\"115\" \/><\/a><\/p>\n<p>Seperti yang pernah saya singgung pada postingan <a title=\"Let\u2019s hack! Membedah e-money Bank Mandiri\" href=\"http:\/\/sybond.web.id\/blog\/2014\/04\/23\/security-e-money-bank-mandiri\/\">sebelumnya<\/a>, memberikan aplikasi untuk layanan e-money merupakan pilihan yang bisa dibilang beresiko. Apalagi untuk proses top-up. Masalahnya tentu pada aspek security dari layanan ini tentunya.<\/p>\n<p>Sebelum terlalu dalam (karena waktu juga yang belum ada), mari kita coba dulu apakah aplikasi ini benar-benar bekerja sesuai yang dijanjikan.<\/p>\n<p>Prosesnya cukup mudah:<\/p>\n<ol>\n<li>Registrasi terlebih dahulu, seperti halnya layanan online, pengguna harus mendaftarkan e-mail &amp; set password<\/li>\n<li>NFC ON<\/li>\n<li>Tap kartu pada handset<\/li>\n<li>Aplikasi akan memunculkan informasi saldo terakhir, setelah itu muncul denominasi nilai top-up yang bisa dipilih<\/li>\n<li>Setelah memilih denom, user akan diminta untuk input nomor kartu ATM, expiry date, &amp; CVV kartu<\/li>\n<li>Selanjutnya proses authentikasi 3DS seperti biasa kode OTP akan dikirim melalui SMS; perlu dicatat bahwa tipe SMS yang dipergunakan adalah <a title=\"Some blog post describing what is class-0 SMS\" href=\"http:\/\/blog.richpollock.com\/2014\/06\/class-0-sms-messages\/\"><em>class-0<\/em><\/a>, sehingga pesan OTP hanya muncul sebagai pop-up dialog pada handset Android. Menyebabkan user harus benar-benar mengingat nilai OTP yang dikirim, untuk selanjutnya diinputkan dalam aplikasi (sebenarnya hanya menampilkan tampilan web 3DS-nya Bank Mandiri)<\/li>\n<li>Setelah proses 3DS selesai, user diharuskan untuk melakukan tap ulang kartu e-money pada handset; di sinilah proses <em>top-up<\/em> saldo offline kartu dilakukan<\/li>\n<li>Dan notifikasi akan muncul bahwa saldo e-money sudah terkredit; notifikasi juga dikirim melalui e-mail<\/li>\n<\/ol>\n<p><img loading=\"lazy\" class=\"aligncenter\" src=\"https:\/\/sybond.files.wordpress.com\/2015\/02\/screenshot_2015-02-25-14-02-13_20150227223854612.jpg\" alt=\"\" width=\"234\" height=\"417\" \/><\/p>\n<p>Setelah mencoba sendiri, rasanya aplikasi ini layak mendapat acungan jempol karena,<\/p>\n<ul>\n<li>Berjalan sesuai dengan yang diharapkan<\/li>\n<li>Inovasi layanan e-money pertama di Indonesia yang memperbolehkan mekanisme top-up melalui mobile device milik user<\/li>\n<\/ul>\n<p><strong>Lalu bagian analisa <em>security<\/em>-nya?<\/strong><\/p>\n<p><!--more-->Seperti anda memiliki dompet kemudian diberikan sebuah alat khusus untuk melakukan cetak uang asli. Walaupun harapan penyedia layanan adalah anda hanya akan bisa melakukan cetak uang sejumlah uang yang anda miliki di rekening bank, namun adakah kemungkinan untuk menerobos batasan ini?<\/p>\n<p><strong>Teknis..<\/strong><\/p>\n<p>Untuk sementara berikut analisa sekilas saya:<\/p>\n<ol>\n<li>Aplikasi pure Java\u00a0\u2014 tidak ada native code seperti aplikasi cek saldo e-money<\/li>\n<li>Tidak ada proteksi khusus terhadap command APDU\u00a0\u2014 khususnya APDU untuk cek saldo yang jika pada aplikasi cek saldo e-money diproteksi sedemikian rupa dengan native code<\/li>\n<li>Command-command APDU di-<em>populate<\/em> dari server\u00a0\u2014\u00a0ada kemungkinan sebuah\u00a0celah yang memungkinkan <em>attacker<\/em> menganalisa komunikasi command APDU dari server ke kartu melalui aplikasi ini<\/li>\n<\/ol>\n<p>Poin terakhir saya coba gali lagi, tentunya dengan tetap mempertahankan kerahasiaan jika memang celah ini benar-benar bisa dipergunakan.<\/p>\n<p>Wasalam.<\/p>\n<p><strong><span style=\"color: #333399;\">[UPDATE 2015\/03\/11]<\/span><\/strong><\/p>\n<p>Baru sempat nulis lagi.<\/p>\n<p>Analisa terkait otorisasi dengan server (mmhh.. lebih tepat server-server) menunjukan security\u00a0sudah solid, kemungkinan sudah pernah dilakukan <em>penetration testing<\/em> sebelumnya.<\/p>\n<p>Di sisi lain pada aplikasi ini sebenarnya ada sebuah &#8220;feature&#8221; yang seharusnya tidak diperlukan untuk sebuah aplikasi dalam <em>environment production<\/em>. Berikut salah satu informasi yang bisa di<em>extract<\/em> dari &#8220;feature&#8221; ini:<\/p>\n<pre class=\"lang:java highlight:0 decode:true\">{\r\n   \"body\" : \"\r\n   {\"error_code\":0,\r\n    \"message\":null,\r\n    \"activity_id\":\"c1de1df6-d075-4473-a519-332bf5319357\",\r\n    \"end\":false,\r\n    \"send_to_nfc\":true,\r\n    \"nfc_message\":\"00D600101080110914A0860125021503CC54F2FFFF\",\r\n    \"card_number\":null,\r\n    \"balance\":0.0,\r\n    \"success\":true}\",\r\n   \"status_code\" : 200\r\n}\r\n<\/pre>\n<p>Tenang, APDU <em>command<\/em>-nya ngga bisa di<em>playback<\/em> kok\u00a0\u2014 <em>sudah dicoba sebagai bagian dari test<\/em>, karena ada proses otorisasi sebelumnya yang melibatkan validasi value dari kartu dan server. Jika penasaran,\u00a0ini adalah contoh data dari server pada saat top-up sejumlah Rp100.000. Terlihat\u00a0APDU yang dikirim ke kartu\u00a0memiliki\u00a0nilai hexstring <code>.. A0 86 01..<\/code> (0x0186A0h = 100000).<\/p>\n<p>Mungkin perlu belajar\u00a0<a title=\"a paper about DPA by Paul Kocher, Joshua Ja\u000be, and Benjamin Jun\" href=\"http:\/\/www.cryptography.com\/public\/pdf\/DPA.pdf\" target=\"_blank\">Differential Power Analysis<\/a> \ud83d\ude00<\/p>\n<p>Masukan saya untuk Bank Mandiri\/vendor-nya:<\/p>\n<ol>\n<li>Hilangkan saja &#8220;feature&#8221;\u00a0ini\u00a0\u2014 pada environment SIT\/UAT boleh saja sebagai bagian proses <em>debugging<\/em>; namun untuk production? bisa menjadi celah untuk <em>exploit<\/em><\/li>\n<li><em>Encrypted<\/em> JSON? \u2014\u00a0mungkin dengan cara yang sama menggunakan RSA seperti password pada saat login?<\/li>\n<\/ol>\n<p>Demikian sementara analisa dari saya.<\/p>\n<p><strong><span style=\"color: #333399;\">[UPDATE 2016\/01\/07]<\/span><\/strong><\/p>\n<p>Akhirnya <a href=\"http:\/\/yohan.es\/\" target=\"_blank\">ada<\/a> yang mencoba <a href=\"http:\/\/blog.compactbyte.com\/2016\/01\/02\/bug-mandiri-e-money-isi-ulang-november-2015\/\" target=\"_blank\">melakukan <em>attack<\/em><\/a> dan berhasil (menurut pengakuannya \u2014 saya belum melihat dokumentasi <em>attack<\/em> ini dilakukan). Sesuai dengan analisa pertama saya bahwa memberikan fasilitas <em>debug<\/em>\/<em>logging<\/em> pada aplikasi <em>production<\/em> (sebelumnya saya hanya menyebut &#8220;<em>feature<\/em>&#8220;, karena toh sudah ada yang menulis secara detil di <a href=\"http:\/\/blog.compactbyte.com\/2016\/01\/02\/bug-mandiri-e-money-isi-ulang-november-2015\/\" target=\"_blank\">blog<\/a>) memberikan kemudahan <em>attacker<\/em> melakukan analisa alur program, terlebih lagi protokol komunikasi yang dipergunakan.<\/p>\n<hr \/>\n<p><span style=\"color: #0000ff;\">Sebagai catatan sekaligus <em>disclaimer<\/em>:\u00a0dalam tulisan ini tidak dimaksudkan untuk melakukan proses <em>reverse engineering<\/em> untuk tujuan komersil. Dan seluruh review terkait aplikasi dan desain sistem dalam tulisan blog ini dibatasi sedemikian rupa sehingga hal-hal sensitif terkait HAKI maupun ide kreatif tidak dilanggar. Jika tidak berkenan silakan contact melalui comment maupun e-mail.\u00a0<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seperti yang pernah saya singgung pada postingan sebelumnya, memberikan aplikasi untuk layanan e-money merupakan pilihan yang bisa dibilang beresiko. Apalagi untuk proses top-up. Masalahnya tentu pada aspek security dari layanan ini tentunya. Sebelum terlalu dalam (karena waktu juga yang belum ada), mari kita coba dulu apakah aplikasi ini benar-benar bekerja sesuai yang dijanjikan. Prosesnya cukup [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[78,11],"tags":[89,84,90,87,100,99],"_links":{"self":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/312"}],"collection":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/comments?post=312"}],"version-history":[{"count":18,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/312\/revisions"}],"predecessor-version":[{"id":378,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/312\/revisions\/378"}],"wp:attachment":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/media?parent=312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/categories?post=312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/tags?post=312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}