Kerentanan kritis di PolKit memungkinkan akses root pada sebagian besar distribusi Linux

Qualys telah mengidentifikasi kerentanan (CVE-2021-4034) dalam komponen sistem Polkit (sebelumnya PolicyKit) yang digunakan dalam distribusi untuk memungkinkan pengguna yang tidak memiliki hak istimewa melakukan tindakan yang memerlukan hak akses yang lebih tinggi. Kerentanan ini memungkinkan pengguna lokal yang tidak memiliki hak istimewa untuk meningkatkan hak istimewa mereka untuk melakukan root dan mendapatkan kendali penuh atas sistem. Masalahnya diberi nama kode PwnKit dan terkenal karena menghasilkan eksploitasi yang berjalan dalam konfigurasi default di sebagian besar distribusi Linux.

Masalahnya ada pada utilitas pkexec PolKit, yang dilengkapi dengan bendera root SUID dan dirancang untuk menjalankan perintah dengan hak istimewa pengguna lain sesuai dengan aturan PolKit yang ditentukan. Karena penanganan yang salah terhadap argumen baris perintah yang diteruskan ke pkexec, pengguna yang tidak memiliki hak istimewa dapat melewati otentikasi dan menjalankan kode mereka sebagai root, terlepas dari aturan akses yang ditetapkan. Untuk serangan, tidak masalah pengaturan dan batasan apa yang ditentukan di PolKit, atribut root SUID cukup disetel untuk file yang dapat dieksekusi dengan utilitas pkexec.

Pkexec tidak memeriksa validitas jumlah argumen baris perintah (argc) yang diteruskan saat memulai suatu proses. Pengembang pkexec berasumsi bahwa entri pertama dalam array argv selalu berisi nama proses (pkexec), dan entri kedua berisi nilai NULL atau nama perintah yang diluncurkan melalui pkexec. Karena jumlah argumen tidak diperiksa terhadap isi sebenarnya dari array dan diasumsikan selalu lebih besar dari 1, jika suatu proses melewati array argv kosong, seperti yang dimungkinkan oleh fungsi execve Linux, pkexec akan memperlakukan NULL sebagai argumen pertama ( nama proses) dan yang berikutnya di luar memori buffer, seperti isi array berikutnya. |——+——+—+———|——+——+—+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+—+——|—|—-|—-+—-|—-+—+——|——| VVVVVV "program" "-pilihan" NULL "nilai" "PATH=nama" NULL

Masalahnya adalah setelah array argv ada array envp di memori yang berisi variabel lingkungan. Jadi, jika array argv kosong, pkexec mengekstrak data tentang perintah yang dijalankan dengan hak istimewa yang lebih tinggi dari elemen pertama array dengan variabel lingkungan (argv[1] menjadi identik dengan envp[0]), yang isinya dapat dikontrol oleh penyerang.

Setelah menerima nilai argv[1], pkexec mencoba, dengan mempertimbangkan jalur file di PATH, untuk menentukan jalur lengkap ke file yang dapat dieksekusi dan menulis pointer ke string dengan jalur lengkap kembali ke argv[1], yang mana menyebabkan penimpaan nilai variabel lingkungan pertama, karena argv[ 1] identik dengan envp[0]. Dengan memanipulasi nama variabel lingkungan pertama, penyerang dapat mengganti variabel lingkungan lain di pkexec, misalnya, mengganti variabel lingkungan “LD_PRELOAD”, yang tidak diperbolehkan dalam program suid, dan mengatur agar perpustakaan bersama mereka dimuat ke dalam proses.

Eksploitasi yang berfungsi melibatkan penggantian variabel GCONV_PATH, yang digunakan untuk menentukan jalur ke pustaka transcoding simbol, yang dimuat secara dinamis saat memanggil fungsi g_printerr(), yang kodenya menggunakan iconv_open(). Dengan mendefinisikan ulang jalur di GCONV_PATH, penyerang dapat memastikan bahwa bukan pustaka iconv standar yang dimuat, tetapi pustakanya sendiri, yang penangannya akan dieksekusi ketika pesan kesalahan ditampilkan pada tahap ketika pkexec masih berjalan dengan hak root dan sebelum peluncuran izin diperiksa.

Perlu dicatat bahwa meskipun masalah ini disebabkan oleh kerusakan memori, masalah ini dapat dieksploitasi secara andal dan berulang-ulang, apa pun arsitektur perangkat keras yang digunakan. Eksploitasi yang disiapkan telah berhasil diuji pada Ubuntu, Debian, Fedora dan CentOS, tetapi juga dapat digunakan pada distribusi lain. Eksploitasi asli belum tersedia untuk umum, menunjukkan bahwa eksploitasi ini sepele dan dapat dengan mudah dibuat ulang oleh peneliti lain, jadi penting untuk menginstal pembaruan patch sesegera mungkin pada sistem multi-pengguna. Polkit juga tersedia untuk sistem BSD dan Solaris, tetapi belum diteliti untuk digunakan pada sistem tersebut. Yang diketahui adalah bahwa serangan tidak dapat dilakukan pada OpenBSD, karena kernel OpenBSD tidak mengizinkan nilai argc nol diteruskan ketika execve() dipanggil.

Masalahnya sudah ada sejak Mei 2009, sejak penambahan perintah pkexec. Perbaikan untuk kerentanan PolKit saat ini tersedia sebagai tambalan (belum ada rilis tambalan yang dirilis), tetapi karena pengembang distribusi telah diberitahu tentang masalah ini sebelumnya, sebagian besar distribusi menerbitkan pembaruan secara bersamaan dengan pengungkapan informasi tentang kerentanan tersebut. Masalah ini telah diperbaiki di RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux dan Manjaro. Sebagai tindakan sementara untuk memblokir kerentanan, Anda dapat menghapus tanda root SUID dari program /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).



Sumber: opennet.ru

Tambah komentar