Tek kelimeyle, "hayır".
Linux, yürütülebilir dosyalar ve komut dosyaları arasında gerçekten bir ayrım yapmaz; #!
başında girdi değerlendirmek çalıştırmak için ne programı çekirdek anlamanın bir yolu ama bir senaryo çalıştırılabilir tek yol değil.
Yani, örneğin, bir senaryom varsa
$ cat x
#!/bin/sh
echo hello
Sonra bunu komutla çalıştırabilirim
$ ./x
Bu, çekirdeğin denemesine ve yürütmesine, yerini bulmasına #!
ve /bin/sh x
bunun yerine etkili bir şekilde çalışmasına neden olur .
Ancak ben de bu değişkenlerden herhangi birini çalıştırabilirsiniz:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
ya da
. ./x
Çekirdek exec
katmandaki imzalamayı zorunlu kılmaya çalışsa bile, bunu sadece yorumlayıcıyı komut dosyasıyla parametre olarak çalıştırarak atlayabiliriz.
Bu, imzalama kodunun yorumlayıcının içinde olması gerektiği anlamına gelir. Ve bir kullanıcının imzalama zorlama kodu olmadan kendi kabuk kopyasını derlemesini ne engeller ?
Bunun standart çözümü imzalama kullanmak değil, Zorunlu Erişim Kontrolleri (MAC) kullanmaktır SELinux
. MAC sistemleri ile her kullanıcının tam olarak neyi çalıştırmasına ve katmanları geçişine izin verileceğini belirleyebilirsiniz. Örneğin, "normal kullanıcılar herhangi bir şeyi çalıştırabilir, ancak web sunucusu ve CGI işlemleri yalnızca /var/httpd
dizindeki öğelere erişebilir ; diğer her şey reddedilir" diyebilirsiniz .