Apa yang berubah adalah /bin/sh
apakah menjadi bash
atau tetap dash
yang mendapat bendera tambahan yang -p
meniru perilaku bash.
Bash mengharuskan -p
bendera untuk tidak membatalkan hak setuid seperti yang dijelaskan dalam halaman manualnya :
Jika shell dimulai dengan id pengguna (grup) yang efektif tidak sama dengan id pengguna (grup) yang sebenarnya, dan opsi -p tidak disediakan, tidak ada file startup yang dibaca, fungsi shell tidak diwarisi dari lingkungan, SHELLOPTS , Variabel BASHOPTS, CDPATH, dan GLOBIGNORE, jika muncul di lingkungan, diabaikan, dan id pengguna yang efektif ditetapkan ke id pengguna yang sebenarnya . Jika opsi -p disediakan saat doa, perilaku startup adalah sama, tetapi id pengguna yang efektif tidak diatur ulang.
Sebelumnya, dash
tidak peduli tentang ini dan mengizinkan eksekusi setuid (dengan tidak melakukan apa pun untuk mencegahnya). Tetapi manual Ubuntu 16.04'sdash
memiliki opsi tambahan yang dijelaskan, mirip dengan bash
:
-p priv
Jangan mencoba mengatur ulang uid yang efektif jika tidak cocok dengan uid. Ini tidak diatur secara default untuk membantu menghindari penggunaan yang salah oleh program root setuid melalui sistem (3) atau popen (3).
Opsi ini tidak ada di hulu (yang mungkin tidak reaktif terhadap patch yang diusulkan * ) atau Debian 9 tetapi hadir dalam buster Debian yang mendapatkan patch sejak 2018.
CATATAN: seperti yang dijelaskan oleh Stéphane Chazelas, sudah terlambat untuk memohon "/bin/sh -p"
di system()
karena system()
berjalan apapun yang diberikan melalui /bin/sh
dan setuid yang sudah dijatuhkan. Jawaban derobert menjelaskan bagaimana menangani ini, dalam kode sebelumnya system()
.
* lebih detail tentang sejarah di sana - sini .
system("bash -p")
berjalansh -c "bash -p"
sehingga hak istimewa telah dijatuhkan ketikabash
dieksekusi.