{"id":155,"date":"2014-04-23T17:25:26","date_gmt":"2014-04-23T10:25:26","guid":{"rendered":"http:\/\/sybond.web.id\/blog\/?p=155"},"modified":"2014-12-24T08:00:11","modified_gmt":"2014-12-24T01:00:11","slug":"security-e-money-bank-mandiri","status":"publish","type":"post","link":"https:\/\/sybond.web.id\/blog\/2014\/04\/23\/security-e-money-bank-mandiri\/","title":{"rendered":"<del>Let&#8217;s hack!<\/del> Membedah e-money Bank Mandiri"},"content":{"rendered":"<p><img loading=\"lazy\" class=\"alignleft\" src=\"https:\/\/lh5.ggpht.com\/1SfmtFZu-vSqtIPsFP5MAltxytHy8g4fkMWMpKX3vX1BYn-fURMqLE2WfPZnxiUkjg=w300-rw\" alt=\"\" width=\"300\" height=\"300\" \/><\/p>\n<p>Kenapa e-money Bank Mandiri? Ada beberapa alasan mengapa saya penasaran dengan keamanan produk e-money ini.<\/p>\n<ol>\n<li><del>Saat ini produk e-money yg ada di dompet saya<\/del><\/li>\n<li>Saat ini produk e-money yg meluncurkan aplikasi reader (<a title=\"mandiri e-money info di Play Store\" href=\"https:\/\/play.google.com\/store\/apps\/details?id=noi.mandiri.emoney\" target=\"_blank\">mandiri e-money info<\/a>)<\/li>\n<\/ol>\n<p>Dari <span style=\"text-decoration: line-through;\">dua<\/span> alasan tersebut saya coba mem-&#8220;bedah&#8221; keamanan untuk produk e-money tersebut. Kenapa?\u00a0Saya pikir memberikan aplikasi pembaca kartu seperti memberikan kunci yang patah untuk mengintip isi sebuah kotak yang dikunci dengan gembok. Pertanyaan selanjutnya apakah kunci patah tadi hanya bisa untuk mengintip saja? atau bahkan bisa membuka isi kotak?<\/p>\n<p>Jika belum <em>mudeng<\/em> maksud analogi saya di atas, ada analogi lain: bayangkan anda akan masuk ke sebuah rumah yang memiliki dua lapis pintu. Di balik pintu pertama terdapat ruang tamu dengan foto-foto harta benda yang berada di dalam rumah itu. Di balik pintu kedua kemungkinan kita bisa menemukan harga yang sebenarnya. Di depan rumah tersebut ada pelayan yang bertugas hanya mengantar anda untuk masuk rumah melewati pintu pertama. Pelayan tersebut membawa beberapa kunci, bisa jadi salah satu kunci yang lain merupakan kunci untuk memasuki pintu kedua.<!--more--><\/p>\n<p><strong>Mari kita cari tahu..<\/strong><\/p>\n<p>Anggap saja aplikasi mandiri e-money info itu adalah pelayan tadi. Pelayan ini bisa membuka pintu pertama yaitu informasi saldo dalam kartu e-money.<\/p>\n<p><strong>Teknis..<\/strong><\/p>\n<p>Aplikasi mandiri e-money info merupakan aplikasi Android yang akan berjalan di atas Dalvik VM. Format executable Dalvik (yang biasa dikenal sebagai format <code>.dex<\/code>) tidak lebih sama dengan Java bytecode (atau <code>.class<\/code> file). Jaman awal-awal Android dulu saya sempat terpesona dengan ide\u00a0Dan Bornstein yaitu menyederhanakan bytecode Java kedalam format baru Dalvik ini.<\/p>\n<p>Namun pada akhirnya VM tetaplah VM. Keamanan sebuah sourcecode dipertanyakan, karena akan mudah dalam merubah bytecode Java ke bentuk source code nyaris sesuai dengan aslinya.<\/p>\n<p><strong>Oke, ini kan .dex bukan .class<\/strong><\/p>\n<p>Tidak masalah, <code>.dex<\/code> bisa dengan mudah diconvert ke bentuk <code>.jar<\/code> atau <code>.class<\/code>. Mari coba kita intip file <code>.apk<\/code> dari mandiri e-money info ini dengan aplikasi 7zip.<\/p>\n<pre class=\"lang:default mark:3,4 decode:true\">...\r\n2013-10-09 16:31:54 .....         4632         1245  res\\layout-xlarge\\main.xml\r\n2013-10-09 16:31:52 .....        60824        27475  classes.dex\r\n2013-09-03 19:01:54 .....        13432         5348  lib\\armeabi\\libmandirinfc.so\r\n2013-10-09 16:31:54 .....        10915         3889  META-INF\\MANIFEST.MF\r\n2013-10-09 16:31:54 .....        10968         4071  META-INF\\CERT.SF\r\n2013-10-09 16:31:54 .....         1504         1145  META-INF\\CERT.RSA<\/pre>\n<p>Sekilas dari isi file <code>.apk<\/code> terlihat selain <code>classes.dex<\/code> terdapat pula <code>libmandirinfc.so<\/code>. Oke, ini menantang. Kenapa? karena ternyata beberapa bagian code aplikasi ini ditulis dengan <em>native library<\/em> (<a title=\"Android NDK\" href=\"https:\/\/developer.android.com\/tools\/sdk\/ndk\/index.html\" target=\"_blank\">NDK<\/a>). Yang artinya untuk mengintip <em>logic<\/em> dibalik code perlu analisa lebih jauh dengan <em>disassembler<\/em>, atau proses <em>reverse engineering<\/em> yang sesungguhnya (IMHO).<\/p>\n<p>Sangat cerdas, tapi perlu diperhitungkan keefektifan metode ini jika diimplementasikan dengan VM. Karena Dalvik tidak jauh dengan Java, maka Dalvik juga mengenal dengan JNI. Ini adalah implementasi Java untuk dapat memanggil atau berinteraksi dengan fungsi-fungsi dari sebuah <em>native library<\/em>.<\/p>\n<p>Maksud saya efektif adalah setiap <em>native library<\/em> harus punya<em> exported function(s)<\/em> atau<em> variable(s)<\/em>. Yang harus didefinisikan secara jelas dalam source java-nya. Dengan begitu setidaknya ada bagian dari<em> native library<\/em> yang &#8220;mudah&#8221; terekspos. <em>Attacker<\/em> dapat menganalisa parameter apa saja yang dilempar dari <em>native library<\/em> ke java <em>vice versa<\/em>.<\/p>\n<p><strong>Mari kita lihat lebih jauh..<\/strong><\/p>\n<p>Setelah menganalisa <code>classes.dex<\/code>, dapat di ambil beberapa java class yang berfungsi sebagai definisi java untuk <em>native library<\/em> yang dipergunakan. Berikut adalah potongan source hasil analisa:<\/p>\n<pre class=\"lang:java decode:true\">package noi.mandiri.util;\r\npublic class xxx\r\n{\r\n  static\r\n  {\r\n    System.loadLibrary(\"mandirinfc\");\r\n  }\r\n  public static native String appID();\r\n  public static native byte[] commandAPDUforBalance();\r\n  public static native byte[] commandAPDUforNumber();\r\n  public static native byte[] commandAPDUforPrepaid();\r\n  public static native String ivKey();\r\n  public static native String sKey();\r\n}<\/pre>\n<p>Dapat disimpulkan, native library tadi melempar beberapa parameter berupa <code>array byte<\/code> dan <code>string<\/code>. Dari nama fungsi dapat diketahui apa kira-kira data array byte tersebut. \ud83d\ude00<\/p>\n<p>Kembali ke analogi sebelumnya tentang pelayan. Saya sengaja tidak menjabarkan secara detil mengenai hasil exploit saya. Tapi intinya dapat disimpulankan bahwa jawaban dari pertanyaan di awal sudah terjawab. Yaitu ternyata pelayan tadi hanya memegang kunci pintu pertama. Kunci-kunci yang lain ternyata hanya kunci <em>dummy<\/em>. Syukurlah \ud83d\ude42<\/p>\n<p><strong>Saran perbaikan untuk pengembang Bank Mandiri<\/strong><\/p>\n<ol>\n<li>Proteksi java sourcecode dengan obfuscator<\/li>\n<li>Proteksi export function name dengan merubah nama fungsi native library<\/li>\n<li><del>Atau bahkan porting semua ke NDK, dan menyisakan java hanya untuk UI (jika memungkinkan)<\/del> Since\u00a0NDK has no access to NFC at all, except by means of calling back into Java code<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Kenapa e-money Bank Mandiri? Ada beberapa alasan mengapa saya penasaran dengan keamanan produk e-money ini. Saat ini produk e-money yg ada di dompet saya Saat ini produk e-money yg meluncurkan aplikasi reader (mandiri e-money info) Dari dua alasan tersebut saya coba mem-&#8220;bedah&#8221; keamanan untuk produk e-money tersebut. Kenapa?\u00a0Saya pikir memberikan aplikasi pembaca kartu seperti memberikan [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[78,10],"tags":[89,88,90,87],"_links":{"self":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/155"}],"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=155"}],"version-history":[{"count":18,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/155\/revisions"}],"predecessor-version":[{"id":203,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/posts\/155\/revisions\/203"}],"wp:attachment":[{"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/media?parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/categories?post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sybond.web.id\/blog\/wp-json\/wp\/v2\/tags?post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}