Możesz uruchomić niewłaściwy program. Ktoś może zmusić cię do uruchomienia ich programu.
The -execdir
Działanie prowadzi swoją komendę z katalogu, który zawiera plik (s) stwierdzono. Gdy $PATH
zawiera ścieżki względne, takie jak .
cokolwiek, co się nie zaczyna/
, -execdir
jest niepewne, ponieważ katalog, w którym znajduje się plik (lub inny katalog rozwiązany względem niego) może również zawierać plik wykonywalny o tej samej nazwie, co ten, którego próbujesz biegać. Ten potencjalnie niezaufany plik wykonywalny zostałby wtedy uruchomiony.
Może to być celowo wykorzystane przez innego użytkownika, aby spowodować uruchomienie jego programu, co może spowodować uszkodzenie lub naruszenie bezpieczeństwa danych, zamiast programu, który próbujesz uruchomić. Lub, rzadziej, może to po prostu spowodować nieumyślne uruchomienie niewłaściwego programu, nawet bez próby spowodowania problemu.
Jeśli wszystko w PATH
zmiennej środowiskowej jest ścieżka bezwzględna, ten błąd nie powinien wystąpić, nawet jeśli katalog szukasz i -execdir
ing z jest zawarty w PATH
. (Sprawdziłem, czy to działa.) Jeśli uważasz, że nie masz żadnych katalogów względnych, $PATH
ale nadal pojawia się ten błąd, zaktualizuj swoje pytanie o szczegóły, w tym dane wyjściowe echo "$PATH"
.
Konkretny przykład.
Jako przykład tego, co może pójść nie tak, załóżmy:
- Alice ma
.
ją, $PATH
ponieważ chce móc uruchamiać programy w dowolnym katalogu, w którym by się nie znajdowała cd
, bez zawracania sobie głowy dodawaniem ich nazwisk ./
.
- Wróg Alicji, Ewa, dzielił się
/home/eve/shared
z Alicją.
- Alice chce statystyk (wierszy, słów, bajtów) w
.c
plików, które Eve jej udostępniła.
Więc Alice działa:
find ~eve/shared -name \*.c -execdir wc {} \;
Na nieszczęście dla Alicji Eve stworzyła własny skrypt, nazwał go wc
, ustawiła jako wykonywalną ( chmod +x
) i umieściła go potajemnie w jednym z katalogów /home/eve/shared
. Scenariusz Ewy wygląda następująco:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Więc kiedy zastosowania Alice find
z -execdir
biec wc
na plikach Ewa jest wspólne, a dojdzie do plików znajdujących się w tym samym katalogu co niestandardowego Ewy wc
skryptu, Evewc
tras - ze wszystkich przywilejów Alicji!
(Podstępna, Ewa sprawiła, że jej wc
skrypt działa jak opakowanie systemu wc
, więc Alice nawet nie wie, że coś poszło nie tak, tzn. Żedo_evil
zostało uruchomione. Jednak możliwe są prostsze - i bardziej wyrafinowane - warianty. )
Jak find
temu zapobiec.
find
zapobiega występowaniu tego problemu bezpieczeństwa, odmawiając podjęcia -execdir
działania, gdy $PATH
zawiera katalog względny.
find
oferuje dwa komunikaty diagnostyczne w zależności od konkretnej sytuacji.
Jeśli .
jest $PATH
, to (jak widzieliście) mówi:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
Prawdopodobnie ma specjalny komunikat dla .
sprawy, ponieważ jest szczególnie powszechny.
Jeżeli względna ścieżka inna niż .
--say, foo
--appears w $PATH
i uruchomić find
z -execdir
, to mówi:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
Lepiej nie mieć ścieżek względnych $PATH
.
Ryzyko posiadania .
lub innych względnych ścieżek $PATH
jest szczególnie zwiększone, gdy używasz narzędzia, które automatycznie zmienia katalog, dlatego find
nie pozwalasz na użycie -execdir
w tej sytuacji.
Ale posiadanie względnych ścieżek, szczególnie .
w twoim, $PATH
jest z natury ryzykowne i tak naprawdę najlepiej go unikać. Rozważ sytuację fikcyjną w powyższym przykładzie. Załóżmy, że zamiast biegać find
, Alice po prostu cd
s do ~eve/shared/blah
i biegnie wc *.c
. Jeśli blah
zawiera wc
skrypt Eve , do_evil
działa jako Alice.
Jest znacznie Szczegółowe informacje tutaj . Kolejna doskonała referencja jest tutaj . Cytat z pierwszego odniesienia:
Od drugiego odniesienia:
źródło
Głównym problemem jest wartość zmiennej systemowej,
PATH
która zawiera w sobie foldery względne, więc ze względów bezpieczeństwafind
polecenie nie pozwala na uruchamianie plików binarnych, ponieważ potencjalnie może on uruchamiać niewłaściwe programy.Na przykład, jeśli masz bieżący katalog w ŚCIEŻCE zgodnie z ostrzeżeniem, które otrzymujesz:
a ty wykonasz polecenie:
na wypadek gdybyś miał w nim skrypt lokalny (
rm
z flagami wykonywalnymi)rm -fr /
, może usunąć wszystkie twoje pliki, ponieważ zamiast wykonywania oczekiwanego/bin/rm
, wykonaszrm
z bieżącego katalogu, więc prawdopodobnie nie jest to, czego chciałeś.Na marginesie, jest to znany problem w Travis CI ( GH # 2811 ), gdy kończy się błędem:
Rozwiązaniem jest więc usunięcie zmienionego wpisu ze zmiennej PATH, np
jak zaproponował drogus . Postęp tego błędu można śledzić na GH # 4862 .
Oto obejście wersji Bash:
Przykładowe użycie (przekazanie filtrowane
PATH
do określonego polecenia):źródło
sed
co wydaje się usuwać wszystkie rzeczy,find
których nie lubi: askubuntu.com/questions/621132/…xargs
ibash -c cd
obejścieOk, poddaję się:
sed
obejścieNieco mniej przyjemne niż poprzednie obejście:
Testcase:
W
rename
szczególności możesz także obejść niektóre perge regex-fu: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971RTFS miażdży nadzieję
Dla tych, którzy mają nadzieję, że istnieje sposób na zignorowanie opinii
find
, pozwólcie, że zmiażdżę to jakimś źródłem:Z tego wynika, że wydaje się, że nie ma możliwości wyłączenia sprawdzania ścieżki.
Dokładna reguła, którą sprawdza, to: niepowodzenie, jeśli
PATH
jest albo puste, albo nie zaczyna się od/
.źródło