Czy można wykonać skrypt, jeśli nie ma pozwolenia na jego odczytanie? W trybie root utworzyłem skrypt i chcę, aby inny użytkownik wykonał ten skrypt, ale go nie przeczytał. Zrobiłem chmod
zabronić odczytu i zapisu, ale zezwoliłem na wykonanie, jednak w trybie użytkownika zobaczyłem komunikat: odmowa uprawnień.
shell-script
permissions
executable
jak on
źródło
źródło
Odpowiedzi:
Problem jest, że skrypt nie jest to, co jest uruchomiony, ale interpreter (
bash
,perl
,python
, itd.). Tłumacz musi przeczytać skrypt. Różni się to od „zwykłego” programu, na przykład tymls
, że program jest ładowany bezpośrednio do jądra, tak jak zrobiłby to interpreter. Ponieważ samo jądro odczytuje plik programu, nie musi się martwić o dostęp do odczytu. Tłumacz musi odczytać plik skryptu, ponieważ normalny plik musiałby zostać odczytany.źródło
Jest to możliwe tylko w przypadku plików binarnych.
Jako użytkownik nieuprzywilejowany:
Teraz jest kicker. Chociaż plik jest nieczytelny w konwencjonalny sposób, nie można tak naprawdę uniemożliwić jego odczytania. Jest to właściwie wyzwanie na http://smashthestack.org/ (poziom 13). Istnieje dobrze znane narzędzie o nazwie,
hktrace
które pozwala na odczyt pliku za pomocąptrace
.źródło
Nie jest to możliwe, przynajmniej w Linuksie (inne Uniksy mogą na to pozwolić); pomyśl o tym, kiedy uruchomisz skrypt, powłoka musi go przeczytać, aby wiedzieć, co robić.
źródło
Myślę, że możesz to zrobić
setuid
.Tyle że nie możesz, ponieważ większość dystrybucji (najwyraźniej) została
setuid
wyłączona, ponieważ jest to ogromna dziura w zabezpieczeniach. Moja jest wyłączona, więc tak naprawdę nie wiem, czy ta odpowiedź zadziała, i tak ją publikuję, ponieważ uważam, że powinna .W każdym razie, gdybym chciał zrobić to, co chciałeś - i miałem dystrybucję z
setuid
włączoną obsługą skryptów - zrobiłbym coś takiego:To znaczy, że napisałbym inny skrypt, którego jedynym celem jest wywołanie skryptu tylko do odczytu root, zmiana go na własność roota i udzielenie mu uprawnień setuid. (Wraz z towarzyszącym temu niepisywalnym statusem przez wszystkich innych).
Ponieważ funkcja myscript-nonroot jest czytelna dla wszystkich, można ją odczytać i wykonać, a do czasu uzyskania dwóch wierszy, w którym faktycznie wykonujesz skrypt (
bash myscript
), jest uruchamiany jako root (lub ktokolwiek inny, dokładny użytkownik nie ma znaczenia, o ile plik opakowania jest własnością tego samego użytkownika).źródło
4
ustawia setuid bit. Zobacz sekcję Tryby na stronie podręcznika użytkownika chmod na manpagez .755
trochę.chmod 755
jest taki sam jak ósemkowy 0775. wokół tego jest wiele zamieszania .. Ta strona ( manpagez.com/man/1/chmod ) ma okropny i nieposiadający poziomego zwoju, którego nie rozumiem ...W poprzednich stwierdzeniach jest połowa prawdy. Możesz skonfigurować skrypt, aby nie był czytelny dla użytkownika, ale nadal był wykonywalny. Proces ten jest trochę przeciągnięty, ale można go zrobić, robiąc wyjątek w / etc / sudoer, aby użytkownik mógł tymczasowo uruchomić skrypt jak sam, bez pytania o hasło. Ta metoda: - omija łatkę setuid dla innych dystrybucji. - pozwala tymczasowo przyznać podwyższone uprawnienia dla określonego skryptu, nie dając użytkownikowi prawa sudo do wszystkiego.
Postępuj zgodnie z instrukcjami w tym poście: Zezwól tylko na plik
źródło
W tej sytuacji użyłem sudo z opcją NOPASSWD, aby użytkownicy mogli uruchomić skrypt bez możliwości jego odczytania.
źródło
Działa na OpenBSD
Jak już wspomniano w komentarzu @eradman, jest to możliwe na OpenBSD.
Jako root:
Jako zwykły użytkownik:
Działa to poprzez przekazanie
/dev/fd/3
(lub cokolwiek innego otwartego fd do skryptu) do tłumacza. Ta sztuczka nie działałaby w systemie Linux, gdzie/dev/fd/N
nie są specjalne urządzenia znakowe, które zwracają adup(2)
fd po otwarciu, ale „magiczne” dowiązania symboliczne do oryginalnego pliku / dentry, które otwierają plik od zera [1]. To mogłoby być realizowane Wolny / NetBSD lub Solaris ...Ale to nie jest to, czym się spieprzyło
Zasadniczo udzielenie uprawnienia
x
(wykonania) oznacza również udzielenie uprawnieniar
(odczytu) do dowolnego pliku, który ma shebang [2]:ktrace
to nie jedyny sposób; jeśli interpreter jest dynamicznie połączony z plikiem wykonywalnym, takim jakperl
lubpython
, można zamiast tego użyćLD_PRELOAD
ed hacka, który przesłaniaread(2)
funkcję.I nie, ustawienie setuid nie uniemożliwi zwykłemu użytkownikowi oglądania jego zawartości; mogłaby po prostu go uruchomić
ptrace(2)
, co spowoduje ignorowanie bitów setuid:Jako root:
Jako zwykły użytkownik:
(przepraszam, jeśli nie jest to najłatwiejszy sposób na wykazanie tego)
[1] można to emulować w systemie Linux za pomocą
binfmt_misc
, ale interpreter będzie musiał zostać zmodyfikowany lub będzie konieczne użycie opakowania; patrz ostatnia część tej odpowiedzi na przykład celowo uczyniony absurdalnie niepewnym.[2] lub ogólnie dowolny plik, który nie spowoduje
execve()
zwrotuENOEXEC
.źródło
Tak, jeśli jesteś użytkownikiem root, możesz wykonać plik bez pozwolenia na odczyt
Ale jeśli zalogujesz się z innym użytkownikiem, nie możesz uruchomić tego pliku
źródło
Aby Twoje skrypty były nieczytelne, a jednocześnie wykonywalne, masz 3 główne opcje:
Pierwsza opcja
Użyj polecenia openssl, aby ręcznie go zaszyfrować. W przyszłości, gdy chcesz uruchomić skrypt, będziesz musiał ponownie uruchomić openssl ręcznie i podać hasło do odszyfrowania.
Szyfrowanie za pomocą openssl:
cat yourscript.sh | openssl aes-128-cbc -a -salt -k twoje hasło> twój skrypt.enc
Deszyfrowanie za pomocą openssl:
cat yourscript.enc | openssl aes-128-cbc -a -d -salt -k twoje hasło> twój skrypt.dec
yourscript.dec będzie taki sam jak oryginalny skrypt yourscript.sh
Druga opcja
Skorzystaj z witryny takiej jak www.Enscryption.com, aby automatycznie zaszyfrować skrypt i umożliwić wykonanie zaszyfrowanej wersji skryptu. Ta strona wykorzystuje zarówno funkcje szyfrowania openssl, jak i niektóre inne metody zaciemniania, aby utrudnić intruzom włamanie się do skryptu lub ujawnienie tajemnic, które chcesz ukryć. Za pomocą tej strony możesz szyfrować skrypty powłoki i wiersze poleceń perl, python, ruby. Myślę też, że php.
Trzecia opcja
Użyj narzędzia takiego jak shc . Wygląda na to, że nie był aktualizowany od 2012 roku. Ale korzystałem z niego w przeszłości. Musisz skompilować skrypt dla każdego systemu operacyjnego, na którym chcesz go używać, jeśli system operacyjny jest inny niż ten, którego użyłeś do kompilacji.
Podsumowanie:
Jeśli ukrywanie twojego kodu jest dla ciebie bardzo ważne, poleganie tylko na uprawnieniach i prawie własności pomoże ci, ponieważ każdy z rootem może się do niego dostać. To tylko fakt. Co możesz zrobić, jeśli naprawdę chcesz zapobiec nieautoryzowanemu przeglądaniu twojego kodu przez kogokolwiek, jest napisanie skryptu wokół polecenia openssl. Spraw, aby przed uruchomieniem skryptu pojawił się monit o podanie hasła, a po podaniu hasła uruchomi skrypt bez zapisywania go w pliku tymczasowym. Jeśli wydaje ci się, że to za dużo pracy, opcje 2 i 3 powinny wystarczyć do twoich celów.
źródło