Chciałbym móc wyodrębnić plik tar, tak aby wszystkie wyodrębnione pliki zostały umieszczone w określonym katalogu prefiksów. Każda próba zapisania plików tar do zewnętrznych katalogów przez pliki tar powinna spowodować niepowodzenie wypakowania.
Jak możesz sobie wyobrazić, jest to tak, że mogę bezpiecznie wyodrębnić niezaufany plik tar.
Jak mogę to zrobić z GNU tar
?
Wymyśliłem:
tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar
ale nie jestem pewien, czy to wystarczająco paranoiczne.
-t
opcji.Odpowiedzi:
W ogóle nie potrzebujesz paranoi. GNU
tar
- a właściwie każdy dobrze napisanytar
program wyprodukowany w ciągu ostatnich 30 lat -..
domyślnie odmawia wyodrębnienia plików z tarballa, które zaczynają się od ukośnika lub zawierają elementy.Musisz zrobić wszystko, aby zmusić nowoczesne
tar
programy do wyodrębnienia takich potencjalnie złośliwych plików tar: zarówno GNU, jak i BSDtar
potrzebują-P
opcji, aby wyłączyć tę ochronę. Zobacz sekcję Bezwzględne nazwy plików w podręczniku GNU tar.-P
Flaga nie jest określony przez POSIX ¹ chociaż, więc innetar
programy mogą mieć różne sposoby radzenia sobie z tym. Na przykład, Schily tools'star
programowe zastosowania-/
i-..
wyłączyć te zabezpieczenia.Jedyną rzeczą, którą możesz rozważyć dodanie do naiwnego
tar
polecenia, jest-C
flaga wymuszająca wypakowanie go z bezpiecznego katalogu tymczasowego, więc nie musisz gocd
najpierw robić .Oprócz :
Technicznie
tar
nie jest już w ogóle określony przez POSIX. Próbowali powiedzieć światu obliczeniowemu Unix, że powinniśmypax
teraz używać zamiasttar
icpio
, ale świat komputerów w dużej mierze je zignorował.Warto tutaj zauważyć, że specyfikacja POSIX dla
pax
nie mówi, jak powinna obsługiwać wiodące ukośniki lub..
elementy osadzone . BSD ma niestandardową--insecure
flagę do tłumienia zabezpieczeń przed osadzonymi elementami ścieżki, ale najwyraźniej nie ma domyślnej ochrony przed wiodącymi ukośnikami; strona podręcznika BSD pośrednio zaleca pisaniepax
..
pax
-s
reguł zastępowania, aby poradzić sobie z absolutnym ryzykiem ścieżki.Tak dzieje się, gdy de facto standard pozostaje w użyciu, podczas gdy standard de jure jest w dużej mierze ignorowany.
źródło
pax - portable archive interchange
Awww, jak słodko, POSIX myśli, że zastąpi prawdopodobnie najczęściej używany format archiwum: PZ GNU tar jest to po prostu
w pustym katalogu. GNU tar automatycznie usuwa wyprzedzenie
/
nazwy członków podczas wypakowywania, chyba że wyraźnie zaznaczono inaczej z--absolute-names
opcją . GNU tar wykrywa również, kiedy użycie../
spowoduje wyodrębnienie pliku poza katalog najwyższego poziomu i umieszcza te pliki w katalogu najwyższego poziomu, np. Komponentfoo/../../bar/qux
zostanie wyodrębniony jakbar/qux
w katalogu najwyższego poziomu, a niebar/qux
w elemencie macierzystym katalogu najwyższego poziomu . GNU tar dba również o dowiązania symboliczne wskazujące poza katalog najwyższego poziomu, np.foo -> ../..
Ifoo/bar
nie spowodujebar
wyodrębnienia poza katalog najwyższego poziomu.Zauważ, że dotyczy to tylko (wystarczająco najnowszych wersji) tar GNU (a także niektórych innych implementacji, np. * Tar BSD i tar BusyBox). Niektóre inne implementacje nie mają takiej ochrony.
Z powodu dowiązań symbolicznych stosowane zabezpieczenia nie byłyby wystarczające: archiwum może zawierać dowiązanie symboliczne wskazujące na katalog poza drzewem i rozpakować pliki w tym katalogu. Nie ma sposobu, aby rozwiązać ten problem wyłącznie na podstawie nazw członków, musisz zbadać cel dowiązań symbolicznych.
Pamiętaj, że jeśli rozpakowujesz katalog, który zawiera już dowiązania symboliczne, gwarancja może już nie obowiązywać.
źródło
Aby uwzględnić kilka punktów, inne odpowiedzi nie:
Najpierw sprawdź, co jest w pliku, zanim go rozpakujesz:
Jeśli jest tam coś, czemu nie ufasz lub chcesz go wyodrębnić, nie rozpakuj archiwum.
źródło