1 poin oleh GN⁺ 2025-06-10 | Belum ada komentar. | Bagikan ke WhatsApp
  • Formulir pemulihan nama pengguna No-JS milik Google mengonfirmasi kombinasi nomor telepon dan nama tampilan, sehingga terbentuk rantai serangan yang dapat menemukan nomor telepon lengkap pengguna Google tertentu
  • Intinya adalah perbedaan redirect pada /signin/usernamerecovery dan /signin/usernamerecovery/lookup, yang memungkinkan pembedaan antara kondisi akun tidak ada dan akun ada
  • Meski ada pembatasan permintaan berbasis IP dan CAPTCHA, ketika token BotGuard dari formulir JS dimasukkan ke bgresponse pada formulir No-JS, proses berjalan tanpa batasan dan digabungkan dengan rotasi IPv6
  • Penyerang dapat memperoleh nama tampilan akun Google lewat Looker Studio, lalu sangat mempersempit kandidat dengan menggabungkan nomor telepon yang dimasking dari alur lupa sandi dan format nomor per negara
  • Pada server seharga $0,30 per jam dengan 16 vCPU, dimungkinkan sekitar 40 ribu pengecekan per detik, dan Google menghentikan sepenuhnya formulir pemulihan nama pengguna No-JS pada 6 Juni 2025 serta membayar total $5.000

Kerentanan yang berawal dari formulir pemulihan nama pengguna No-JS

  • Saat memeriksa perilaku layanan Google dengan JavaScript dimatikan di browser, ditemukan bahwa formulir pemulihan nama pengguna masih berfungsi
  • Formulir pemulihan akun sejak dulu dianggap memerlukan JavaScript karena bergantung pada pertahanan keluarga BotGuard yang dihasilkan oleh kode JavaScript proof-of-work yang diobfuscate
  • Namun formulir No-JS menyediakan alur yang dapat memeriksa apakah email pemulihan atau nomor telepon terhubung dengan nama tampilan tertentu

Memeriksa keberadaan akun dengan dua permintaan

  • Permintaan pertama mengirim nomor telepon ke /signin/usernamerecovery, lalu memperoleh nilai ess yang terhubung ke nomor telepon tersebut dari Location pada respons
    • Cookie dan nilai gxf diambil dari HTML halaman awal
  • Berikutnya, ess, nama depan, nama belakang, dan bgresponse=js_disabled dikirim ke /signin/usernamerecovery/lookup
  • Redirect respons berbeda, sehingga dapat ditentukan apakah ada akun Google dengan nomor telepon dan nama tampilan tersebut
    • Akun tidak ada: usernamerecovery/noaccountsfound
    • Akun ada: usernamerecovery/challenge

Pembatasan IP, IPv6, dan bypass BotGuard

  • Pada percobaan awal, setelah beberapa permintaan, alamat IP terkena pembatasan permintaan dan CAPTCHA ditampilkan
  • Pada contoh nomor ponsel Belanda, alur lupa sandi memberikan petunjuk seperti •• ••••••03
    • Nomor ponsel Belanda dimulai dengan 06, sehingga tersisa 6 digit, yaitu 10^6 = 1.000.000 kandidat yang harus dicoba
  • Penyedia seperti Vultr memberikan rentang IPv6 /64, dan secara teori dapat menggunakan 18.446.744.073.709.551.616 alamat
  • Dibuat PoC yang menetapkan alamat IPv6 acak dari subnet pada setiap permintaan menggunakan ClientBuilder.local_address milik reqwest
  • Jika formulir dengan JS dinonaktifkan digunakan dari IP data center, CAPTCHA terus muncul, tetapi ketika token BotGuard dari formulir pemulihan akun dengan JS aktif dimasukkan ke bgresponse pada formulir No-JS, permintaan lolos
    • Pada formulir No-JS, token BotGuard tersebut tampaknya tidak memiliki pembatasan permintaan

Menyaring hit yang keliru

  • Hasil eksekusi pertama mencakup banyak akun dengan nama depan Henry, nama belakang kosong, dan dua digit terakhir nomor telepon 03
  • Dalam kasus ini, jika nama depannya Henry, usernamerecovery/challenge dikembalikan apa pun nilai nama belakangnya
  • Untuk memverifikasi hit yang mungkin valid, dilakukan pengecekan ulang dengan nama depan yang sama dan nama belakang acak seperti 0fasfk1AFko1wf
    • Jika tetap muncul sebagai hit, hasil tersebut difilter sebagai false positive
  • Kemungkinan adanya pengguna Google lain dengan nama tampilan lengkap yang sama, kode negara yang sama, dan dua digit terakhir nomor yang sama dinilai rendah

Mendapatkan kode negara dan nama tampilan

  • Masking nomor telepon pada alur lupa sandi dapat dimanfaatkan untuk menebak kode negara
  • Google menggunakan libphonenumber untuk national format setiap nomor
  • National format yang dimasking per negara dikumpulkan untuk membuat mask.json
    • Rusia, Belanda, Inggris, dan Amerika Serikat memiliki pola mask yang berbeda-beda
  • Pada 2023, Google mengubah kebijakan agar nama hanya ditampilkan ketika ada interaksi langsung dengan target, dan pada April 2024 Internal People API sepenuhnya berhenti mengembalikan nama tampilan akun yang tidak terautentikasi
  • Namun jika membuat dokumen Looker Studio dan mengalihkan kepemilikannya kepada korban, nama tampilan terekspos di layar beranda tanpa interaksi dari korban

Optimasi rentang kandidat dan alat

  • Dengan validasi nomor dari libphonenumber, dibuat format.json yang berisi prefiks seluler per negara, kode area yang diketahui, dan jumlah digit
    • Contoh Belanda mencakup kode negara 31, kode area 61, 62, 63, 64, 65, 68, dan jumlah digit [7]
  • Validasi libphonenumber secara real-time mengurangi kueri Google API untuk nomor yang tidak valid
  • Untuk pembuatan token BotGuard, ditulis skrip Go yang menggunakan chromedp
  • Seluruh alur serangan terdiri dari tiga tahap
    • Membocorkan nama tampilan akun Google lewat Looker Studio
    • Mendapatkan nomor telepon yang dimasking dari alur lupa sandi
    • Melakukan brute-force nomor telepon lengkap dengan gpb menggunakan nama tampilan dan nomor telepon yang dimasking

Performa brute-force dan estimasi waktu

  • Pada server seharga $0,30 per jam dengan spesifikasi kelas konsumen 16 vCPU, dimungkinkan sekitar 40 ribu pengecekan per detik
  • Estimasi waktu yang dibutuhkan ketika hanya dua digit terakhir diberikan pada alur lupa sandi:
    • Amerika Serikat +1: 20 menit
    • Inggris +44: 4 menit
    • Belanda +31: 15 detik
    • Singapura +65: 5 detik
  • Jika alur reset sandi layanan lain seperti PayPal memberikan lebih banyak petunjuk angka, waktunya dapat berkurang drastis
    • Contoh: +14•••••1779

Pelaporan ke Google dan linimasa tindakan

  • 2025-04-14: Laporan dikirim ke vendor
  • 2025-04-15: Vendor menerima dan mengklasifikasikan laporan
  • 2025-04-25: Respons “Nice catch!”
  • 2025-05-15: Panel menetapkan hadiah $1.337 + swag
    • Alasannya adalah penilaian bahwa kemungkinan penyalahgunaannya rendah, dan isu ini diakui sebagai metodologi terkait penyalahgunaan berdampak tinggi
  • 2025-05-15: Mengajukan keberatan atas alasan pemberian hadiah
    • Menurut tabel Abuse VRP, probability/exploitability ditentukan berdasarkan prasyarat serangan dan apakah korban dapat menemukan penyalahgunaan tersebut
    • Disampaikan bahwa serangan ini tidak memiliki prasyarat dan korban tidak dapat menemukan penyalahgunaan tersebut
  • 2025-05-22: Panel membayar tambahan $3.663, menyesuaikan total hadiah menjadi $5.000
    • Likelihood dinaikkan menjadi medium
  • 2025-05-22: Vendor mengonfirmasi bahwa mitigasi yang sedang berjalan telah diterapkan sampai endpoint global dihentikan
  • 2025-05-22: Koordinasi jadwal publikasi 2025-06-09
  • 2025-06-06: Vendor mengonfirmasi penghentian penuh formulir pemulihan nama pengguna No-JS
  • 2025-06-09: Laporan dipublikasikan

Belum ada komentar.

Belum ada komentar.