Bug Gojek (Agustus 2015)

Tulisan berikut ini ditulis akhir bulan Desember 2015. Saya sudah mengirimkan ini ke pihak Gojek dan mereka minta waktu untuk perbaikan. Mereka meminta saya menunda sampai tanggal 10 Januari 2016 untuk menerbitkan ini.

Karena saya sudah mengecek bug gojek dua kali (Agustus dan Desember 2015), saya tidak mengecek lagi apakah bug-bug ini saat ini masih ada atau tidak (capek lah ngecek terus, ini kan kerjaan iseng gak dibayar). Tulisan ini tidak diedit lagi (jadi jika Anda membaca “saat ini bug masih ada” artinya itu masih ada ketika tulisan ini dibuat, yaitu akhir Desember 2015).

Yang perlu saya tambahkan: bug yang ada kemungkinan bukan hanya yang saya tulis di bawah ini, masih ada banyak lagi (ada puluhan endpoint API gojek, banyak yang berpotensi punya bug). Karena saya berlokasi di Thailand, saya hanya bisa melakukan testing terbatas (bahkan saya belum pernah mencoba memakai Gojek secara langsung). Silakan coba-coba untuk memeriksa bagi yang iseng mencoba (saya sudah membuat tulisan bagaimana melakukan Reverse Engineering APK Android sebagai panduan bagi pemula).

—————-

Jika Anda belum membaca, sebaiknya baca dulu pengantar seri ini: Mencari dan melaporkan bug security. Perlu dicatat: bug ini sudah dilaporkan (akhir sejak Agustus 2015). Sebagian sudah diperbaiki, tapi banyak lagi belum. Bug ini juga sudah ditemukan banyak orang lain (saya sempat melempar pertanyaan ini di facebook wall saya, dan hasilnya saya dijapri beberapa orang).

Gojek

Bug ini saya temukan sekitar Agustus 2015. Pihak Gojek cukup responsif dalam menanggapi laporan saya, walaupun ternyata banyak yang tidak diperbaiki hampir 5 bulan kemudian. Saya juga diberi kredit 1 juta rupiah, yang saya berikan ke adik saya, tapi beberapa bulan kemudian sistem gojek error, dan saldonya jadi nol.

Saya hanya mempelajari aplikasi gojek versi Android, tapi karena backend-nya sama, maka bug-bug ini berlaku untuk iOS juga. Bug utama gojek adalah: API request tidak menggunakan session, dan berikutnya adalah: tidak ada batasan siapa yang bisa mengupdate data.

Data yang bocor

Summarynya kira-kira seperti ini:

  • Siapapun bisa mencari customer ID berdasarkan telepon atau nama atau email
  • Siapapun bisa mengubah pulsa driver gojek manapun
  • Siapapun bisa melihat data pribadi driver gojek, termasuk foto, alamat, dan bahkan nama ibu kandung
  • Siapapun bisa mendapatkan nama user, email, no HP user lain
  • Siapapun bisa mengganti no HP dan nama user lain, tanpa perlu tahu passwordnya
  • Siapapun bisa melihat order history orang lain

Order history gojek cukup komprehensif: dari mana, ke mana lewat route mana, driver mana yang mengambil penumpang, dsb. Jika pesanannya adalah makanan, maka makanan yang dipesan dan harganya juga bisa dilihat.

Ini adalah contoh dimana saya melihat aplikasi ini dari sisi iseng: pengen tau seberapa banyak hal yang dilakukan oleh app mobile, dan seberapa banyak yang ditangani server. Ketika mulai melihat bahwa aplikasi ini tidak menggunakan session management untuk menandai bahwa yang melakukan request adalah user yang sudah login, maka saya mulai curiga bahwa data akan bocor.

Dan ternyata memang benar: data pribadi seseorang yang bocor banyak sekali. Ternyata salah seorang rekan saya sudah pernah menemukan ini tapi belum ditindaklanjuti karena pihak gojek masih membuat sistem mereka lebih stabil, dan ternyata bug ini sudah ada cukup lama.

Di sini saya sebenarnya agak merasa bimbang: apakah sebaiknya cepat-cepat diberitahu ke publik, bahwa mungkin ada orang yang mencuri data diri Anda (terutama puluhan ribu driver gojek yang data lengkapnya gampang diakses). Atau tunggu dulu, kasihan ini startup baru. Kalau buru-buru diumumkan, tapi belum diperbaiki, siapapun bisa membuat skrip untuk memporak-porandakan seluruh data-data user dan driver. Bayangkan jika ada leak seperti Ashley-Madison.

Saya sendiri sebenarnya akan merasa risih Andaikan nama, nomor telepon, alamat rumah saya, alamat tujuan saya naik gojek bisa diakses siapa saja di Internet. Tapi karena saya nggak tinggal di Indonesia, jadi saya tidak benar-benar merasakan itu.

Akhirnya saya memutuskan untuk menunggu saja. Salah satu alasan saya adalah: waktu itu banyak orang merasa positif dengan keberadaan Gojek, dan driver maupun penumpang sangat diuntungkan (karena adanya sistem referral), tidak seperti beberapa bulan terakhir di mana ada banyak drama.

Saya lupa tepatnya kapan, akhirnya sistemnya diganti, URL yang ada banyak yang dipindah ke /v2/. OAuth juga ditambahkan. Perlu diperhatikan: setelah titik ini, saya belum memeriksa lagi apakah ada bug baru. Saya asumsikan mereka sudah menyewa pentester untuk memastikan bahwa kali ini semua baik-baik saja.

Ternyata ketika saya coba lagi sebelum posting artikel ini, sebagian besar bug yang ada ternyata belum diperbaiki. Token OAuth disimpan, tapi tidak dipergunakan di semua request berikutnya.

Bug seperti ini juga menunjukkan betapa pentingnya security di startup Anda: Andaikan ada orang yang iseng/jahat/iri, startup Anda sudah bisa gulung tikar dengan kebobolan seperti ini.

Teknis

Sekarang masuk ke teknis yang agak detail. Secara teknis bug ini mudah sekali ditemukan, mudah dieksploitasi. Agak sulit diperbaiki karena ketika server diupdate, semua client harus diupdate sekaligus. Gojek sudah banyak mengubah URL ke versi 2 dan 3, Saya hanya akan menggunakan URL versi 1, supaya nggak semua orang berusaha menghack Gojek dengan URL yang saya berikan.

Siapapun bisa mengubah pulsa driver gojek manapun, ini dilakukan dengan melakukan POST ke https://api.gojek.co.id/gojek/drivers/ dengan data baru yang ingin kita update. Selain pulsa (jumlah pendapatan driver), info-info lain juga bisa diubah. Untungnya bug update ini sudah diperbaiki di URL yang baru, walau kita tetap bisa melihat info ini.

Siapapun bisa melihat data pribadi driver dengan melakuan GET ke https://api.gojek.co.id/gojek/drivers/ID. Lucu kan kalo kita naik gojek, terus bilang: mas, anaknya mak Amah kan? titip salam dari emak. ID driver bisa dengan mudah didapatkan dari history order user. Seharusnya info yang bisa diakses user dibatasi.

Siapapun bisa mendapatkan nama user, email, no HP user lain. Selain dengan melakukan search by name/email, kita juga bisa melakukan bruteforce sekuensial mulai dari: https://api.gojek.co.id/gojek/customer/543000000

search

Siapapun bisa mengganti no HP, email, dan nama user lain, tanpa perlu tahu passwordnya. Bug ini masih ada dan sangat parah: kita bisa mentake over user account orang lain.

Siapapun bisa melihat order history orang lain dengan request GET ke https://api.gojek.co.id/gojek/booking/history/CUSTID.

ceo

Di bulan Agustus, Gojek mulai memiliki daftar restoran, berupa nama, lokasi, jam buka, dan sebagainya. Data-data ini pun tadinya gampang sekali diubah. Sekarang kita tetap bisa melihat data-data tesebut.

Referral

Hal pertama yang merugikan pihak gojek adalah masalah sistem referral. Sistemnya cukup sederhana: user B bisa memasukkan user ID user A sebagai pihak referrer. User B akan mendapatkan 50 ribu, dan user A akan mendapatkan 50 ribu juga ketika B naik gojek pertama kali. API request yang dikirimkan sangat sederhana:

Tidak ada verifikasi bahwa user B sudah login, dan bahwa user B yang memasukkan user A.

Masalahnya adalah: ID user yang dihasilkan berurut, user baru akan memiliki ID yang tidak jauh dari user lama. Dengan membuat skrip, kita bisa meng-assign semua user baru, supaya referalnya adalah kita.

Sekitar sebulan atau dua bulan setelah saya laporkan ini, mulai ada orang yang memanfaatkan bug ini. Mereka menawarkan isi pulsa gojek dengan harga miring. Setelah kejadian ini, Gojek mendisable account yang nilai pulsanya di atas sejuta.

Tidak sulit

Faktor-faktor yang membuat eksploitasi ini gampang adalah:

  • Gojek tidak melakukan obfuscation terhadap APK Android, jadi mudah dilihat apa saja yang dilakukan di sisi client.
  • Server sangat baik hati, tidak ada rate limiting untuk berbagai request. Bahkan ada fitur “paging”, misalnya bisa minta satu halaman berisi 100 info driver gojek, lalu kita bisa minta halaman berikutnya. Mendownload puluhan ribu driver gojek bisa dilakukan sangat cepat.
  • Penamaan API endpoint sangat konsisten (bagus), jadi mudah ditebak, misalnya jika ada findByCustomerId, maka kemungkinan ada findByEmail atau findByName.

Perbaikan

Perbaikan untuk berbagai bug tersebut sudah jelas: pertama harus ada session management. Ketika login, server akan menghasilkan session yang random. Setiap kali request sesuatu, server perlu mengecek session yang aktif. Dari session tersebut, server bisa membatasi akses.

Penutup

Berhati-hatilah menshare info Anda pada sebuah aplikasi. Ini mengingatkan saya pada serial TV CSI Cyber (yang menurut saya aktingnya sangat aneh, dan teknologinya dilebih-lebihkan), tapi topik yang diangkat cukup masuk akal dan up to date. Misalnya kisah aplikasi transport yang dihack ada di Episode Killer En Route.

Sebagai informasi: bug-bug ini sudah diketahui luas, kemungkinan besar jika Anda memakai Gojek (atau sebagai driver Gojek), info Anda sudah disalin orang lain. Semoga posting ini mendorong pihak gojek untuk segera memperbaiki layanannya, karena sepertinya jika tidak dipublish, perbaikan akan lambat dilakukan, dan fitur baru lebih diutamakan.

Twitter: @yohanes

72 thoughts on “Bug Gojek (Agustus 2015)”

  1. Analisanya bagus om.. Saya sebagai developer aja ga kepikiran buat test security app sendiri, si om malah keren bisa analisa punya orang lain.
    Anyway salam kenal ya om

  2. dengan membaca tulisan anda..
    ini berarti harus ada perbaikan besar-besaran.. ngak cuma aplikasi apk/ios nya.. tetapi dari sisi server..

    tidak hanya masalah programing yg jadi masalah (coder).. ini masalah tester juga.. kalau ngelihat dari fakta yg anda jabarkan disini.. ini tampaknya developernya tidak mengefektifkan testernya.. atau lebih parah list testingnya tidak optional..

    untuk mencegah hal-hal tak di inginkan.. bisakah anda menginfokan kepada pihak terkait bahwa tulisan ini sudah di publish dan itu sudah sesuai dengan permintaan menunda dari mereka.. mungkin akan lebih baik menunjukkan email/data yang memberi tahu bahwa anda dilarang menginfo sebelum tgl 10 januari 2016..

    tambahan.. semua file gambar yg di upload wajib kasi bookmark agar tidak di klaim orang

    1. Sepertinya testing cuma dilakukan untuk app usage. Tidak ada security testing sama sekali.

  3. Saya sedang mengembangkan aplikasi android tentunya menggunakan API sebagai jembatannya. tentunya ini hal yang cukup kurang baik, sekelas go-jek yg developernya berjubel seperti itu tidak menganalisisnya dan itu kurang baik. Nanti kalau aplikasi yg saya bikin sudah jadi minta dianalisis ya om. barang x analisis saya masih kurang bagus dan menjadi pencerahan buat kami kedepannya. 😀

  4. Kalau aplikasi Tokopedia ada bugnya ga om? Lumayan kan kalau ada, bisa belanja apa aja bebas.

  5. Analisa yg keren, harusnya dapat reward dari Go-Jek ini, berkali lipat dari reward 1jt yg pernah diberikan. Kalau perlu di-hire utk tester hehehe….

    Keren Om…keep it up

  6. Salam kenal om, saya mau tanya tentang point 2, kebetulan sya jg backend developer dan sebagian API yg saya buat d consume mobil dan frontend sprti angular. Cmn dalam case ini sya selalu pisahin penamaan prefix API. Untuk point Server sangat baik hati, tidak ada rate limiting untuk berbagai request. Bahkan ada fitur “paging”, misalnya bisa minta satu halaman berisi 100 info driver gojek, lalu kita bisa minta halaman berikutnya. Menurut pengalaman om sndiri limiting request ini d tentukan dr sisi apa aja ? Request client ke API kah d batasi atau seperti apa baiknya ?

    1. Request dari client bisa dibatasi per token. Ada banyak cara implementasi ini (search saja “API rate limiting”).

  7. Yang lebih memprihatinkan lagi, konon CTO Go-Jek adalah seorang Security Researcher.
    duh!
    Perusahaan berbasis teknologi tapi duit dari VC cuma dibakar buat marketing sama penambahan fitur baru

  8. good article pak. sisi lain gojek. semoga seluruh startup ketika mendevelop aplikasi tidak hanya mementingkan availability-nya, tapi ada sisi security-nya confidential dan intergrity..konsepnya si gitu katanya..hohoho..

  9. Kebetulan ane dapat broadcast ginian (mungkin Go-Jek akan memperbaiki bugs tersebut) :
    Guys, ada yg berminat jadi java programmer di GOJEK? atau ada kenalan?
    requirement: java, web services (jruby, golang), linux
    salary : 10-12jt for senior programmer
    benefit : gojek credits, allianz, jamsostek, training ke india selama 2 minggu
    lokasi : jakarta
    contact : [email protected]

    Siapa tau ada yg berminat hehehe…

  10. Artikel yang Bagus, sy suka bahasannya.
    Untuk penamaan endpoint, mereka menggunakan human languange seperti itu. Itu menyebabkan mudah untuk di eksploitasi bahkan untuk orang awam sekalipun. Karena bisa d tebak tebak. Menurut Bapak sendiri, lebih baik seperti apa? Untuk kita developer sendiri menggunakan penamaan yg mudah d mengerti itu akan memudahkan kita juga kan untuk maintenance dsb.
    Saya pribadi, jika sy tidak membaca artikel bapak, bisa menganggap hal ini spele. Setelah membaca, d benak saya “wah benar juga ya”. What if, what if, what if, but if… bermunculan.
    Menurut Bapak sendiri?

    1. Ya sebenernya masalahnya bukan di penamaan,
      tapi karena mereka ga obfuscate code-nya sebelum di-compile.
      Padahal itu kan standard practice apalagi buat mobile app.

  11. artikelnya menarik,khusus untuk mobile application penggunaan web service Dan json data untuk pertukaran information masih membutuhkan security tambahan terutama oleh developernya (tidak dicomot asal-asal teknik programming ),perlu research lebih sebelum diimplementasikan.Penggunaaan Session di web juga membutuhkan skills programming yg expert sebelum di implementasikan…saya tebak developernya lebih mementingkan loading data yg cepat dibandingkan security dan algoritma web…

  12. Saya sudah prediksi kalo app Go-Jek memang sebenarnya sangat rapuh. Beberapa konsumen juga sudah mengeluhkan pencurian data privasi. Semoga saja app-app lain segera sadar 🙂 .. Makasih analisanya mas, keren.

  13. semenjak pertama launching gojek ane udah ragu disegi privacy… mudah2n ke depan masalah security mjd perhatian yg utama dalam menciptkan aplikasi yg online.. salam kenal dari aceh

  14. Terima kasih sharingnya pak yohanes 🙂
    Analisanya keren dan bisa menjadi inspirasi utk testing apps sejenis lainnya. Artikel yg sangat berguna utk pengembang aplikasi, developer, customer & driver gojek.
    Salam,
    dnastudio

  15. Cool mas, idealnya security itu memang harus sejak tahap requirement definition. Dan programmer gak boleh ngeluh krn kerjaannya jadi banyak, pun user bisnis jgn ngeluh juga karena durasi project nya jadi panjang. Klo sudah begini yg rugi kan usernya juga.

  16. Sdh ada anouncement di FB Gojek, kalo dinihari akan ada Maintenance Server dari pukul 00:00 sampai pukul 02:30 wib katanya… 🙂 🙂

  17. Paparan anda terlalu vulgar Om, jadi Andaikan ada orang yang iseng/jahat/iri , ya itu Anda sendiri!!!. Heran kok banyak orang pinter yg salah arah. Soalnya ini lapak hidup orang kecil yg menggantungkan hidup pada bisnis ini, ada cara yang lebih baik ETIKA dibanding sok pamer begini
    , saya lebih menghargai http://sybond.web.id/ yg tidak terlalu expose penemuannya ke publik, mungkin krn ada etika yg dijaga.
    *Programer itu mengaku sudah mengetahui bug aplikasi GoJek di Android dan iOS sejak Agustus 2015 dan telah memberitahu pihak GoJek. Namun karena perbaikan dari GoJek dirasa lambat, maka ia pun mempublikasikan tulisannya itu.

    1. Pantesan traffic blog naik significant :))

      Saya pun akan bereaksi sama (meng-expose ke public) kalo lama tidak digubris. Tapi ada benarnya untuk tidak terlalu “vulgar” untuk alasan tertentu.

  18. Analisa nya keren bgt om.. lugas mudah dimengerti.. dan ini bermanfaat bgt..

  19. Saya juga berpikir gojek mempunyai banyak bug om, terlebih lagi kalo aplikasinya di “extract” akan banyak kelihatan bug(s) nya, saya rasa bukan hanya gojek saja, aplikasi lain jg banyak bug nya.

  20. Kayaa.a starup indonesia harus bner” matang klo buat program aplikasi , masih untung blum bnyak yg ngbobol klo ad yg iseng bsa hancur dong !!!

  21. Bagus mas temuannya, tp kl menurut saya api naming mudah ketebak itu gapapa, karena memang standarnya begitu, yg salah hanya di sekuritinya. Bagaimanapun juga yg namanya api harus ada autentikasi bukannya plong kaya begini. Hehe..

  22. Mantap om lanjutkan untuk terus analisis apps di indo gak cuma gojek saja… Untuk indonesia yang lebih baik lagi…

  23. Sepertinya banyak developer yang merasa aman asal aplikasinya dalam bentuk binary (security by obscurity). Padahal selama ada informasi yang keluar dari aplikasi (misal harus berkomunikasi dengan system call OS) pasti ada cara untuk mengcapture datanya. Di linux bisa pakai strace, jadi sekalipun aplikasinya pakai C tetep bisa di capture komunikasi jaringannya.
    Seharusnya mindset dalam security adalah sistem harus tetap secure sekalipun harus melewati link yang tidak secure.

  24. waduh ngeri banget, bijimana itu data kalo dijual ke pihak ketiga? Gojek beneran palu gada yee skrg. “Apa yang lu perlu gw ada”

  25. analisis yang keren dan sangat berguna. saya sendiri sedari lama sudah uninstall apps go-jek karena curiga masalah sekuriti dan saat itu masih unstable banget. sayang banget ya, padahal go-jek banyak banget manfaatnya.

    tertarik untuk analisis aplikasi ‘karya anak tetangga’ pak? buat komparasi dan buat pemecut biar anak bangsa bisa berkarya lebih baik lagi.

  26. Pedoman umum yg berlaku adalah keamanan sebanding dengan aset (yg diamankan). Nah, sekarang valuasi gojek sendiri berapa? Banyak pihak yg menghitung valuasi Gojek sudah di kelas trilyun. Jadi ‘security in mind’ sudah merupakan pakem yg harus dipatuhi. Apalagi ini menyangkut proses bisnis perusahaan, transaksi keuangan dan aset berharga nasabah (seperti data pribadi dan uang). Naiknya nilai dan transaksi perusahaan harus secepatnya diikuti langkah pengamanan yg cukup. Tidak perlu berumit-rumit, sediakan saja anggaran untuk audit keamanan oleh pihak luar yg terjamin, profesional dan berkompeten.

    Barangkali ini penyakit ya, bahwa aplikasi ‘versi 1’ adalah mengutamakan fungsionalitas dan mengabaikan keamanan. Asal berjalan dulu, kekurangan akan diperbaiki di versi berikutnya. Tidak heran bila kesalahannya sangat elementer, misalnya tidak ada session-id (cmiiw). Kesalahan yg bisa diatasi hanya dengan mengalokasikan 1 orang pegawai untuk meng-audit security. Padahal kita tidak tahu efek rusaknya pembiaran itu bakal seperti apa. Beruntung ada hacker kerah putih seperti Yohannes Nugroho yg memberikan masukan dan sekaligus ‘peringatan’ kepada pengembang dan publik.

    Btw, terima kasih atas idenya soal lobang-lobang keamanan ini, mulai dari Zohib, Mandiri e-Pay, hingga Gojek. Ini bakal menjadi bahan tulisan artikel di majalah. Lumayan dapat 1 lembar tulisan. 🙂

      1. Mas klo cara buka akun di suspend bagaimana yah…??skr byk driver yg tiba-tiba akun nya di suspend bahkan ada yg sudah 4x suspend nya

        Mohon pencerahannya
        Terima kasih

  27. Indonesia… dimana privasi sepertinya tidak terlalu “penting”..

    Kalo ada orang jahat dan nekat? bukan gak mungkin valuasi triliyunan jadi 0 rupiah dalam sehari..

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.