Kasus Peretasan 700 Juta Akun Electronic Arts
(battleda.sh)- Kombinasi dokumen Swagger yang terekspos pada API autentikasi dan gateway EA serta kegagalan validasi izin pembaruan persona memungkinkan data akun pengguna lain hingga alur login terdampak
- Intinya, permintaan PUT ke
/identity/pids/{pidId}/personas/{personaId}dapat diakses dengan scopedp.client.defaultmilik klien OAuth EA Desktop biasa, sementara pemeriksaan kepemilikan atas pidId di body dan personaId di path tidak memadai - Penyerang dapat menggabungkan perubahan nama pengguna persona, pengaturan status
BANNED, pemindahan persona, pencarian ID persona akun tersembunyi, dan bypass login berbasis persona Xbox hingga mencapai login web akun - Dampaknya mencakup pencurian nama pengguna dan sebagian data game, pemblokiran akses game online, bypass ban game, hingga login ke akun EA melalui Xbox, dan tingkat keparahannya dinilai CVSS 10.0
- Kerentanan ini dilaporkan ke EA pada 16 Juni 2024; EA mengklasifikasikannya sebagai critical pada 25 Juni, lalu mendistribusikan patch dari 8 Juli hingga 8 Oktober, termasuk pemeriksaan kepemilikan persona dan penghapusan dokumentasi
Paparan dokumentasi API yang berawal dari lingkungan autentikasi EA
- Titik awalnya adalah pengujian lingkungan pengembangan integration yang ditemukan di EA Desktop
- API autentikasi produksi adalah
accounts.ea.com - Host autentikasi integration adalah
accounts.int.ea.com
- API autentikasi produksi adalah
- Di lingkungan integration, access token berotorisasi dapat diperoleh, lalu pencarian dokumentasi yang terekspos dimulai untuk memeriksa API apa saja yang dapat diakses dengan token tersebut
- Endpoint autentikasi berada di balik reverse proxy; format respons 404 untuk path
/connectdan path umum/berbeda, dan headerserveradalahistio-envoy /connect/api-docsmengembalikan 404 kosong, berbeda dari path/connectlainnya, sehingga terlihat kemungkinan routing ke layanan terpisah; di/connect/api-docs/index.jsonditemukan dokumentasi Swagger 1.1- Dokumentasi Swagger menunjuk ke
/api-docs/connect, lalu dikonversi denganswagger-codegen-climenjadi spesifikasi OpenAPI 3.0 dan diperiksa di Swagger UI lokal
Daftar API internal yang terungkap di Gateway
- EA Desktop menggunakan API GraphQL bernama “Service Aggregation Layer”, tetapi SAL di lingkungan integration berada di balik firewall
- API gateway di
gateway.ea.comyang tampaknya merupakan versi lama menggunakan endpoint berformatproxy/{service}/{route} gateway.int.ea.com/proxy/api-docs/index.jsonmengembalikan daftar dokumentasi untuk lebih dari 80 layanan- Mencakup berbagai layanan seperti
addresses,agerequirements,billing,commerce, dan lainnya
- Mencakup berbagai layanan seperti
- Setiap dokumen API diunduh, dikonversi ke spesifikasi OpenAPI terbaru, lalu fungsi yang dapat diakses diperiksa
- Beberapa endpoint mengembalikan data “projects” terkait tim game EA, membutuhkan scope izin
basic.domaindata, dan klien di produksi yang memiliki scope tersebut juga ditemukan- Data contoh memuat game Star Wars yang dibatalkan dan entri Apex Legends yang ditampilkan dengan nama grup terkait
Titanfall3
- Data contoh memuat game Star Wars yang dibatalkan dan entri Apex Legends yang ditampilkan dengan nama grup terkait
- Di lingkungan integration juga terdokumentasi cara memberikan entitlement game kustom, tetapi kegunaannya rendah karena layanan integration yang diperlukan untuk mengunduh dan bermain berada di balik firewall
- Ada juga endpoint yang mengembalikan Xbox Live Server Token, tetapi tidak diteliti lebih jauh karena sandbox ID-nya bukan
RETAIL
Informasi akun produksi dan struktur persona
- Setiap endpoint dalam dokumentasi menampilkan scope autentikasi yang diperlukan, dan pemeriksaan berfokus pada endpoint yang dapat diakses dengan klien OAuth produksi
/identity/pids/memengembalikan informasi umum akun- Termasuk nilai email yang dimasking, status email, sebagian tanggal lahir, negara, bahasa, status akun, versi persyaratan, waktu pembuatan, perubahan, dan autentikasi terakhir, serta apakah 2FA aktif
/identity/pids/me/personasmengembalikan daftar persona yang terhubung ke akun- Akun EA dasar menggunakan namespace
cem_ea_id - Akun eksternal yang terhubung seperti Steam dan Xbox juga ditampilkan sebagai persona masing-masing
- Akun EA dasar menggunakan namespace
- Game umumnya dapat menyimpan data seperti statistik dan inventaris di bawah persona, sehingga data dapat dipisahkan per platform
- Selanjutnya, persona di namespace
cem_ea_iddisebut sebagai persona “Origin”
Kerentanan inti: kegagalan validasi izin pembaruan persona
- Endpoint
/identity/pids/{pidId}/personas/{personaId}menerima permintaan GET, PUT, dan DELETE - Permintaan PUT mengizinkan scope
dp.client.defaultdandp.server.default, sementara klien autentikasi EA Desktop biasa memilikidp.client.default - Body permintaan dapat menerima
displayName,namespaceName,status,statusReasonCode,lastAuthenticated,nickName,pidId, dan lainnya - Permintaan PUT untuk mengubah
displayNamepada persona Origin milik sendiri berhasil, dan nama pengguna di situs web akun EA berubah- Permintaan ini melewati cooldown perubahan nama pengguna dan verifikasi email perubahan nama pengguna
- Perubahan
namespaceNametidak berdampak - Nilai
statusyang mungkin adalahACTIVE,DISABLED,PENDING,DELETED,BANNED; ketika status persona Origin sendiri diubah menjadiBANNED, EA Desktop masih dapat digunakan, tetapi login game diblokir - Masalah yang lebih besar adalah pidId di body permintaan dapat diganti menjadi ID akun lain
- Permintaan untuk memindahkan persona Steam milik sendiri ke akun EA teman berhasil
- Setelah itu, pemindahan kembali ke akun sendiri juga dimungkinkan
Verifikasi login dan percobaan XSS
- Setelah memindahkan persona Steam milik sendiri ke akun teman lalu mencoba login ke situs web EA dengan Steam, muncul verifikasi email berbasis lokasi baru dan perangkat tidak tepercaya
- Sebagian email yang ditampilkan bukan milik peneliti, sehingga alur untuk login ke akun teman telah tercapai, tetapi terhenti pada tahap 2FA berbasis lokasi
- Permintaan untuk mengubah nama pengguna persona menjadi bentuk
BattleDash <script>alert(1)</script>juga berhasil - Alert berjalan di halaman koneksi akun, sehingga XSS dimungkinkan
- Jika pengguna yang sedang login ke akun EA diarahkan ke halaman koneksi tersebut, kode dapat dijalankan di browser dan sesi dapat diekstrak
Manipulasi langsung persona akun lain
- Untuk memeriksa apakah
personaIddi path juga kurang memiliki validasi kepemilikan, percobaan perubahan nama pengguna dilakukan dengan ID persona yang tidak dimiliki sendiri - Setelah memperoleh ID persona akun uji baru, permintaan untuk mengubah nama pengguna akun tersebut tanpa autentikasi korban berhasil
- Dengan cara yang sama,
statusdapat diubah menjadiBANNED, dan akun tersebut tidak lagi bisa login ke game /identity/personasmencari persona berdasarkandisplayNamedan mengembalikan ID persona, ID akun, tanggal pembuatan, dan waktu login terakhir- Namun, pengguna yang menyembunyikan akunnya tidak ditampilkan
/identity/namespaces/{namespace}/personasmencari dalam namespace tertentu dan hanya mengembalikan nama pengguna serta ID persona, tetapi juga mengembalikan akun tersembunyi- Dengan endpoint ini saja, ID persona yang diperlukan sudah dapat diperoleh
Batasan pemindahan persona dan pengambilalihan akun parsial
- Saat mencoba memindahkan persona Origin pengguna lain ke akun sendiri, muncul error
TOO_MANY_PERSONAS_FOR_NAMESPACE- Penyebabnya, akun sendiri sudah memiliki persona Origin
- Dengan asumsi akun yang mendaftar melalui konsol bisa saja hanya memiliki persona platform tersebut dan tidak memiliki persona Origin, akun konsol digunakan untuk menghindari konflik namespace
- Setelah memindahkan persona Origin akun uji ke akun konsol, persona Origin korban dapat dipindahkan ke akun sendiri
- Dalam kondisi ini, saat login, nama pengguna korban, statistik game non-cross-platform, dan sebagian detail akun lainnya ditampilkan
- Saat login sebagai akun korban, muncul alur “Finish setting up my account” yang meminta pemilihan nama pengguna seolah membuat akun baru
- Entitlement, teman, dan data penyimpanan game cross-platform modern seperti Battlefield 2042 disimpan pada akun EA itu sendiri, bukan pada persona, sehingga tidak ikut ditransfer
- Meski begitu, penyerang tetap dapat melakukan ban pengguna, bypass ban game, pencurian nama pengguna, dan menyandera data akun
Bypass login menggunakan persona Xbox
- Pada kondisi sebelumnya, tindakan yang bisa dilakukan adalah memindahkan persona linked account milik sendiri ke akun EA sembarang, memindahkan persona sembarang ke akun sendiri, serta melakukan ban persona dan perubahan nama pengguna
- Saat memindahkan persona sendiri untuk login sebagai akun pengguna lain, verifikasi email muncul
- Karena tidak pernah melihat prompt 2FA saat memainkan game EA di konsol, login berbasis token Xbox/PSN diperiksa
- Dokumentasi Nexus Connect API memuat cara mengirim token Xbox/PSN, dan dari alur login PSN di situs EA diperoleh PSN client ID untuk mencoba login token PSN
- Login token PSN membuat persona namespace
ps3dan memungkinkan login akun tanpa 2FA, tetapi klien yang memilikidp.client.defaulttidak dapat menangani namespaceps3 - Setelah menambahkan header
X-Include-Namespaceke/connect/tokeninfo, terlihat bahwa ada daftar namespace persona yang dapat dimanipulasi per klien OAuth- Contoh
JUNO_PC_CLIENTmencakup namespacecem_ea_id,steam,epic,xbox
- Contoh
- Namespace Xbox diizinkan, tetapi karena tidak dapat membuat token Microsoft XSTS yang valid untuk game secara manual, pengujian dilakukan di Xbox sungguhan
- Akun Microsoft baru dibuat, persona Xbox dihubungkan ke akun EA uji, lalu persona Xbox tersebut dipindahkan ke akun korban
- Saat login ke situs web EA dengan akun Xbox, verifikasi email lokasi baru muncul; namun setelah menginstal Battlefield 2042 di Xbox dan login ke game, akses masuk ke akun korban berhasil
- Setelah itu, login ke situs web EA dengan akun Xbox yang sama juga berhasil tanpa verifikasi email, hingga login web akun korban tercapai
Cakupan dampak dan tingkat keparahan
- Ada dua jalur utama yang dapat digunakan penyerang
- Memindahkan data persona orang lain keluar dari akunnya untuk mencuri nama pengguna dan data game
- Memindahkan persona Xbox milik sendiri ke akun korban, login ke game EA di Xbox, lalu setelah jaringan menjadi tepercaya, login ke situs web EA dengan akun Xbox
- Dampak tambahan juga besar
- Persona orang lain dapat diberi ban sehingga mencegah sebagian besar permainan online
- Nama pengguna orang lain dapat diubah lalu diambil alih
- Karena ban game diproses sebagai penonaktifan entitlement game di seluruh akun, ban game dapat dibypass dengan memindahkan persona ke akun baru
- Alur ini dapat dilakukan tanpa interaksi pengguna, terutama melalui satu endpoint API
- Tingkat keparahannya dinilai CVSS 10.0 berdasarkan
AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Jadwal perbaikan dan komentar lanjutan
- Kerentanan dilaporkan ke EA pada 16 Juni 2024
- EA mengirim konfirmasi pada 25 Juni 2024 dan menetapkan tingkat keparahan critical
- Jadwal patch adalah sebagai berikut
- 8 Juli 2024: Patch 1 dirilis, persona ownership check
- 18 Juli 2024: Patch 2 dirilis, detail tidak diketahui
- 6 September 2024: Patch 3 dirilis, detail tidak diketahui
- 10 September 2024: Patch 4 dirilis, penghapusan dokumentasi
- 8 Oktober 2024: Patch 5 dirilis, detail tidak diketahui
- Perkiraan awal EA menyebut perbaikan bisa memakan waktu hingga akhir tahun, dan ada penilaian bahwa pada kasus yang intinya berupa dokumentasi terekspos dan satu endpoint tidak aman, patch sementara yang lebih cepat seharusnya lebih diutamakan
- EA belum memiliki program bug bounty, dan masih ada kekhawatiran bahwa tanpa imbalan pelaporan yang nyata, sebagian orang mungkin memilih menyimpan kerentanan secara privat
- Akun teman yang digunakan dalam pengujian awal adalah akun yang telah memberikan persetujuan
1 komentar
Pendapat di Hacker News
EA suka memakai sistem bersama di berbagai gim. Saat mengutak-atik Madden, saya menemukan ada backend bersama bernama
blaze, dan ada endpoint web/TCP generikSaya membuat alat untuk memanggil endpoint ini, tetapi harus mengunggah XML, dan belakangan baru tahu bahwa setiap kali dipanggil, server EA mati
Karena setiap permintaan mengambil server baru, saya satu per satu membuat semua server Madden crash, dan pada akhirnya EA membuat API agar orang-orang tidak mengutak-atiknya
Seingat saya, diperlukan kira-kira satu instans Blaze untuk setiap 5.000–10.000 pemain
Sekarang mereka memakai format proprietari, dan tampaknya cukup nyaman dengan keamanan yang mengandalkan asumsi bahwa tak seorang pun akan mengetahui cara antarmukanya bekerja—dengan kata lain, security through obscurity
Suatu saat saya ingin kembali ke tulisan itu, dan setidaknya isinya cukup menarik
Kiat saat merekayasa balik API layanan terkenal seperti ini adalah memakai pencarian kode GitHub. Jika memasukkan nama endpoint yang unik, sering muncul orang-orang serupa yang membuat klien API kecil hasil oprekan mereka sendiri, dan itu membantu investigasi saya dengan cara yang tak terpikirkan
namespacenameyang diambil dari data pribadi. Informasi token 2FA harus di-hash di endpoint/tokeninfo/yang diambil dari JUNOSaat mencoba integrasi pasca-fakta, infrastruktur untuk API C++ kerap mengembalikan ID pengguna PSN
Seperti orang normal pada umumnya, tentu saja saya memesan Xbox dengan pengiriman esok hari, memasang Battlefield 2042, lalu menunggu momen penentu, dan akhirnya bisa masuk
Para hacker memang luar biasa <3
Yang menarik adalah alur terperinci tentang bagaimana mereka berpindah dari satu titik ke titik berikutnya. Saya rasa prosesnya tidak serapi dan selinier tulisan blog itu
Untuk menunjukkan waktu dan usaha yang benar-benar dibutuhkan dalam serangan seperti ini, mungkin ada setumpuk catatan, dan akan menarik juga melihatnya
Hal paling aneh dari semua ini adalah EA selama bertahun-tahun mengklaim bahwa memutus tautan akun Xbox lama lalu menautkannya kembali ke akun baru secara teknis tidak mungkin. Lihat saja tulisan seperti https://www.reddit.com/r/XboxGamePass/comments/12gsy4i/ea_xb... dan banyak sekali posting di forum EA
Saya juga menemui tembok ini, dan menghabiskan berjam-jam menelepon dukungan EA, tetapi mereka tidak bisa menautkan akun Xbox saya yang sangat lama. Jadi saya tidak bisa login ke gim EA mana pun di Xbox, dan akhirnya sebagian besar tidak bisa dimainkan di platform itu
Namun di sini ternyata hal itu sangat mungkin dilakukan
Anehnya, akun saya lama sekali mendapatkannya, dan selama 1–2 tahun saya beberapa kali mengirim email ke tim dukungan, tetapi setiap kali jawabannya adalah mereka sedang meng-upgrade akun secepat mungkin, namun karena pekerjaannya sangat besar, prosesnya akan memakan waktu bertahun-tahun
Belakangan saya melihat trik di suatu forum: jika akun ditutup sebentar lalu dibuka lagi, kapasitasnya bisa dinaikkan menjadi 25MB, meski bukan 250MB yang dijanjikan
Situasi akun lama 2–4MB, akun baru 25MB, dan peluncuran menuju 250MB yang memakan waktu bertahun-tahun memberi kesan bahwa Microsoft benar-benar kesulitan mencari ruang penyimpanan tersisa. Namun beberapa bulan kemudian, ketika harus bersaing dengan Gmail, mereka memutuskan memberi semua orang 2GB, dan itu diluncurkan sekaligus ke semua akun Hotmail, termasuk akun saya. Pasti ada alien yang mengantarkan UFO penuh hard disk
[1] Contoh posting forum lama tentang trik itu, termasuk balasan yang memuji GMail yang baru muncul: https://bimmersport.co.nz/topic/5232-hotmail-upgrade-2mb-to-...
Perubahan tautan bisa saja membuat data yang tersimpan di sistem penagihan menjadi tidak valid, mengacaukan laporan bulanan ke divisi Microsoft Xbox, atau membuat halaman admin internal crash saat dimuat
Saya bukan bermaksud membela EA, tetapi jika banyak berurusan dengan sistem microservices yang kompleks, mengubah struktur data di satu tempat tidak selalu sesederhana itu
Akan menarik juga kalau semua akun diblokir dan berharap tidak ada cadangan DB
Sebagai pelanggan yang membayar, aku berharap perusahaan-perusahaan seperti ini bersikap lebih baik, dan kalau mereka tidak punya program, secara pribadi aku tidak akan menyalahkan peretas jika mereka mengeksploitasi temuan mereka
Tidak ada orang yang menyimpan 400 juta record di satu mesin, dan ujung-ujungnya kamu hanya membuat layanan down sepanjang sore lalu mendapat 15 tahun di penjara federal
Karena reaksi pertama—atau setidaknya tulisan dengan rating tertinggi saat ini—adalah gagasan bahwa akan “menyenangkan” merugikan jutaan orang demi memberi pelajaran kepada perusahaan tempat mereka bertransaksi
Ada bagian seperti ini di tulisan:
I had found a way to obtain a privileged access token within the environment (a story for another day, but a certain game's executable had hardcoded credentials!), but I wasn't sure what I could do with it.Bisa jelaskan bagian ini sedikit lebih jauh? Kupikir kredensial seperti itu seharusnya tidak mudah dibaca dari binary executable, dan kalau file executable game harus mengautentikasi dirinya ke server jarak jauh, aku juga tidak begitu paham apa lagi yang seharusnya dilakukan developer
Dalam arsitektur client-server, client selalu tidak bisa dipercaya. Executable tidak semestinya perlu mengautentikasi dirinya sendiri ke server. Executable harus mengautentikasi sebagai pengguna atau akun dengan informasi yang diberikan pengguna
Untuk hal seperti telemetri, endpoint seperti ini biasanya menerima data tanpa autentikasi atau dengan autentikasi lemah, lalu melakukan beberapa tahap validasi untuk mencegah penyalahgunaan. Biasanya juga bersifat write/append-only
Kamu akan butuh sistem yang mengenkripsi executable dan membuat area aman di die CPU menangani dekripsi dengan private key, tapi meski begitu kemungkinan hanya soal waktu sampai seseorang melakukan delid pada chip dan mendapatkan kuncinya
Bahkan jika dienkripsi dan kunci enkripsinya dimasukkan ke HSM, di mesin client sembarang itu mungkin tidak bisa dilakukan; selain itu pada suatu titik game harus mendekripsi string itu dan menaruhnya di memori. Dan memori itu bisa dibaca
Yang seharusnya dilakukan developer game adalah menaruh sistem akun di backend dan meminta pemain memasukkan kredensial mereka sendiri di dalam game. Lalu game bisa mengidentifikasi dirinya ke server backend sebagai pemain tersebut
Dengan begitu tindakan di backend bisa dikaitkan ke pemain tertentu, dan itu memberi dasar yang baik untuk mengambil keputusan keamanan
Ada tool seperti IDA, jadi bukan berarti kamu harus mencari kredensial dengan mata telanjang di antara semua hal yang tampak seperti string
Masalahnya bukan sekadar ada kredensial yang di-hardcode di binary, melainkan kredensial itu punya hak istimewa
Sebagai engineer di perusahaan seperti ini, kadang aku penasaran bagaimana rasanya ketika API privat, bug aneh, dan urusan internal yang kotor muncul dalam laporan pelanggaran publik
Namun dalam kasus seperti ini kecil kemungkinan satu individu saja bertanggung jawab atas kerentanannya. Mungkin ada 5–6 tim yang memiliki bagian-bagian berbeda yang dieksploitasi, dan karena itulah exploit itu ada sejak awal. Ini sistem raksasa yang kompleks, tempat setiap orang hanya memahami bagian kecilnya sendiri
Di perusahaan sebesar EA, hampir pasti kejadian ini akan dipakai untuk politik internal, dan meskipun merugikan perusahaan secara keseluruhan, orang-orang akan memanfaatkannya untuk mendapat kendali lebih besar atas perusahaan yang makin kecil
Semua orang adalah sumber daya yang bisa diganti, jadi kenapa harus terlibat secara emosional dengan pekerjaan
Saat itu nama timnya Nucleus, jadi di salah satu respons dalam tulisan,
refTypebernilaiNUCLEUS. Tim ini membuat dan mengelola API backend untuk otorisasi, akun, dan pembayaranItu adalah magang musim panas, dan setahun kemudian aku menerima tawaran dari tim itu dan mulai bekerja. Saat itu nama timnya sudah berubah menjadi EADP dan sedang perlahan digabungkan dengan Origin. Aku agak samar apakah DP berarti Data Platform, tapi karena itu salah satu endpoint diawali dengan
dp.Saat itu belum ada database GraphQL; semuanya Enterprise Java, OCI, Spring, Hibernate, dan semacamnya, dan sebelum aku pergi juga sudah ada sebagian Groovy/SpringBoot yang lebih baru. Itu berjalan di server data center, bukan cloud
Meski begitu aku mengerjakan hal-hal menarik, dan meski pergi 2–3 tahun setelah insiden besar, aku belajar banyak tentang pengembangan backend dari engineer yang bagus
Aku sama sekali tidak tahu seperti apa timnya sekarang, siapa engineernya, atau apa yang terjadi, tapi sedih melihat hal seperti ini. Saat itu kami sangat sadar keamanan, dan juga mengerjakan sistem untuk mendeteksi serta menangani percobaan brute force pada halaman login
Aku tidak tahu apakah masih aktif atau berjalan, tetapi pemeriksaan/review keamanan untuk mengurangi kemungkinan pelanggaran dan attack surface adalah bagian dari pekerjaan sprint
Jika Anda menikmati membaca tulisan ini, Anda bisa menemukan lebih banyak di platform bug bounty seperti Hacktivity milik HackerOne: https://hackerone.com/hacktivity
Diperbarui setiap beberapa minggu atau beberapa bulan
Apakah ada panduan praktik terbaik untuk menyiapkan program bug bounty di suatu tempat?
Pasang pengumuman di suatu tempat di situs web bahwa pemeriksaan keamanan teknis diperbolehkan dengan syarat mengikuti prosedur pengungkapan kerentanan yang terkoordinasi, lalu tuliskan imbalan apa yang akan diberikan untuk bug apa dalam cakupan apa. Tentu saja ini perlu dibuat sedikit lebih spesifik daripada satu kalimat ini
Sebaiknya juga tuliskan sejak awal pengecualian seperti tidak membayar jika usia terlalu muda atau terlalu tua, atau tidak boleh termasuk pihak yang dikenai sanksi karena lahir di negara yang salah, agar tidak menimbulkan rasa sakit hati di kemudian hari
Jika ada pertanyaan spesifik, saya bisa menjawab atau mencarikan referensi yang bagus
Melihat bagian tulisan ini:
It's also disappointing that EA has yet to start a bug bounty program. Without any real incentive to report vulnerabilities, I know people who have instead chosen to keep them to themselves. I would love to see EA follow the rest of the industry's lead here.Jadi penulis melaporkannya dan tidak mendapatkan apa-apa?
Melaporkannya memiliki risiko hukum, dan fakta bahwa secara teknis perusahaan bisa menggugat sampai akhir juga tidak membantu. Ini berdasarkan standar EU/UK