Pi Zero, Roseapple Pi, Orange Pi PC, dan Raspberry PI 3

Akhir-akhir ini selain Raspberry Pi 1 & 2 yang sudah saya miliki (plus Beaglebone XM yang sudah saya punya dari dulu), saya menambah beberapa Single Board Computer (SBC) lagi.

Pi Zero

Benda pertama adalah Raspberry Pi Zero. Semestinya ini adalah SBC termurah (5 USD saja), tapi sampai saat ini setiap kali ada stock langsung habis. Beberapa penjual di eBay bahkan menjual dengan harga sampai 60 USD. Penjual online resmi juga banyak yang memanfaatkan kelarisan Pi Zero ini dengan melakukan bundling (harus membeli bersama kit yang harganya lebih dari 20 USD).

 

20151203_123110

Saya beruntung karena bisa mendapatkan Pi Zero dari majalah MagPi edisi 40. Saya segera memesan majalah ini ketika dilaunch (Majalahnya 10 USD, ongkir 5 USD).

Apa kelebihan Pi Zero ini dibanding yang lain? ukurannya lebih kecil, pemakaian dayanya lebih sedikit, dan port USBnya mendukung OTG. Dengan ini Pi Zero bisa berfungsi sebagai USB device apa saja. Misalnya bisa pura-pura jadi USB disk, USB ethernet, atau yang lain.

IMG_7044

Sebenarnya SOC yang dipakai di semua RPI hanya mendukung OTG, tapi fungsinya diset sebagai host, dan dihubungkan ke chip USB hub (yang dihubungkan ke ethernet dan juga USB port). Karena Pi Zero tidak memiliki USB hub, fungsi OTG-nya bisa dipakai.

Jika ada waktu dan belum ada yang mendahului, saya berencana mengimplementasikan ulang proyek saya ini di Pi Zero. Proyek ini cukup populer, sampai ada yang membuat Kickstarter (dan berhasil) berdasarkan ini. Continue reading “Pi Zero, Roseapple Pi, Orange Pi PC, dan Raspberry PI 3”

SSH Tunneling dan Internet Gratis

Saat ini sepertinya semua developer sudah memakai SSH sehari-hari. Sebagian mungkin sudah mengenal beberapa fitur ekstra SSH, tapi kebanyakan tidak tahu fitur lengkapnya. Wajar saja sih, meski RFC untuk SSH ini singkat (terbagi dalam beberapa dokumen), ada banyak fitur di luar RFC yang diimplementasikan oleh berbagai software SSH. Sampai-sampai ada beberapa buku yang khusus hanya membahas SSH saja.

Di tulisan ini, saya tidak akan membahas semua fitur SSH, hanya beberapa fitur yang menarik yang berhubungan dengan port forwarding, serta pembahasan bagaimana SSH ini bisa menjadi jalan untuk internet gratis atau tanpa restriksi.

Fitur paling dasar yang dikenal orang adalah login ke server lain, dan berikutnya mungkin melakukan scp atau sftp ke server lain untuk mentransfer file. Fitur menarik berikutnya adalah X11 forwarding yang untuk mengakses aplikasi GUI di server (unix) lain.
client-server

SSH mendukung multi channel dalam satu koneksi, dan ini bisa dimanfaatkan untuk TCP/IP forwarding (mengenai ini bisa dibaca di RFC 4254). Saya akan jelaskan beberapa kegunaan forwarding ini. Channel yang dibentuk oleh mekanisme forwarding ini disebut juga sebagai tunnel.

Kegunaan pertama adalah untuk mengakses sesuatu di remote system. Contohnya: kita ingin melakukan koneksi database ke suatu system remote, tapi portnya hanya terbuka untuk lokal saja. Seperti ini:

forward1

Contoh perintahnya:

ssh -L 3306:dbserver:3306 [email protected]

Di sini kita melakukan yang namanya “local port forwarding”, sebuah port akan dibuka di client untuk mendengarkan request di localhost, dan akan diforward ke sistem remote. Jadi setelah perintah tersebut dijalankan (dan selama ssh belum ditutup), kita akan bisa menggunakan program desktop kita untuk melakukan koneksi ke “localhost:3306” dan itu akan terhubung ke sistem remote.

Kegunaan berikutnya adalah agar remote system bisa mengakses sistem kita. Contohnya kita ingin mengetes koneksi ke Paypal (atau sistem eksternal lain), dan kita tidak ingin mendeploy ke server karena masih dalam tahap development.

forward2

Kita bisa melakukan ini:

ssh -R 1000:localhost:5000 [email protected]

Ini namanya “remote port forwarding”, sebuah port akan dibuka di server untuk menerima koneksi, jika ada koneksi, maka koneksi tersebut akan diforward ke sistem lokal. Dengan cara seperti ini, jika kita berpindah development dari desktop ke laptop atau pindah lokasi kerja (dari cafe satu ke cafe lain), dengan IP berbeda, kita tetap bisa mengetes dengan membuka koneksi SSH dari lokasi tersebut.

socks

OpenSSH, Putty, BitVise, dan beberapa software SSH lain memungkinan bentuk forwarding yang lain: SOCKS forwarding. Dengan socks forwarding, kita bisa memforward semua request ke remote server. Untuk memakai forwarding ini, kita perlu memakai software yang mendukung socks forwarding (misalnya Firefox mendukung ini, Chrome juga tapi butuh extension seperti Proxy Helper atau perlu command line khusus). Apa kegunaan ini? salah satunya adalah untuk mendapatkan internet yang unrestricted (bypass blocking). Kegunaan lainnya adalah supaya kita bisa dianggap berasal dari tempat lain (negara lain) sesuai tempat server berada.

Contoh perintahnya:

ssh -D 9091 [email protected]

socks2

Secara singkat bisa disimpulkan bahwa kita bisa menumpangkan protokol lain di atas SSH, tapi yang lebih menarik lagi: beberapa implementasi SSH (seperti OpenSSH, Putty dan BitVise) memungkinkan kita menumpangkan SSH di atas protokol lain. Analoginya begini: jika protokol SSH itu seperti mobil yang bisa ditumpangi orang, maka “mobil” ini juga bisa ditumpangkan di atas kendaraan lain.

overproxy
Putty dan BitVise mendukung HTTP Proxy, jadi kita bisa melakukan koneksi ke server lain melalui proxy ini. Syaratnya adalah: proxy harus menerima “CONNECT” dan mengijinkan port yang Anda tuju (konfigurasi default Squid hanya mengijinkan koneksi ke port 443, jadi tidak bisa digunakan untuk koneksi ke ssh di port 22 tanpa perubahan konfigurasi). OpenSSH lebih generik lagi: mendukung opsi yang namanya ProxyCommand.

Dengan ProxyCommand, kita bisa melewatkan SSH di atas apa saja. Sudah ada implementasi untuk melewatkan paket SSH via ICMP dan DNS. Protokol yang dipakai sangat sederhana: ssh akan menjalankan program yang disebut di opsi ProxyCommand dan akan berkomunikasi dengan program tersebut via stdin dan stdout. Untuk memakai HTTP Proxy , kita bisa memakai netcat versi openbsd (perhatikan bahwa ada banyak versi netcat):

ssh [email protected]_server -o "ProxyCommand=nc -X connect -x some-proxy:$proxy_port %h %p"

Sebenarnya kita bisa membuat sendiri program yang bisa melakukan apa yang dilakukan netcat. Seperti ini (perhatikan ada bagian yang saya comment, akan saya jelaskan nanti):

Jika ingin memakai skrip kita sebagai ganti netcat:

ssh [email protected]_server -o "ProxyCommand=python proxy.py %h %p"

SSH via DNS dan ICMP yang disebutkan di atas kadang digunakan karena bisa membypass internet gratis. Paper Mobile Data Charging: New Attacks and Countermeasures mencontohkan kelemahan konfigurasi beberapa provider 3G/4G yang memungkinkan Internet gratis dengan memanfaatkan port 53 yang biasanya dipakai untuk DNS. Perlu dicatat bahwa jika port TCP 53 diblok (hanya UDP saja), lalu semua diredirect ke DNS milik provider, tapi jika DNS provider masih melakukan dan merespon recursive query, maka SSH over DNS masih bisa dilakukan (SSH ini dilakukan dengan me-wrap paket SSH dalam paket DNS).

trick
Jika Anda kreatif, Anda bisa melewatkan SSH melalui berbagai layanan lain, misalnya bisa saja kita membuat SSH over Telegram/Line/WhatsApp (walau mungkin akan ada batasan jumlah message yang bisa dikirimkan per detik atau per menit melalui program-program messenger tersebut).

Dari penelusuran yang dilakukan di Internet, saya mendapati berbagai teknik yang disebut dengan “injek” yang ternyata merupakan header injection. Intinya: billing beberapa provider (tadinya ) bisa ditipu dengan menambahkan string tertentu setelah CONNECT sehingga seolah-olah kita melakukan koneksi ke host lain. Contohnya kira-kira seperti ini: “CONNECT namahost:port GET http://0.facebook.com Hostname: 0.facebook.com” dengan asumsi bahwa 0.facebook.com merupakan domain yang digratiskan oleh operator. Dari skrip yang saya temui di Internet, sepertinya sistem billing hanya melihat ada substring “GET domaingratis” dan menggratiskan koneksi tersebut. Dalam contoh Python sebelumnya, penambahan teks header ekstra saya comment.

Saya sendiri tidak bisa mencoba apakah berbagai macam trik tersebut masih berlaku atau tidak (posisi saya tidak di Indonesia). Sepertinya sebagian masih berlaku dengan berbagai variasi (misalnya dengan mengubah verb GET menjadi POST/OPTIONS/DELETE/PROPFIND, dsb), karena masih ada yang mengumbar keberhasilannya di Facebook. Tentunya trik semacam itu tetap butuh SSH server. Inti dari triknya adalah: kita perlu bisa mengakses satu saja server yang terhubung ke internet secara gratis, maka server itu akan menjadi batu loncatan supaya bisa mengakses konten lain.

Menurut saya kelemahan semacam itu lebih dikarenakan kemalasan saja. Secara teknis: untuk situs yang digratiskan sebaiknya selalu via HTTPS (Facebook, freebasics, dsb sudah memakai HTTPS sekarang). Jika situs gratis tidak memakai HTTPS, maka harus ada IP whitelisting. Jika proxy hanya mengecek header, tapi tidak mengecek IP server, maka kita bisa saja membuat HTTP server sendiri di port 80 yang bahkan tidak menggunakan verb CONNECT sama sekali (tapi berlaku seperti CONNECT).

Supaya lebih jelas lagi: di Linux/OSX biasanya implementasi ssh yang dipakai adalah OpenSSH (kecuali embedded Linux system yang banyak memakai dropbear), dan kita bisa dengan mudah membuat berbagai jenis proxy dengan skrip sederhana seperti di atas. Client ssh di Windows yang non command line (Putty, BitVise) hanya mendukung HTTP Proxy saja. Untuk bisa memodifikasi header, maka diperlukan tools lain, sehingga koneksinya dari SSH ke program injeksi (yang pura-pura jadi proxy server, tapi sebenarnya hanya menambah header), lalu program itu yang akan melakukan koneksi ke proxy server sebenarnya.

inject

Sedikit menyimpang dari topik utama SSH, yaitu mengenai internet gratis via operator seluler. Sebenarnya trik SSH ini bukan satu-satunya cara yang dilakukan orang. Misalnya pernah ada juga orang (vendor) yang memasang proxy gelap/tidak resmi di provider (jadi tidak ada hubungannya dengan SSH sama sekali). Tentunya ini mudah sekali dicari oleh operator (dengan port scanning ataupun monitoring jaringan).

Pernah juga kasus saya temui di mana ternyata pelanggan akan berada di satu segmen jaringan, dan pelanggan yang satu tidak diisolasi dari pelanggan lain dan traffic dari satu pelanggan ke yang lain tidak dikenai biaya. Salah satu pelanggan menghubungkan ponsel ke komputer yang juga terhubung ke internet yang unlimited. Ada yang mensetup seperti ini di rumah/kantornya nya, jadi “gratis” karena internet di server itu sudah dibayar (ada juga yang menjual koneksi internetnya ke orang lain secara murah). Saat ini sepertinya semua operator sudah mengkonfigurasi jaringannya dengan baik. Kalau Anda “gila”, Anda bahkan bisa mengirim pesan atau data via missed call.

SSH ini merupakan tool yang sangat berguna dan saya pakai setiap hari. Masih ada banyak hal lain yang bisa dipelajari yang cukup menarik tapi tidak saya bahas di sini. Jika Anda tertarik, beberapa topik yang layak dicari di Google: login dengan public/private key, file konfigurasi (.ssh/config supaya lebih gampang menyimpan berbagai opsi untuk berbagai host), opsi ControlMaster (supaya koneksi berikutnya lebih cepat), ssh-agent (supaya tidak perlu sering-sering mengetik password private key), VPN via SSH, dan escape characters.

Harga kemalasan (beberapa dollar saja)

Tulisan ini bukan tentang diskusi filosofis mengenai harga kemalasan, tapi mengenai harga komponen elektronik dari China yang begitu murah yang dalam satu hal membuat orang jadi malas, tapi dalam hal lain membuat orang jadi rajin.

Waktu belajar elektronik sekitar 2007, harga berbagai kit elektronik masih mahal. Beberapa tahun kemudian, Arduino mulai populer (terutama yang UNO), tapi masih sedikit clonenya, dan harganya yang resmi masih sekitar 30-65 USD/board belum termasuk ongkos kirim. Arduino jadi sekedar alat belajar dan prototyping, tidak untuk implementasi akhir. Ketika ingin men-deploy yang sudah kita buat, biasanya kita akan memprogram sebuah chip Atmega yang dibeli terpisah untuk menghemat karena harga sebuah chip Atmega hanya beberapa dollar saja, apalagi jika yang kita buat itu tidak terlalu penting, misalnya komponen mainan.

Fast forward tiga tahun yang lalu: clone Arduino UNO sudah sampai titik harga 9.9 USD. Dan setahun belakangan ini bahkan bisa didapatkan dengan harga sekitar 3 USD saja termasuk ongkos kirim.

Sekarang harga clone Arduino udah murah banget. Satu board harganya 2.87 USD dengan ongkir 1.37 USD. Ongkir ini per…

Posted by Yohanes Nugroho on Wednesday, January 28, 2015

Sekarang malas sekali memprogram chip microcontroller jika hanya ingin memakainya di rumah, pakai saja langsung Arduino Uno-nya, lalu beli lagi yang baru. Jika butuh yang ukuran lebih kecil (misalnya mungkin karena ingin dimasukkan mainan, sedangkan Uno terlalu besar) maka kita bisa membeli versi Pro Mini, yang harganya sekitar 17 USD untuk 10 board. Untuk produksi massal, tentunya microcontroller saja tanpa board akan tetap lebih murah dan reliable.

Bukan cuma microcontroller dalam bentuk clone Arduino, tapi hampir semua komponen elektronik lain dijadikan shield atau modul. Jumlah jenis modul yang tersedia juga semakin banyak, contohnya: ada sensor suhu, kelembaban, kualitas udara, alkohol, gas berbahaya, ultrasonik, kamera, dsb. Ada juga berbagai output: motor, servo, suara (bahkan MP3), LCD, LED RGB, Laser, dsb.

20160131_090115 (1)

Continue reading “Harga kemalasan (beberapa dollar saja)”

9th Wedding Anniversary

Sejak tahun lalu sampai sekarang, banyak hal yang kami alami dan syukuri. Setelah tahun sebelumnya mobil kami ditabrak, akhirnya kami sudah membeli mobil baru. Di saat Risna hamil, kami sempat pulang ke Indonesia, Eyang kakung dan putri sempat datang ke sini dua kali tahun lalu, Opung juga bisa datang menyambut kelahiran Joshua.

IMG_0029

Jonathan tumbuh dengan baik dan sehat, sekarang sudah masuk Foundation dan tahun ini rencananya akan masuk Grade 1. Kemampuan bahasa Thai Jonathan berkurang, dan bahasa Inggrisnya meningkat dengan baik. Dia juga semakin lucu secara verbal. Contohnya setelah melihat Doraemon episode di mana Suneo diculik, saya menjelaskan agar dia selalu berhati-hati ketika di mall atau tempat umum (dia mulai suka lari-lari sendiri), saya jelaskan juga kalau nanti kita bayar penculiknya nanti duit kita habis, Jonathan membalas “mungkin penculiknya punya kembalian? jadi duit kita gak abis”.

Joshua juga tumbuh dengan sangat cepat, bahkan sekarang beratnya sudah melebihi normal (11kg di usia 8 bulan), tapi karena dokter bilang tidak apa-apa, kami tidak merasa khawatir. Meski sering diganggu oleh Jonathan, Joshua sangat senang kalau diajak main oleh Jonathan.

Kami bersyukur atas segala berkat dan penyertaan Tuhan sepanjang hidup kami dan sepanjang pernikahan kami. Kami masih punya banyak rencana ke depan, kiranya kami masih diberi umur panjang dan bisa banyak berkarya.

20160124_142600-2

Sebulan memakai printer 3D

Sesuai dengan niat saya sebelumnya, saya menuliskan update setelah sebulan memakai 3D printer.

Hardware

Beberapa minggu pertama printer 3D saya letakkan di luar kamar saya karena kamar ngoprek saya sudah terlalu penuh. Akhirnya saya merapikan kamar saya selama liburan, dan sekarang sudah bisa masuk kamar. Karena posisinya sudah tetap, saya mensetup OctoPrint di Raspberry Pi saya dengan kamera. Ketika membeli, saya hanya diberi dua filamen: PLA merah dan ABS hitam, saya sudah memesan dan menerima filamen PLA putih.

Saya sudah mengidentifikasi masalah utama printing sebelumnya dengan PLA: underextrusion (ini tidak terjadi di filamen ABS yang saya miliki). Ini akhirnya saya selesaikan dengan kombinasi software (mengeset kecepatan print agar lebih rendah) dan mengolesi filamen dengan minyak goreng. Saya agak curiga filamen merah yang diberikan paketnya agak bermasalah karena kelembaban. Seperti yang saya ceritakan sebelumnya, rollnya (bagian hitamnya) pecah di tengah, jadi mungkin plastiknya tidak kedap udara. Menurut yang saya baca, filamen PLA tidak bisa disimpan lama di tempat yang lembab.  Percobaan dengan filamen PLA putih yang baru tidak butuh minyak dan hasil printnya lebih bagus dengan setting yang sama.

Karena poros spool PLA merah pecah, saya memprint penahan supaya spool ini bisa dipakai tanpa harus menguraikan filamen secara manual (tadinya saya tahan dengan benda yang ada di sekitar, tapi ribet jika perlu digeser).

penahanpenahan1

Continue reading “Sebulan memakai printer 3D”

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