Mengapa setuid tidak berfungsi pada executable?

9

Saya tahu bahwa mengaktifkan setuid pada skrip memiliki masalah keamanan dan karenanya tidak aktif secara default, tetapi berharap itu berfungsi untuk executable. Saya membuat dan dapat dieksekusi yang menampilkan uid sebagai output mengikuti instruksi yang dijelaskan dalam posting ini: Izinkan setuid pada skrip shell

Tetapi mengembalikan uid yang sama (1000) baik sebelum dan sesudah berjalan sudo chmod +s ./setuid-test. Saya pikir ini berarti setuid tidak memiliki efek pada executable saya, mengapa dan bagaimana menyelesaikannya?

Kode sumber:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

Dibangun dan dijalankan bersama

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

Saat berlari ls -la, inilah yang saya dapatkan:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
Pelajar PHP
sumber
2
Apakah executable dimiliki oleh pengguna selain dari yang Anda jalankan? (setuid tidak berarti perubahan ke root; itu berarti perubahan ke pengguna yang memiliki executable.)
cjm
PHPLearner Saya pikir Anda perlu melibatkan grup / pengguna untuk mengubah SUID file
ryekayo
@cjm me@me:~$ ls -la setuid-test---- mengembalikan -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
7
Program Anda berfungsi seperti yang diharapkan pada sistem Ubuntu 14.04 saya jika ada di direktori home saya, tetapi tidak ketika berada di / tmp, karena parameter yang digunakan untuk me-mount / tmp melarang program setuid. Di mana program Anda berada?
Mark Plotnick
2
Ketik df .direktori untuk menemukan titik mount, lalu mount | grep nameofmountpoint. Apakah ada nosuidbendera yang terdaftar di sana?
Mark Plotnick

Jawaban:

10

Sebagian besar filesystem yang dirancang untuk Unix / Linux dapat dipasang dengan nosuidatribut, yang akan mencegah binari setuid atau setgid yang terletak di filesystem tersebut mengubah uid atau gid proses yang efektif. Ini sering digunakan saat memasang sistem file "tidak dipercaya", yang berada di bawah kendali non-administrator.

Dalam kasus Anda, sistem file yang Anda gunakan adalah ketik ecryptfs, yang menurut askubuntu: Kesalahan saat menjalankan biner dengan setuid root di bawah direktori home terenkripsi menegakkan nosuid (dan nodev) secara otomatis, dimulai dengan versi dari beberapa tahun yang lalu.

Berikut ini penjelasan alasan perubahan, dari https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
Dilaporkan bahwa ecryptfs mount helper pribadi (/sbin/mount.ecryptfs_private), yang merupakan setuid-root, dapat memungkinkan pengguna lokal yang tidak memiliki hak istimewa untuk me-mount share ecryptf yang dikendalikan pengguna pada sistem lokal. Karena ecryptfs helper tidak me-mount filesystems dengan flag "nosuid" dan "nodev", akan mungkin bagi pengguna untuk me-mount sistem file yang berisi binari setuid-root dan / atau file perangkat yang dapat menyebabkan peningkatan hak istimewa mereka. Ini dapat dilakukan melalui perangkat USB, jika pengguna memiliki akses fisik ke sistem.
...
Memaksa flag mount MS_NOSUID dan MS_NODEV ditambahkan ke versi 99.

Tandai Plotnick
sumber
Jika sistem memungkinkan pengguna untuk memasang sistem file yang memungkinkan setuid, maka itu akan sepele untuk menjadi root. 1) membuat executable 2) di tempat lain chown root, chmod +s3) mount 4) jalankan executable
ctrl-alt-delor
1

Bit SetUID pada executable memungkinkan untuk menjalankan executable pada pemilik file (bukan superuser). Untuk dapat menjalankan executable sebagai root, jalankan:

sudo chown 0:0 ./setuid-test
hon
sumber
Tentu, tapi bukan itu masalahnya. Dimungkinkan untuk memiliki program yang disetuid ke pengguna selain root. Dalam skenario dalam pertanyaan, setuid-testharus menampilkan nobodyUID.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Kamu benar. Saya berharap setuid-test menampilkan nobody, bukanroot
PHP Learner
"SetUID bit pada executable memungkinkan untuk menjalankan executable di pemilik file" dan pemilik file saya nobody, jadi saya harapkan 65534sebagai balasannya, tetapi saya melihat 1000siapa pun yang menjadi pemiliknya!
PHP Learner
2
Periksa opsi pemasangan sistem file tempat program pengujian Anda berjalan. Jika sudah di-mount dengan nosuid, maka program Anda tidak mungkin bekerja.
countermode
1
@countermode @MarkPlotnick mount | grep /home/mekembali /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP Learner