Apa yang sebenarnya terjadi saat kata sandimu bocor

Diterbitkan oleh David Carrero

Waktu kata sandi seseorang bocor, ia membayangkannya sebagai kecelakaan sekali jadi: sebuah layanan sedang apes, beritanya keluar, kamu ganti kata sandinya, selesai. Belum selesai. Hari kebocoran bukan akhir dari apa pun: itu hari pertama sebuah lini produksi yang akan berjalan bertahun-tahun, dan di dalamnya namamu tak akan pernah muncul. Layak diceritakan utuh, karena hampir tak ada yang melihatnya.

Langkah satu: seseorang menarik basis datanya

Yang pertama sama sekali tidak spektakuler. Ada yang menemukan sebuah SQL injection, sebuah cadangan yang terbuka, sebuah panel admin dengan kredensial bawaan. Lalu ia membawa pulang satu tabel.

Tabel itu, kalau lagi mujur, berisi alamat surelmu dan sebuah hash kata sandimu. Kalau kurang mujur, berisi alamat surelmu dan kata sandimu. Dalam bentuk teks. Persis seperti kamu mengetiknya.

2009 tiga puluh dua juta kata sandi dalam teks polos

Pada Desember 2009, sebuah perusahaan widget untuk media sosial bernama RockYou kena SQL injection. Yang terbawa sekitar 32 juta kata sandi, dan tak ada hash yang perlu dipecahkan: perusahaan itu menyimpannya dalam teks polos.

Itu bencana buat RockYou dan hadiah buat semua orang lain. Untuk pertama kalinya ada korpus raksasa berisi kata sandi sungguhan, ditulis orang-orang yang tak tahu bakal ada yang membacanya. Bukan studi: barangnya sendiri.

Berkas itu menjelma jadi rockyou.txt, yang sampai sekarang masih jadi kamus rujukan untuk menguji serangan. Nilainya bukan karena di dalamnya ada kata sandimu: melainkan karena di dalamnya ada cara orang menulis kata sandi. Satu nama dan satu tahun, satu kata dan 123, tanda ! di ujung. RockYou tidak membocorkan 32 juta rahasia. Ia membocorkan polanya. Dan pola tidak punya tanggal kedaluwarsa.

Langkah dua: yang bisa dibobol dibobol, tanpa terburu-buru sedikit pun

Di sinilah nalar sehari-hari meleset. Waktu ada yang mencoba menebak kata sandimu di layar masuk sebuah layanan, layanannya memotong dia: tiga percobaan, sebuah CAPTCHA, sebuah penguncian. Melawan server, menebak itu lambat dan berisik.

Melawan berkas hash yang sudah ada di diskmu sendiri, tak ada server. Tak ada siapa pun di seberang sana yang bilang tidak. Dicobanya secara lokal, dengan GPU, tanpa batas percobaan dan dengan waktu sebanyak-banyaknya. Kalau layanannya salah pilih cara mengehash — algoritme cepat, tanpa garam — bedanya dengan teks polos cuma soal kepraktisan, bukan keamanan.

Dan dicobanya tidak asal: pertama rockyou.txt, lalu aturan-aturan turunannya. Ganti a jadi @. Tambahkan satu tahun di ujung. Setiap akal-akalan yang menurutmu cerdik sudah lebih dari sepuluh tahun tertulis di sebuah berkas konfigurasi.

Dari situ sebagian isi dump berubah jadi kata sandi yang terbaca. Sisanya — yang panjang, yang acak, yang tak ada di kamus mana pun — tetap jadi derau. Itulah garis yang ditarik pemeriksa: ia tidak memarahimu, ia memberitahu kamu jatuh di sisi yang mana.

Langkah tiga: disilangkan, dan di situlah kamu jadi uang

Satu dump yang berdiri sendiri nilainya kecil. Yang berharga adalah agregasinya: mengambil sepuluh kebocoran dari situs berbeda, menyilangkannya lewat alamat surel, lalu menyimpan pasangan surel:kata sandi yang sudah terbaca. Hasilnya disebut combolist, dan itu bukan lagi basis data milik siapa pun. Itu daftar orang.

2013 inventarisnya muncul ke permukaan

Pada Desember 2013, Troy Hunt menjalankan Have I Been Pwned: sebuah basis data publik berisi alamat surel yang muncul di kebocoran, supaya siapa saja bisa bertanya apakah ia ada di dalamnya. Gagasan dasarnya sederhana dan tidak enak: kalau penyerang sudah pegang inventarisnya, menyembunyikannya dari korban tidak melindungi siapa-siapa. Bertahun-tahun kemudian datang Pwned Passwords, yang melakukan hal yang sama untuk kata sandi dan memungkinkanmu memeriksanya tanpa mengirimkannya: yang dikirim sepotong hash, dan servernya mengembalikan sekumpulan kandidat, tanpa tahu yang mana punyamu.

2017 NIST berhenti meminta simbol dan mulai meminta daftar

Waktu NIST menerbitkan SP 800-63B, ia membuang hampir seluruh ortodoksi formulir pendaftaran dan menggantinya dengan satu syarat yang tak banyak diperkirakan orang: saat menetapkan sebuah kata sandi, sistem harus membandingkannya dengan daftar nilai yang diketahui sudah terkompromi dan menolaknya kalau muncul di sana.

Itu perubahan teori, bukan perubahan detail. Pertanyaannya bukan lagi apakah kata sandimu terlihat kuat, melainkan apakah ia sudah terbit. Karena itu generator melakukan satu-satunya hal yang masuk akal: mengambilnya dari tempat yang belum pernah ia singgahi.

2019 kebocoran yang sebenarnya daur ulang kebocoran lain

Pada Januari 2019 beredar satu paket yang tenar dengan nama Collection #1. Hunt membedahnya dan menghitung isinya: sekitar 773 juta alamat surel unik dan sekitar 21 juta kata sandi unik dalam teks polos, diagregasi dari ribuan sumber.

Yang penting bukan ukurannya. Melainkan dari mana asalnya: sebagian besar adalah daur ulang kebocoran-kebocoran sebelumnya, yang sudah dibobol dan disusun ulang dalam format yang nyaman dipakai — meski Hunt juga menemukan bahan yang sampai saat itu belum terdaftar olehnya. Produknya bukan aksi pembobolannya. Produknya inventaris. Dan inventaris semacam itu cuma punya satu kegunaan.

Credential stuffing: bukan kamu yang diserang

Tak ada yang menyerang kamu. Itu bagian yang paling susah dicerna.

Tak ada yang duduk merenungkan akunmu. Ada orang yang mengambil sebuah combolist berisi ratusan juta baris, memasukkannya ke sebuah alat yang mengujinya ke formulir masuk sebuah bank atau sebuah layanan surel, membagi-bagi percobaannya ke banyak alamat IP supaya tak memicu penguncian, lalu menunggu. Mayoritas besarnya gagal. Tak apa: harganya nyaris nol.

Itulah credential stuffing, dan itu bukan menebak. Itu memeriksa. Kata sandinya sudah di tangan mereka; yang mereka cari tahu cuma di mana lagi kamu memasangnya.

Kata sandimu di forum itu tidak penting. Forumnya juga tidak. Yang penting adalah untaian karakter yang sama itu membuka surelmu, dan surelmu membuka semua sisanya lewat “saya lupa kata sandi”. Dosa asalnya bukan karena ia lemah: melainkan karena ia sama. Kata sandi tiga puluh karakter, acak dan sempurna, dipakai ulang di dua situs, kualitasnya setara situs terburuk dari keduanya. Dan kamu tak mengendalikan cara situs terburuk itu mengehash.

Apa yang bisa disimpulkan dari semua ini

  • Mengganti kata sandi yang bocor tidak cukup kalau kamu mengulanginya. Yang mendesak bukan situs yang masuk berita. Melainkan situs-situs lainnya.
  • Satu kata sandi per situs, dan biar kamu tak peduli melupakannya. Kalau kamu bisa mengingat semua kata sandimu, jumlahnya terlalu sedikit atau kualitasnya terlalu buruk.
  • Faktor kedua memutus rantainya. Credential stuffing menguji surel:kata sandi. Kalau itu tak cukup untuk masuk, inventarisnya kehilangan nilai.

Kata sandimu yang bocor tidak ada di tangan seorang musuh. Ia ada di satu baris sebuah berkas, di antara ratusan juta baris lain, menunggu sampai ada yang merasa sepadan mencobanya di satu situs lagi. Dan satu-satunya hal yang menentukan apakah itu berhasil sudah kamu putuskan bertahun-tahun lalu, waktu kamu mengetik kata yang sama untuk kedua kalinya.


Sumber: kebocoran RockYou (Desember 2009) dan penggunaan rockyou.txt sesudahnya sebagai kamus serangan · Have I Been Pwned dan Pwned Passwords, dari Troy Hunt · NIST SP 800-63B, tentang pemeriksaan kata sandi terhadap daftar nilai yang terkompromi · analisis Troy Hunt atas Collection #1 (Januari 2019) dan angka-angka yang ia terbitkan · definisi credential stuffing dari OWASP.

← Kembali ke blog