Bug musl Linux biarkan semua password masuk sejak 2016
Judul asli: sshole
Mengapa Ini Penting
Jutaan container Docker berbasis Alpine berpotensi terdampak selama hampir satu dekade.
OpenSSH di Alpine, OpenWrt, dan banyak image Docker mengalami celah keamanan sejak 2016: akun tanpa password menerima password apa pun bila panjangnya melebihi 256 karakter.
Celah ini bukan satu bug tunggal, melainkan rantai keputusan teknis selama empat dekade yang akhirnya bertabrakan. Sejak 1980, Unix menggunakan karakter `*` di field password untuk menandai akun yang tidak boleh digunakan login. Jika field berisi `*`, tidak ada password yang bisa cocok—begitu logikanya.
Masalah mulai terbentuk pada Agustus 2012. musl libc, yang mendasari Alpine Linux dan banyak image Docker populer, mengubah perilaku fungsi `crypt()`: alih-alih mengembalikan NULL saat gagal, ia mengembalikan karakter `*`. Dua puluh hari kemudian, musl menambahkan batas keras 256 byte untuk sha512crypt demi mencegah serangan DoS berbasis password panjang. Bila password melewati batas itu, `crypt()` gagal—dan mengembalikan `*`.
Pada Juli 2016, CVE-2016-6210 mendorong OpenSSH menambahkan logika anti-timing: untuk user yang tidak ada, sshd tetap menghitung hash menggunakan salt dari akun lain agar waktu respons seragam. Tanpa disengaja, logika ini juga berlaku untuk akun nyata yang field passwordnya berisi `*`—termasuk root, deploy user berbasis kunci SSH, dan user LDAP.
Hasilnya: kirim password sepanjang 257 karakter atau lebih ke akun yang seharusnya dikunci, `crypt()` gagal, mengembalikan `*`, dan sshd mencocokkannya dengan field `*` di shadow—cocok. Pintu terbuka. CVE-2019-5021 sempat menambal Alpine Docker image, tapi Alpine memilih karakter `!` sebagai pengganti tanpa mempertimbangkan kompatibilitas non-PAM, sehingga celah tetap ada dalam skenario tertentu hingga bertahun-tahun.