Kerentanan di perpustakaan standar Rust

Kerentanan (CVE-2022-21658) telah diidentifikasi di perpustakaan standar Rust karena kondisi balapan di fungsi std::fs::remove_dir_all(). Jika fungsi ini digunakan untuk menghapus file-file sementara dalam aplikasi yang memiliki hak istimewa, penyerang dapat menghapus file dan direktori sistem sewenang-wenang yang biasanya tidak dapat diakses oleh penyerang untuk dihapus.

Kerentanan ini disebabkan oleh penerapan pemeriksaan tautan simbolik yang salah sebelum menghapus direktori secara rekursif. Daripada mencegah symlink diikuti, hapus_dir_all() terlebih dahulu memeriksa apakah file tersebut adalah symlink. Jika tautan ditentukan, maka tautan tersebut dihapus sebagai file, dan jika itu adalah direktori, maka operasi penghapusan konten rekursif dipanggil. Masalahnya adalah ada sedikit penundaan antara pemeriksaan dan dimulainya operasi penghapusan.

Pada saat pemeriksaan telah dilakukan, tetapi operasi penghitungan direktori untuk dihapus belum dimulai, penyerang dapat mengganti direktori dengan file sementara dengan tautan simbolis. Jika muncul pada saat yang tepat, fungsi delete_dir_all() akan memperlakukan tautan simbolis sebagai direktori dan mulai menghapus konten yang ditunjuk oleh tautan tersebut. Terlepas dari kenyataan bahwa keberhasilan serangan tergantung pada keakuratan waktu yang dipilih untuk mengganti direktori dan tidak mungkin mengenai momen yang tepat untuk pertama kalinya, selama percobaan para peneliti dapat mencapai serangan sukses yang berulang setelah mengeksekusi eksploitasi dalam beberapa detik.

Semua versi Rust dari 1.0.0 hingga 1.58.0 terpengaruh. Masalah ini telah diatasi dalam bentuk patch untuk saat ini (perbaikan akan disertakan dalam rilis 1.58.1, yang diharapkan dalam beberapa jam). Anda dapat memantau penghapusan kerentanan dalam distribusi di halaman ini: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Semua pengguna program Rust yang berjalan dengan hak istimewa yang lebih tinggi dan menggunakan fungsi delete_dir_all disarankan untuk segera memperbarui Rust ke versi 1.58.1. Menariknya, patch yang dirilis tidak menyelesaikan masalah pada semua sistem; misalnya, di REDOX OS dan versi macOS sebelum 10.10 (Yosemite), kerentanan tidak diblokir karena tidak adanya tanda O_NOFOLLOW, yang menonaktifkan simbolik berikut tautan.

Sumber: opennet.ru

Tambah komentar