Setuid neden çalıştırılabilir dosya üzerinde çalışmıyor?


9

Komut dosyalarında setuid'i etkinleştirmenin güvenlik sorunları olduğunu ve bu nedenle varsayılan olarak etkin olmadığını biliyorum, ancak yürütülebilir dosyalar için çalışmasını bekliyoruz. Bu yazıda açıklanan talimatları izleyerek uid çıktı olarak gösteren ve çalıştırılabilir yürütülebilir: Kabuk komut dosyalarında setuid izin

Ancak çalıştırmadan önce ve sonra aynı uid (1000) değerini döndürür sudo chmod +s ./setuid-test. Bence bu setuid'in çalıştırılabilirim üzerinde herhangi bir etkisi olmadığı anlamına geliyor, neden ve nasıl çözülecek?

Kaynak kodu:

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

İle inşa edildi ve çalıştırıldı

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

Koşarken ls -la, ben ne olsun:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

2
Yürütülebilir dosya, çalıştırdığınız kullanıcı dışında bir kullanıcının sahibi mi? (setuid kökte değişiklik anlamına gelmez; çalıştırılabilir dosyanın sahibi olan kullanıcıda değişiklik anlamına gelir.)
cjm

PHPLearner Bir dosyanın
SUID'ini

@cjm me@me:~$ ls -la setuid-test---- döndürür -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Öğrenen

7
/ Tmp dizininde yer alan parametreler / tmp setuid programlarını yasaklamak için kullanılan parametreler olduğu için, programınız ana dizinimdeyse Ubuntu 14.04 sistemimde beklendiği gibi çalışıyor. Programınız nerede?
Mark Plotnick

2
Tür df .ardından, montaj noktasını bulmak için dizindeki mount | grep nameofmountpoint. Orada nosuidlistelenen bir bayrak var mı?
Mark Plotnick

Yanıtlar:


10

Unix / Linux için tasarlanan çoğu dosya sistemi nosuid, bu dosya sistemlerinde bulunan setuid veya setgid ikili dosyalarının bir işlemin etkin kullanıcı kimliğini veya gidişini değiştirmesini önleyecek bir öznitelik ile bağlanabilir. Genellikle, yönetici olmayan bir kişinin kontrolünde olan "güvenilmeyen" dosya sistemlerini monte ederken kullanılır.

Sizin durumunuzda, kullandığınız dosya sistemi, sorubuntu'ya göre : ecryptfs türüne göre : Şifrelenmiş giriş dizini altında root setuid ile ikili çalıştırıldığında hata birkaç yıl önceki sürümlerden başlayarak otomatik olarak nosuid (ve nodev) uygular.

Https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 adresinden değişikliğin nedeninin açıklaması :

Vincent Danen 2012-07-20 11:25:56 EDT
Setuid-root olan özel ecryptfs dağıtıcı yardımcısının (/sbin/mount.ecryptfs_private), kullanıcı tarafından denetlenmeyen bir ecryptfs paylaşımına izin verebileceği bildirildi yerel sistemde. Ecryptfs yardımcısı "nosuid" ve "nodev" bayraklarıyla dosya sistemlerini bağlamadığından, bir kullanıcının ayrıcalıklarının yükselmesine yol açabilecek setuid kökü ikili dosyaları ve / veya cihaz dosyaları içeren bir dosya sistemi bağlaması mümkün olacaktır. Kullanıcının sisteme fiziksel erişimi varsa, bu bir USB aygıtı aracılığıyla yapılabilir.
...
Zorla MS_NOSUID ve MS_NODEV bağlama bayrakları 99 sürümüne eklendi.


Sistem kullanıcının setuid'e izin veren bir dosya sistemi kurmasına izin verdiyse, root olması önemsiz olacaktır. 1) yürütülebilir bir dosya oluşturun 2) başka bir yerde chown root, chmod +s3) monte edin 4) yürütülebilir dosyayı çalıştırın
ctrl-alt-delor

1

Yürütülebilir dosyadaki SetUID biti dosya sahibinde yürütülebilir dosyayı çalıştırmaya izin verir (süper kullanıcı değil). Yürütülebilir dosyayı kök olarak çalıştırabilmek için şunları yürütün:

sudo chown 0:0 ./setuid-test

Tabii, ama sorun bu değil. Kök dışında bir kullanıcıya ayarlanmış bir programa sahip olmak mümkündür. Söz konusu senaryoda, setuid-testgöstermesi gerekir nobody'ın UID.
Gilles 'SO- kötü olmayı bırak'

@Gilles Haklısın. Ben setuid-test görüntüler bekliyoruz nobody, değilroot
PHP Öğrenen

"Yürütülebilir SetUID bit dosya sahibinde çalıştırılabilir çalıştırmak için izin verir" ve benim dosya sahibi nobody, bu yüzden ben 65534karşılığında bekliyoruz , ama 1000sahibi kim olursa olsun görüyorum !
PHP Öğrenen

2
Test programınızın çalıştığı dosya sisteminin bağlama seçeneklerini kontrol edin. Takılıysa nosuid, programınız çalışmayabilir.
sayaç

1
@MarkPlotnick mount | grep /home/megeri dönüyor /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 Öğrenen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.