"Yalnızca yürüt" dosya izni için geçerli bir kullanım durumu nedir?


20

Chmod ve sekizli modları üzerine okuyordum . Sadece 1idam edildiğini gördüm . Yalnızca yürütme izni için geçerli bir kullanım durumu nedir? Bir dosyayı yürütmek için, genellikle okuma ve yürütme izni gerekir.

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo

Yanıtlar:


41

Kabuk betikleri için okuma izninin yürütülmesi gerekir, ancak ikili dosyalar şunları gerektirmez:

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

Bir dosyanın içeriğini görüntülemek ve yürütmek iki farklı şeydir. Kabuk komut dosyalarında, bunlar basitleştirmeyi affederseniz, bunları yeni bir kabuk (veya geçerli kabuk) içinde "okuyarak" yürütüldükleri için ilişkilidir. Bu yüzden onları okuyabilmeniz gerekir. İkili dosyalar bu mekanizmayı kullanmaz.

Dizinler için yürütme izni biraz farklıdır; Eğer dosyalara şeyler yapmak anlamına gelir içinde (örneğin okumak veya bunları yürütme) bu dizinin. Diyelim ki /toolsinsanların kullanabilmesini istediğiniz bir takım araçlarınız var , ancak yalnızca onlar hakkında bilgi sahibi oldukları takdirde. chmod 711 /tools. Ardından, yürütülebilir dosyalar /toolsaçıkça çalıştırılabilir (örn. /tools/mytool), Ancak ls /tools/reddedilecektir. Benzer şekilde, /private-docsyalnızca dosya adları biliniyorsa okunabilecek belgeler saklanabilir .


1
Bu arada, anonim ftp çalıştırmadıkça artık yalnızca sistem ikili dosyalarında yürütme ayarının bir anlamı yoktur.
Joshua

1
Ayrıca, bir dizindeki yürütülebilir bitin ayarlanması bu dizine izin verir cd.
gardenhead


1
BTW, C başlığını stdio.hburaya eklemenize gerek yoktur . Kaldırmanızı öneririm.
Şubat 17'de Spikatrix

1
@Kevin: Muhtemelen lsve sekme tamamlama çalışmasının olmaması bakım işini can sıkıcı hale getirir ve gerçek bir güvenlik yararı varsa çok az şey sağlar. Bir saldırganın ilgilenebileceği dosyaların çoğu zaten bilinen standart konumlardadır veya konumları diğer dosyalardaki verilerden dolaylı olarak bulunabilir (aksi halde bu dosyaları meşru olarak kullanan programlar onları nerede bulacağını nasıl bilebilir?).
Ilmari Karonen

4

Gentoo'da setuid (invoker yerine sahibinin izinleriyle çalışacak şekilde ayarlanmış) yürütülebilir programların okuma erişimi reddedilir (mod 4711). Bu, ayrıcalık artışına yardımcı olmak için hataların sömürülmesine karşı bir koruma katmanı eklemek içindir.

Ayrıcalıksız bir saldırgan bir setuid dosyasını okuyabiliyorsa ve libc tarzı bir saldırıya izin veren bir hata biliyorsa, bazı yararlı işlevlerin veya kitaplıkların nerede olabileceğini tahmin etmek için dosyanın içeriğini kullanabilirler. program çağrıldığında belleğe yerleştirilir.

Modern sistemler genellikle ASLR gibi daha etkili ek korumalar içerir , ancak 32 bit platformlarda bulunan kısıtlamalar onları daha kolay kullanılabilir hale getirebilir.


Korumanın yalnızca kaynak tabanlı dağıtımlar için geçerli olduğunu unutmayın. İkili tabanlı dağıtımlarda, saldırgan ilginç şeylerin nerede olduğunu bulmak için programın kendi kopyasına bakabilir.
Mark

Yalnızca yürütülebilir bir ikili dosya da katıştırılmış parolalara sahip olabilir. Kullanıcı programı çalıştırabilir ve parolayı sunucuya gönderebilir, ancak kullanıcı parolayı ondan alamaz (sistem çekirdek dökümlerini de yapmasına izin vermemelidir).
Barmar

1

Görünüşe göre "sadece yürüt" değerinin bir dosya için fazla bir kullanımı yoktur, ancak bir dizinin içeriğini okumasını önlemek için kullanılabilir.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied

1
Bunun yararlı olmasının nedeni, dosya adını biliyorsanız hala foo / bar okuyabilmenizdir. Bunu web sunucularında kullandım.
Random832

0

Bir komut dosyasını yürütmek için okuma ve yürütme izinlerine sahip olmanız gerekir. Bir komut dosyasının içeriğini okumak, çalıştırılmasına izin veren şeydir, bu yüzden yapabilmeniz gerekir read and execute. Aksi takdirde, komut dosyası olmadan çalıştıramazsınız.

Yalnızca yürütme izni için geçerli bir kullanım durumu nedir?

Güvenlik. Bazıları dosyalarını korumak ve başkalarının bunları yürütmesini veya kullanmasını durdurmak isteyebilir.


2
chmod 000Bunun dışında hiç kimsenin izinlerini dikkate almaz root. Bazen sadece koruma için bu kadar kapsamlı olmanıza gerek yoktur - bu kullanıcının niyetlerine bağlıdır. Bunu yapmak için, dosyayı bunu yeniden yapmanız gereken okunabilir ve yazılabilir izinlere "yeniden chmod" diyelim root. Eğer erişemiyorsanız root, o zaman zor olacaktır.
Jordan Savell

2
Diyelim ki /toolsinsanların kullanabilmesini istediğiniz bir takım araçlarınız var , ancak yalnızca onlar hakkında bilgi sahibi oldukları takdirde. chmod 711 /tools. Sonra çalıştırılabilir şeyler de /tools açıkça çalıştırılabilir, ancak ls /tools/reddedilecektir.
DopeGhoti

1
İyi cevap! Orada da bana bir şey öğretti. İkili dosyaların yürütülmesi için neden okuma iznine gerek yoktur?
Jordan Savell

2
Çünkü bir dosyanın içeriğini görüntülemek ve yürütmek iki farklı şeydir. Kabuk komut dosyaları yeni bir kabukta "okunarak" yürütülür (basitleştirmeyi affederseniz), bu yüzden bunları okuyabilmeniz gerekir. İkili dosyalar bu mekanizmayı kullanmaz.
DopeGhoti

1
Ah sağduyu. Farklı bir şey olduğunu düşündüm - teşekkürler!
Jordan Savell
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.