Kerentanan kritikal dalam PolKit membenarkan akses root pada kebanyakan pengedaran Linux

Qualys telah mengenal pasti kelemahan (CVE-2021-4034) dalam komponen sistem Polkit (dahulunya PolicyKit) yang digunakan dalam pengedaran untuk membenarkan pengguna yang tidak mempunyai hak untuk melakukan tindakan yang memerlukan hak akses yang dinaikkan. Kerentanan itu membolehkan pengguna tempatan yang tidak mempunyai hak untuk meningkatkan keistimewaan mereka untuk melakukan root dan mendapatkan kawalan penuh ke atas sistem. Masalahnya diberi nama kod PwnKit dan terkenal kerana menghasilkan eksploitasi kerja yang berjalan dalam konfigurasi lalai pada kebanyakan pengedaran Linux.

Masalahnya terdapat dalam utiliti pkexec PolKit, yang disertakan dengan bendera akar SUID dan direka untuk menjalankan arahan dengan keistimewaan pengguna lain mengikut peraturan PolKit yang ditentukan. Disebabkan pengendalian yang salah terhadap argumen baris perintah yang diserahkan kepada pkexec, pengguna yang tidak mempunyai hak istimewa boleh memintas pengesahan dan menyebabkan kod mereka dijalankan sebagai akar, tanpa mengira peraturan akses yang ditetapkan. Untuk serangan, tidak kira tetapan dan sekatan apa yang dinyatakan dalam PolKit, cukup atribut akar SUID ditetapkan untuk fail boleh laku dengan utiliti pkexec.

Pkexec tidak menyemak kesahihan bilangan hujah baris arahan (argc) yang diluluskan semasa memulakan proses. Pembangun pkexec menganggap bahawa entri pertama dalam tatasusunan argv sentiasa mengandungi nama proses (pkexec), dan yang kedua sama ada nilai NULL atau nama arahan yang dilancarkan melalui pkexec. Memandangkan kiraan hujah tidak disemak terhadap kandungan sebenar tatasusunan dan diandaikan sentiasa lebih besar daripada 1, jika proses diluluskan tatasusunan argv kosong, seperti yang dibenarkan oleh fungsi execve Linux, pkexec akan menganggap NULL sebagai hujah pertama ( nama proses) dan yang seterusnya sebagai di luar memori penimbal, seperti kandungan tatasusunan berikutnya. |———+———+——+————————+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-option" NULL "value" "PATH=name" NULL

Masalahnya ialah selepas tatasusunan argv terdapat tatasusunan envp dalam memori yang mengandungi pembolehubah persekitaran. Oleh itu, jika tatasusunan argv kosong, pkexec mengekstrak data tentang perintah yang dijalankan dengan keistimewaan yang tinggi daripada elemen pertama tatasusunan dengan pembolehubah persekitaran (argv[1] menjadi sama dengan envp[0]), yang kandungannya boleh dikawal oleh penyerang.

Setelah menerima nilai argv[1], pkexec cuba, dengan mengambil kira laluan fail dalam PATH, untuk menentukan laluan penuh ke fail boleh laku dan menulis penunjuk kepada rentetan dengan laluan penuh kembali ke argv[1], yang membawa kepada menimpa nilai pembolehubah persekitaran pertama, kerana argv[ 1] adalah sama dengan envp[0]. Dengan memanipulasi nama pembolehubah persekitaran pertama, penyerang boleh menggantikan pembolehubah persekitaran lain dalam pkexec, sebagai contoh, menggantikan pembolehubah persekitaran "LD_PRELOAD", yang tidak dibenarkan dalam program suid, dan mengatur perpustakaan kongsi mereka untuk dimuatkan ke dalam proses.

Eksploitasi kerja melibatkan penggantian pembolehubah GCONV_PATH, yang digunakan untuk menentukan laluan ke pustaka transkod simbol, dimuatkan secara dinamik apabila memanggil fungsi g_printerr(), yang kodnya menggunakan iconv_open(). Dengan mentakrifkan semula laluan dalam GCONV_PATH, penyerang boleh memastikan bahawa ia bukan perpustakaan iconv standard yang dimuatkan, tetapi pustakanya sendiri, pengendali yang akan dilaksanakan apabila mesej ralat dipaparkan pada peringkat apabila pkexec masih berjalan dengan hak akar dan sebelum kebenaran pelancaran disemak.

Adalah diperhatikan bahawa walaupun masalah itu disebabkan oleh kerosakan memori, ia boleh dieksploitasi dengan pasti dan berulang tanpa mengira seni bina perkakasan yang digunakan. Eksploit yang disediakan telah berjaya diuji pada Ubuntu, Debian, Fedora dan CentOS, tetapi juga boleh digunakan pada pengedaran lain. Eksploit asal belum lagi tersedia secara umum, menunjukkan bahawa ia adalah remeh dan boleh dibuat semula dengan mudah oleh penyelidik lain, jadi adalah penting untuk memasang kemas kini tampalan secepat mungkin pada sistem berbilang pengguna. Polkit juga tersedia untuk sistem BSD dan Solaris, tetapi belum dikaji untuk digunakan pada mereka. Apa yang diketahui ialah serangan tidak boleh dijalankan pada OpenBSD, kerana kernel OpenBSD tidak membenarkan nilai argc nol diluluskan apabila execve() dipanggil.

Masalahnya telah wujud sejak Mei 2009, sejak penambahan arahan pkexec. Pembetulan untuk kelemahan PolKit kini tersedia sebagai tampung (tiada keluaran tampalan telah dikeluarkan), tetapi memandangkan pembangun pengedaran telah dimaklumkan tentang masalah itu terlebih dahulu, kebanyakan pengedaran menerbitkan kemas kini serentak dengan pendedahan maklumat tentang kerentanan itu. Isu ini telah dibetulkan dalam RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux dan Manjaro. Sebagai langkah sementara untuk menyekat kelemahan, anda boleh mengalih keluar bendera akar SUID daripada program /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).



Sumber: opennet.ru

Tambah komen