Jaki jest prawidłowy przypadek użycia uprawnienia do pliku „tylko do wykonania”?

20

Czytałem o chmod i jego trybach ósemkowych . Widziałem, że 1to tylko wykonanie. Jaki jest prawidłowy przypadek użycia uprawnienia tylko do wykonania? Aby wykonać plik, zwykle trzeba mieć uprawnienia do odczytu i wykonania.

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo
popedotninja
źródło

Odpowiedzi:

41

Skrypty powłoki wymagają wykonania uprawnień do odczytu, ale pliki binarne nie:

$ 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

Wyświetlanie zawartości pliku i wykonywanie ich to dwie różne rzeczy. W skryptach powłoki te rzeczy są powiązane, ponieważ są „wykonywane” poprzez „odczytanie” ich w nowej powłoce (lub bieżącej), jeśli wybaczysz uproszczenie. Dlatego musisz je przeczytać. Pliki binarne nie używają tego mechanizmu.

W przypadku katalogów uprawnienie do wykonywania jest nieco inne; oznacza to, że możesz robić różne rzeczy na plikach w tym katalogu (np. czytać je lub wykonywać). Powiedzmy, że masz zestaw narzędzi /tools, dzięki którym ludzie będą mogli korzystać, ale tylko wtedy, gdy będą o nich wiedzieć. chmod 711 /tools. Następnie elementy wykonywalne /toolsmogą być uruchamiane jawnie (np. /tools/mytool), Ale ls /tools/zostaną odrzucone. Podobnie można przechowywać dokumenty, w /private-docsktórych można je odczytać tylko wtedy, gdy znane są nazwy plików.

DopeGhoti
źródło
1
Nawiasem mówiąc, nie ma sensu ustawiać tylko wykonywania na binariach systemowych, chyba że uruchomisz anonimowy ftp.
Joshua
1
Również ustawienie bitu wykonywalnego w katalogu pozwala cdna to.
ogrodnik
1
Można również wykonać skrypt do wykonania bez pozwolenia na odczyt
phuclv
1
BTW, nie ma potrzeby dołączania stdio.htutaj nagłówka C. Sugeruję usunięcie.
Spikatrix
1
@Kevin: Prawdopodobnie dlatego, że brak pracy lsi uzupełniania tabulatorów powoduje, że prace konserwacyjne są denerwujące i nie zapewniają żadnych, jeśli w ogóle, faktycznych korzyści bezpieczeństwa. Większość plików, które mogą być zainteresowane atakującym, i tak znajduje się w znanych standardowych lokalizacjach lub ich lokalizacje można odkryć pośrednio na podstawie danych w innych plikach (w przeciwnym razie skąd programy, które legalnie wykorzystują te pliki, wiedziałyby, gdzie je znaleźć?).
Ilmari Karonen,
4

W Gentoo programom wykonawczym, które są setuid (skonfigurowane do uruchamiania z uprawnieniami właściciela zamiast wywołującego) nie ma dostępu do odczytu (tryb 4711). Ma to na celu dodanie warstwy ochrony przed wykorzystaniem błędów w celu zwiększenia eskalacji uprawnień.

Jeśli nieuprzywilejowany atakujący może odczytać plik setuid i wie o błędzie, który pozwala na atak w stylu powrotu do libc , może on być w stanie użyć zawartości pliku, aby przewidzieć, gdzie prawdopodobnie znajdą się pewne przydatne funkcje lub biblioteki umieszczane w pamięci po wywołaniu programu.

Nowoczesne systemy często zawierają dodatkowe, bardziej skuteczne zabezpieczenia, takie jak ASLR , ale ograniczenia występujące na platformach 32-bitowych mogą ułatwić ich wykorzystanie.

Nikt
źródło
Pamiętaj, że ochrona dotyczy tylko dystrybucji opartych na źródłach. Dzięki dystrybucjom binarnym atakujący może po prostu spojrzeć na własną kopię programu, aby dowiedzieć się, gdzie są interesujące rzeczy.
Mark
Plik binarny zawierający tylko pliki wykonywalne może również zawierać osadzone hasła. Użytkownik może uruchomić program i może wysłać hasło do serwera, ale użytkownik nie będzie mógł uzyskać hasła z niego (system nie powinien również pozwalać mu na zrzuty pamięci).
Barmar
1

Wygląda na to, że wartość „tylko wykonuj” nie ma większego zastosowania dla pliku, ale można go użyć, aby uniemożliwić odczytanie zawartości katalogu.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
popedotninja
źródło
1
Warto wspomnieć, że jest to przydatne, ponieważ nadal możesz odczytać foo / bar, jeśli znasz nazwę pliku. Użyłem tego na serwerach internetowych.
Random832
0

Aby wykonać skrypt, musisz mieć uprawnienia do odczytu i wykonywania. Czytanie zawartości skryptu pozwala na jego wykonanie, więc musisz być w stanie read and execute. W przeciwnym razie nie można uruchomić skryptu bez niego.

Jaki jest prawidłowy przypadek użycia uprawnienia tylko do wykonania?

Bezpieczeństwo. Niektórzy mogą chcieć chronić swoje pliki i powstrzymywać innych przed ich uruchomieniem lub użyciem.

Jordan Savell
źródło
2
chmod 000Uznaje uprawnienia nikomu oprócz root. Czasami nie musisz wybierać się tak szeroko dla samej ochrony - zależy to od intencji użytkownika. Aby to zrobić, powiedzmy „ponownie chmod” plik z powrotem do czytelnych i zapisywalnych uprawnień, przez które musiałbyś to zrobić root. Jeśli nie możesz uzyskać dostępu root, będzie to trudne.
Jordan Savell,
2
Powiedzmy, że masz zestaw narzędzi /tools, dzięki którym ludzie będą mogli korzystać, ale tylko wtedy, gdy będą o nich wiedzieć. chmod 711 /tools. Rzeczy następnie wykonywalne w /tools może działać jawnie, ale ls /tools/będą odrzucane.
DopeGhoti,
1
Dobra odpowiedź! Nauczyłem się tam również czegoś. Dlaczego pliki binarne nie wymagają wykonania uprawnienia do odczytu?
Jordan Savell,
2
Ponieważ wyświetlanie zawartości pliku i wykonywanie ich to dwie różne rzeczy. Skrypty powłoki są „wykonywane” przez „odczytanie” ich w nowej powłoce (jeśli wybaczysz uproszczenie), dlatego musisz być w stanie je odczytać. Pliki binarne nie używają tego mechanizmu.
DopeGhoti,
1
Ach zdrowy rozsądek. Myślałem, że to coś innego - dzięki!
Jordan Savell,