Cel uprawnień, takich jak 0111 lub 0333

17

Jaki jest cel uprawnień Linuksa, takich jak 111 lub 333 (tzn. Użytkownik może wykonać , ale nie może odczytać pliku), jeśli zdolność do wykonania nie oznacza automatycznie możliwości odczytu?

wózek 813
źródło
1
Czy masz przykład takiego ustawienia? Myślę, że masz rację. Nie możesz wykonać tego, czego nie możesz przeczytać. Te kombinacje są tylko teoretyczne w zakresie uprawnień między 0000 a 0777. Zauważ, że należy dodać wiodące 0, aby pokazać ósemkową podstawę liczby.
ikrabbe,
6
O ile nie jest to skrypt (np. Skrypt-powłoki), tak naprawdę nie potrzebujesz uprawnień do odczytu, aby wykonać polecenie. „Normalny” plik wykonywalny - np. su, bash lub vi - wystarczy ustawić bit wykonywalny, aby użytkownik mógł go uruchomić. Plik, którego nie można odczytać, nie można skopiować . Tak więc, nie pozwalając użytkownikowi na skopiowanie ważnego dla bezpieczeństwa polecenia (takiego jak su), uniemożliwił mu wykonanie własnej kopii - a także spróbował ją zdemontować. * BSD ma kilka poleceń z uruchomieniem, ale nie ma uprawnień do odczytu.
Baard Kopperud

Odpowiedzi:

25

Grałem z nim i najwyraźniej uprawnienia do wykonywania nie oznaczają uprawnień do odczytu. Pliki binarne mogą być wykonywalne bez możliwości odczytu:

$ echo 'int main(){ puts("hello world"); }' > hw.c
$ make hw
$ ./hw
hello world
$ chmod 111 hw
$ ./hw 
hello world
$ cat hw
/bin/cat: hw: Permission denied

Nie mogę jednak wykonywać skryptów, chyba że mają one zarówno bity uprawnień do odczytu, jak i wykonywania:

$ cat > hw.sh
#!/bin/bash
echo hello world from bash
^D
$ chmod +x ./hw.sh
$ ./hw.sh 
hello world from bash
$ chmod 111 ./hw.sh
$ ./hw.sh
/bin/bash: ./hw.sh: Permission denied
PSkocik
źródło
4
Jest to poprawne, ponieważ w drugim przykładzie użyto #! aby rozpocząć, ponieważ brakuje nagłówka ELF i dlatego wymaga, aby plik był czytelny, aby mógł odgadnąć, który plik wykonywalny go używa. Jest to częsta sytuacja, w której chcesz chronić zawartość plików przed skopiowaniem do innych lokalizacji. Menedżer licencji jest częstym przykładem, w którym można to zobaczyć.
hspaans,
1
Zauważ, że nadal możesz czytać plik binarny tylko do uruchomienia
小 太郎
6
@hspaans: Shebang jest obsługiwany przez jądro, a jądro nie przejmuje się dziwnymi drobiazgami, takimi jak uprawnienia. To powłoka (lub tłumacz), która wymaga dostępu do odczytu. Jądro działa (powiedzmy) /bin/bash hw.sh, a następnie bash próbuje otworzyć się hw.shdo odczytu (i kończy się niepowodzeniem).
Kevin
2
I na jedną wielką nadzieję, że jądro robi opieki o uprawnieniach. Nic innego nie robi. Straszne zdanie w poście @ Kevina oznacza, że ​​jądro wymaga jedynie uprawnień do wykonywania plików, niezależnie od tego, czy używają szelangu.
Emil Jeřábek wspiera Monikę
2
@ EmilJeřábek Jądro dba o uprawnienia przy podejmowaniu decyzji, co może zrobić proces aplikacji. Ale ponieważ jest to komponent, który implementuje uprawnienia, może je również zignorować wewnętrznie. Dzięki temu może odczytać linię shebang podczas określania sposobu wykonania interpretowanego pliku lub odczytać zawartość pliku binarnego tylko do wykonania do pamięci.
Barmar
16

ma to sens w przypadku katalogów, na przykład, jeśli trzymasz (tajne) pliki wykonywalne w określonym katalogu, a następnie pozwalasz użytkownikom wywoływać te pliki bez możliwości zobaczenia zawartości katalogu (ale wiedząc, że określony plik istnieje po ich poinformowaniu!). 333 w porównaniu do 111 pozwala na zapisywanie / usuwanie plików do / z tych katalogów bez możliwości zobaczenia zawartości katalogu.

Afsin Toparlak
źródło
5
W moim uniwersytecie te uprawnienia były używane do upuszczania zadań do katalogu bez studentów, którzy widzieliby pracę innych. Wykładowcą był stary skool.
DarkHeart,
@DarkHeart Ciekawe. Mam nadzieję, że musiałeś dodać losowy komponent do nazw plików, ponieważ w przeciwnym razie, jeśli nie będzie to zachętą do kopiowania od kolegów z klasy, nie wiem, co to jest.
PSkocik,
5

Oczywiście nie wszystkie kombinacje są tak przydatne, ale biorąc pod uwagę tę, o której wspominałeś ... W rzeczywistości nie potrzebujesz readpozwolenia na wykonanie pliku - tylko executeuprawnienie - chyba że dany plik jest skryptem (np. Skryptem powłoki ( .sh), perl-script ( .pl) i tak dalej). Normalne pliki binarne można uruchamiać tylko za executezgodą. W systemach * BSD kilka plików wykonywalnych daje executepozwolenie bez zezwolenia read, szczególnie na polecenia „ważne dla bezpieczeństwa” - np su.

Dlaczego więc nie dać użytkownikom readuprawnień (i po prostu- executeuprawnień)? Stwórz plik, którego użytkownik nie może odczytać, nie może go również skopiować ! Usunięcie readuprawnienia uniemożliwia użytkownikom tworzenie własnych „osobistych” kopii plików wykonywalnych - które później mogą być w stanie nadużyć (np. Uzyskać SUID=root on).

Brak opcji write-permission uniemożliwia dostęp do pliku.

Pamiętaj, nie dając ani read-nor write-permission do właściciela jest nieco rzadko, ale czasami może to być dobry pomysł, aby zapobiec nawet ownerz tylko usunięcie pliku. Oczywiście owner- nie wspominając root- zawsze może obejść takie środki, jeśli nie w inny sposób, to po prostu za chmodpozwoleniem na plik.

Baard Kopperud
źródło
„dobrym pomysłem może być nawet ownerusunięcie pliku”. - z tym wyjątkiem, że nie potrzebujesz żadnego zezwolenia na plik (odczyt, zapis lub wykonanie), aby go usunąć.
Celada,
Pliki wykonywalne tylko do użycia można wykorzystać na przykład, jeśli plik wykonywalny osadza hasło do bazy danych, którego używa, gdy jest uruchamiany w celu połączenia z bazą danych i wykonania zadania, ale niekoniecznie chce ujawnić hasło.
Celada,
@Celada, to stare pytanie, ale czy takie podejście nie byłoby podatne na zrzucanie pamięci poprzez przeglądanie przesunięć regionów pamięci, /proc/${PID}/mapsa następnie czytanie odpowiednich sekcji pamięci /proc/${PID}/mem? Czy też ograniczenie uprawnień do pliku wykonywalnego ogranicza również uprawnienia do odczytu jego odpowiednich sekcji w pamięci podczas wykonywania? (To ostatnie wydaje się mało prawdopodobne, IMO.)
Spencer D