Jakie są problemy z bezpieczeństwem i warunki wyścigu podczas używania polecenia „find -exec”?

14

Od findstrony man :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

Co to znaczy? Dlaczego istnieją warunki wyścigu z uruchomieniem go z katalogu startowego? A jakie są te zagrożenia bezpieczeństwa?

Danny Tuppeny
źródło
Powiązane: Dlaczego zapętlanie wyników wyszukiwania jest złą praktyką? gdzie jest to ujęte w niektórych odpowiedziach.
Stéphane Chazelas,

Odpowiedzi:

13

Znalazłem szczegóły tutaj :

Ta -execczynność powoduje uruchomienie innego programu. Przekazuje do programu nazwę pliku, który jest obecnie rozpatrywany. Wywoływany program zwykle wykonuje następnie pewne działania na tym pliku. Po raz kolejny istnieje warunek wyścigu, który można wykorzystać tutaj. Jako konkretny przykład weźmiemy polecenie

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

W tym prostym przykładzie identyfikujemy tylko jeden plik do usunięcia i wzywamy go /bin/rmdo usunięcia. Problem istnieje, ponieważ istnieje przerwa czasowa między punktem, w którym find decyduje, że musi przetworzyć -execakcję, a momentem, w którym /bin/rmpolecenie faktycznie wydaje wywołanie systemowe unlink () w celu usunięcia pliku z systemu plików. W tym czasie osoba atakująca może zmienić nazwę /tmp/umsp katalogu, zastępując go dowiązaniem symbolicznym /etc. Nie ma sposobu, /bin/rmaby ustalić, że działa on na tym samym pliku, który miał na myśli znaleziony plik. Po umieszczeniu dowiązania symbolicznego atakujący namówił funkcję find do usunięcia /etc/passwdpliku, co nie jest skutkiem zamierzonego polecenia.

Nie jestem pewien, jak prawdopodobne jest, że ktokolwiek mógłby to wykorzystać; ale chyba jest odpowiedź!

Danny Tuppeny
źródło
W powyższym przypadku execdirnajpierw /tmp/umspuruchomiłby chdir przed uruchomieniem polecenia, a więc teoretycznie, atakujący ponownie podłączając katalog nie miałby żadnego skutku .. jeśli ponowne połączenie nastąpiło po znalezieniu „decyduje” o ocenie, -execale zanim rmpolecenie może wykonać swoją pracę. Zastanawiam się jednak, dlaczego miałoby to mieć znaczenie: atakujący może po prostu wykonać ponowne połączenie po tym, jak użytkownik zdecyduje się napisać findpolecenie.
Otheus
1
@RuiFRibeiro Łącze nie jest argumentem przekazywanym do polecenia, jest to katalog pośredni. /tmp/umspjest katalogiem, gdy findgo widzi, ale po rmuruchomieniu zaatakowany zmienił go na symboliczny link do /etc. /tmp/umsp/passwdprzez cały czas jest zwykłym plikiem, ale nie tym samym.
Gilles „SO- przestań być zły”
2

Uważam, że powodem, dla którego -execjest niebezpieczny, jest to, że jeśli użytkownik nie określi pełnej nazwy i ścieżki do programu, który ma zostać wykonany, potencjalnie wykona niewłaściwy program.

Przykład:

find /some/path -exec coolprogram

W /some/path, ktoś zrobił inny coolprogram, i to przesyła wszystkie twoje dane do jakiegoś złego aktora.

Ale poczekaj, mówisz, czy nie musisz go wykonywać jako ./coolprogram? Tak, ale niektórzy mają PATH=.:/bin:whatever, co spowoduje uruchomienie programu w bieżącym katalogu.

Jest to prawdopodobnie uproszczone, ale myślę, że w niektórych przypadkach może być niebezpieczne. Musiałem raz rozwiązać problem, w którym zero bajtów cpioznalazło się w niewłaściwym katalogu. Spowodowało to awarię programu, ponieważcpio nie działał, ponieważ działał plik zero bajtów w katalogu.

Doug
źródło
3
Ryzyka te nie są izolowane find -exec. Jeśli postawiłeś .na swojej ścieżce, po prostu wykonanie coolprogramw bieżącym katalogu jest już niebezpieczne, niezależnie od tego, czy używasz findtego, czy nie!
Danny Tuppeny,
1
Zgadzam się, ale wydaje się, że -execdir obserwuje warunek, o którym również wspomniałem:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug
Myślę, że morał tej historii jest taki. na twojej drodze jest też zły pomysł, dlatego upewniam się, że go tam nie ma.
Doug
Interesujące, aby wiedzieć o niedozwoleniu .na ścieżce i {}w poleceniu. Być może w przyszłości Linux po prostu .całkowicie zabrania ścieżek i narzędzia nie będą musiały wdrażać własnych kontroli bezpieczeństwa! :)
Danny Tuppeny,
1
Myślę, że 90% kodu, który piszę, służy jedynie uchwyceniu 5% rzeczy, które się nie udają. :)
Doug