- Discord, sebuah aplikasi desktop berbasis Electron, secara internal berjalan sebagai jendela Chromium sehingga alat pengembang web bisa dibuka, dan melalui itu modifikasi kode sisi klien dimungkinkan
- Beberapa klien mod dan plugin membuka sebagian fitur yang memerlukan langganan berbayar Nitro dari sisi klien
- Inti metodenya adalah menyuntikkan modul yang dipecah dengan code splitting Webpack ke variabel
webpackChunkdiscord_appuntuk menelusuri dan mengganti fungsi internal - Fungsi pemeriksaan kualitas screen sharing hanya divalidasi di klien sehingga bisa dilewati, tetapi untuk tema premium ada verifikasi sinkronisasi server tambahan yang ikut bekerja
- Semua teknik demo merupakan pelanggaran terhadap ketentuan penggunaan Discord dan membawa risiko penangguhan akun serta pencurian akun akibat menjalankan kode yang belum terverifikasi
Gambaran umum
- Ada banyak klien Discord mod yang mengubah tampilan atau menambahkan fitur, dan beberapa plugin bahkan membuka fitur yang memerlukan langganan berbayar Nitro
- Artikel ini menjelaskan prinsip teknis yang memungkinkan hal tersebut melalui analisis struktur klien
Mengaktifkan alat pengembang
- Discord dikembangkan dengan framework Electron untuk membuat aplikasi lintas platform menggunakan teknologi web, sehingga mirip dengan situs web yang berjalan di dalam browser web
- Pada dasarnya ini adalah jendela Chromium, jadi alat pengembang bisa dibuka, tetapi secara bawaan dinonaktifkan
- Pemblokiran ini dilakukan karena ada banyak kasus akun dicuri setelah pengguna menempelkan perintah berbahaya akibat rekayasa sosial dari pelaku ancaman
- Jika memahami risikonya, fitur ini bisa diaktifkan dengan menambahkan nilai
trueuntukDANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOINGdi file konfigurasi%appdata%/discord/settings.json- Setelah itu, jalankan konsol pengembang dengan
ctrl + shift + i
- Setelah itu, jalankan konsol pengembang dengan
Melakukan patch pada fungsi Discord
- Untuk mengoptimalkan pemuatan awal, kode dipecah menjadi beberapa chunk dan dimuat secara paralel atau secara tunda (lazy-loaded), menggunakan fitur code splitting dari Webpack
- Semua chunk yang sudah dimuat disimpan di variabel
webpackChunkdiscord_app - Untuk menjalankan kode yang menggunakan variabel atau fungsi Discord, kode harus disuntikkan (inject) ke variabel ini
a.cadalah objek yang berisi semua modul, dan setiap modul terdiri dari bentukchunk_id,loaded,exportsexportsberisi fungsi, objek, dan nilai primitif yang diekspor modul
- Dengan membuat fungsi
findyang menelusuri banyak modul JavaScript, fungsi tertentu bisa dicari lalu dipanggil- Contoh: mencari lalu memanggil fungsi
getCurrentUser()
- Contoh: mencari lalu memanggil fungsi
- Fungsi asli juga bisa diganti (replace) dengan fungsi lain untuk mengubah perilakunya, sehingga modifikasi kode secara langsung dimungkinkan
Membuka streaming kualitas tinggi
- Semua isi setelah titik ini jelas melanggar ketentuan penggunaan Discord dan bisa berujung pada penangguhan akun, jadi risikonya harus ditanggung sendiri
- Dua fungsi,
canStreamMidQualitydancanStreamHighQuality, yang memeriksa tingkat langganan pengguna dipanggil tepat sebelum layar pemilihan kualitas screen sharing ditampilkan- Jika nilai balik kedua fungsi itu dipaksa menjadi
true, pilihan screen sharing resolusi asli 60 FPS bisa dipilih meski tidak berlangganan Nitro
- Jika nilai balik kedua fungsi itu dipaksa menjadi
- Saat ini Discord tampaknya tidak memverifikasi di server apakah stream yang dikirim benar-benar mematuhi batasan untuk pengguna tanpa langganan
- Namun Discord masih belum menggunakan End-to-End encryption, jadi kemungkinan pendeteksian tetap ada
- Menurut tulisan rujukan, Discord sudah memeriksa konten audio dan video pengguna, dan di masa depan bisa menambahkan verifikasi sisi server sebelum screen sharing dimulai
Membuka tema premium
- Jika nilai fungsi
canUseClientThemes, yang menentukan apakah pengguna boleh memakai tema Nitro, diubah menjaditrue, tombol pemilihan tema premium akan terbuka - Namun tema hanya diterapkan sesaat lalu segera kembali ke tema default
- Ini terjadi karena klien mencoba menyimpan perubahan tema, tetapi server memverifikasi bahwa pengguna tidak punya izin, lalu saat respons diterima tema default diterapkan kembali
- Jika fungsi
shouldSyncdi-patch agar mengembalikanfalsesaat nilainyaappearance, sinkronisasi pengaturan tampilan bisa diblokir dan perubahan tema tetap bertahan - Karena tema sepenuhnya dikelola di sisi klien dan CSS juga selalu bisa dimodifikasi langsung, akan sulit bagi Discord untuk mencegahnya
Kesimpulan
- Ada kode yang membuat peretasan yang didemonstrasikan mudah diterapkan, tetapi penting untuk sangat berhati-hati sebelum memodifikasi klien atau menggunakan mod
- Discord dapat menangguhkan akun yang melanggar ketentuan penggunaan kapan saja, dan menjalankan kode yang belum terverifikasi dengan akses ke akun sangat berbahaya
- Pesan yang dienkode dalam tulisan: "Jangan tempelkan kode ke konsol pengembang jika Anda tidak memahaminya — itu cara termudah untuk membuat akun Anda dicuri"
1 komentar
Pendapat Hacker News
Kalau caranya hanya dengan menjalankan blob yang dienkode base64 sederhana di bagian akhir untuk mengaktifkan semua fitur, rasanya itu bisa menjadi vektor serangan yang cukup mudah
Bukan berarti saya mencurigai penulisnya, dan setelah baru saja saya decode, ternyata saya kena dikerjai
base64 --decode, hasilnya begini:// Here's a cake if you thought about inspecting the code before executing it:let css = 'font-size: 36px; font-weight: bold; color: red';console.log("%cNEVER paste code you don't understand into the development console.", css);console.log("%cThis is the best way to compromise your account.", css);“Saat ini Discord tampaknya tidak memverifikasi di server apakah stream yang dikirim benar-benar mematuhi batasan untuk non-pelanggan”, jadi saya penasaran siapa yang menganggap ini implementasi yang bagus
Validasi sisi klien benar-benar terlihat seperti kesalahan pemula
Selama beberapa tahun memakai Discord, ini pertama kalinya saya mendengar ada upaya untuk melewati struktur hak akses Nitro, dan kalau bukan sesuatu yang tersebar luas, rasanya tidak ada alasan untuk terlalu memikirkannya
Terpisah dari itu, bulan ini saja saya sudah mulai pekerjaan baru yang kelima, dan sepertinya saya memang tidak cocok dengan para manajer proyek
Saya bertanya-tanya ada berapa banyak orang yang memahami hack semacam ini sekaligus bersedia membayar Nitro. Mungkin ada ribuan, atau bahkan puluhan ribu, orang yang memakai berbagai mod klien Discord yang mengaktifkan sebagian atau semua fitur Nitro, tetapi saya ragu berapa besar pendapatan nyata yang muncul jika ini diblokir
Secara pribadi, kalau saya butuh atau menginginkan fitur itu, jauh lebih tidak merepotkan membayar 10 dolar per bulan. Itu lebih baik daripada terus mengikuti mod yang akan rusak setiap kali Discord diperbarui, sambil berharap maintainer tidak menyisipkan kode berbahaya
Kanalnya hanya disembunyikan di sisi klien. Supaya jelas, tetap saja isi pesan di kanal itu tidak bisa dilihat
Server suara hanya mengecek ke API apakah pengguna punya izin masuk, lalu setelah itu bertindak seperti broadcaster paket satu-ke-banyak
Ini lebih dekat dengan hacker klasik dalam arti orang yang penasaran dan terampil
Tidak ada kerugian serius, dan ini mengingatkan kembali bahwa aplikasi bukan sihir dan kode itu keren
Supaya mereka bisa mencoba memeras lebih banyak uang dari kita tanpa perlawanan
Sebagai pengingat lagi, semua yang Anda kirim ke Discord, termasuk DM, dicatat oleh Discord dalam bentuk plaintext dan bisa diakses oleh Discord serta pihak yang membeli perusahaannya
Dulu sempat terlihat Microsoft akan membelinya, dan sekarang tampaknya mengarah ke IPO
Sekadar memiliki akun saja sudah menormalkan percakapan pribadi yang mudah ditambang datanya untuk AI atau digunakan oleh Discord serta administrator database/sistemnya. Section 702 dari FISA Amendments Act (FAA702) memungkinkan lembaga investigasi federal mengakses data seperti itu bahkan tanpa surat perintah
Potensi front-running kripto saja rasanya bisa bernilai puluhan juta dolar per hari
Kalau Anda teman, jangan menyarankan teman memakai sistem chat yang bukan terenkripsi end-to-end. Jangan menjadi madu di dalam perangkap
Itu wajar kecuali Anda memakai segelintir layanan yang menerapkan model zero trust sungguhan dengan kunci yang dikelola sendiri oleh pengguna. Alasan pesan disimpan adalah agar pengguna bisa mengaksesnya lagi
Ada layanan seperti Matrix yang berhasil menyediakan messaging grup terenkripsi end-to-end dengan cara yang relatif ramah, tetapi itu lebih merupakan pengecualian. Tidak adil menuduh Discord secara khusus jahat hanya karena melakukan hal yang sama seperti 95% platform komunikasi elektronik selama ini
Bukan berarti itu bagus, tetapi di beberapa komunitas tidak ada pilihan selain tidak ikut serta
Ini bahkan lebih buruk daripada masa “semua orang memakai WhatsApp”. Saat itu kita punya nomor pihak lain sehingga mudah menghubungi lewat cara lain, tetapi daya tarik Discord bukan percakapan pribadi, melainkan komunitas dengan ruang semi-publik. Di sini, publik bukan berarti terbuka untuk semua orang, melainkan lebih seperti dibaca sekitar 100 orang
Kalau pesan dihapus, pesan itu tidak lagi tersimpan di database
Baru-baru ini OpenAI tiba-tiba menonaktifkan Discord untuk beta tester, sehingga kami tidak lagi bisa melihat dengan siapa dan apa yang kami diskusikan
Saya bertanya-tanya apakah ada cara mengekspor chat agar admin server bisa menelusuri arsipnya dan komunitas tidak terputus satu sama lain begitu saja
Ada cukup banyak ekstensi Chrome untuk mengekspor chat Discord, tetapi kebanyakan tampaknya mengunci sebagian fitur di balik pembayaran
Ternyata sangat mudah menyalin source ekstensi dari folder Chrome, mengubah pemeriksaan boolean seperti
is_prodi JavaScript, lalu memuatnya kembali sebagai ekstensi unpackedIni program mandiri yang memakai API dengan cara nonstandar, tetapi sejauh ini saya belum melihat ada orang yang diblokir karena menggunakannya
Memang mereka sudah benar memperingatkan bahwa memakai trik seperti ini bisa membuat akun diblokir, tetapi apakah Discord pernah punya preseden memblokir pengguna karena hal semacam ini?
Mereka juga melarang penggunaan klien alternatif. Kalau akun Anda penting, sebaiknya jangan mengutak-atik Discord
“Modifikasi klien melanggar Ketentuan Layanan Discord.”
Namun Discord cukup acuh terhadap hal ini, dan tidak ada kasus yang diketahui tentang pemblokiran hanya karena memakai mod klien. Jadi secara umum Anda akan baik-baik saja selama tidak memakai plugin yang menerapkan perilaku penyalahgunaan. Tidak perlu khawatir, karena katanya semua plugin bawaan aman
Saya bisa memahami kalau sebagian tema diaktifkan dengan cara seperti ini, tetapi cukup sulit dimengerti mengapa kualitas streaming ditentukan lewat pemeriksaan sisi klien, bukan sisi server
Tidak perlu mengakses video sebenarnya; meskipun sepenuhnya terenkripsi, dari jumlah data yang dikirim bisa diketahui kualitas apa yang sedang digunakan untuk streaming
Prinsip agung rekayasa frontend sekali lagi terbukti benar
“Jangan pernah, sungguh jangan pernah, mempercayai klien”
Sejak melihat bahwa ini bisa ditangani hanya di sisi klien, saya terus memakai developer tools dan menyalakan tombol streaming 1080p60, dan itu benar-benar berfungsi
Saya tidak tahu sudah berapa tahun, tetapi tampaknya tidak ada seorang pun di pihak Discord yang peduli
Dulu saya pernah mencoba menempuh jalan ini, tetapi akhirnya menyerah karena tidak menemukan cara untuk mem-patch klien secara konsisten, terutama setelah pembaruan
Namun setelah melihat metode ini, dorongan untuk “membongkar dan mengutak-atiknya” muncul lagi
Apakah ada cara sederhana untuk menelusuri API yang tersedia dengan metode ini? Saya pernah mencoba mencatat semuanya, tetapi terlalu berantakan karena map, internasionalisasi, dan sebagainya. Saya penasaran apakah ada orang yang sudah bersusah payah membuat semacam dokumentasi reverse engineering