Apa yang berubah adalah /bin/shapakah menjadi bashatau tetap dashyang mendapat bendera tambahan yang -pmeniru perilaku bash.
Bash mengharuskan -pbendera 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, dashtidak 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/shdan 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 ketikabashdieksekusi.