Jak bezpiecznie wyodrębnić niezaufany plik tar?

30

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.

Demi
źródło
2
To nie wystarczy paranoik. W przeszłości konstruowałem paskudne tarballi, które wznosiły się za pomocą symbolicznych linków, które stworzyły. Skończyło się na tym, że utworzyłem własną tarę, która była setuid-root, aby mogła uruchamiać chroot („.”) I upuszczać uprawnienia.
Jozuego
8
@Joshua, więc rozwiązaniem, które sprawiło, że bardzo szeroko testowane narzędzie było bezpieczniejsze, było stworzenie własnej wersji i nadanie jej uprawnień roota?
Stop Harming Monica
4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || wyjście (1); setuid (getuid ()); jest łatwy do skontrolowania.
Joshua
2
Możesz również sprawdzić zawartość pliku tar, korzystając z -topcji.
Thomas

Odpowiedzi:

40

W ogóle nie potrzebujesz paranoi. GNU tar- a właściwie każdy dobrze napisany tarprogram 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 tarprogramy do wyodrębnienia takich potencjalnie złośliwych plików tar: zarówno GNU, jak i BSD tarpotrzebują -Popcji, aby wyłączyć tę ochronę. Zobacz sekcję Bezwzględne nazwy plików w podręczniku GNU tar.

-PFlaga nie jest określony przez POSIX ¹ chociaż, więc inne tarprogramy mogą mieć różne sposoby radzenia sobie z tym. Na przykład, Schily tools' starprogramowe zastosowania -/i -..wyłączyć te zabezpieczenia.

Jedyną rzeczą, którą możesz rozważyć dodanie do naiwnego tarpolecenia, jest -Cflaga wymuszająca wypakowanie go z bezpiecznego katalogu tymczasowego, więc nie musisz go cdnajpierw robić .


Oprócz :

  1. Technicznie tarnie jest już w ogóle określony przez POSIX. Próbowali powiedzieć światu obliczeniowemu Unix, że powinniśmy paxteraz używać zamiast taricpio , ale świat komputerów w dużej mierze je zignorował.

    Warto tutaj zauważyć, że specyfikacja POSIX dla paxnie mówi, jak powinna obsługiwać wiodące ukośniki lub ..elementy osadzone . BSD ma niestandardową --insecureflagę 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.

Warren Young
źródło
7
pax - portable archive interchangeAwww, jak słodko, POSIX myśli, że zastąpi prawdopodobnie najczęściej używany format archiwum: P
kot
1
@cat Domyślny format archiwum jest dość szeroko obsługiwanym wariantem tar (AIUI ma również obsługiwać format cpio). Pax jest raczej próbą zastąpienia interfejsu poleceń do obsługi takich archiwów, ponieważ obsługa argumentów polecenia tar jest ... dziwaczna.
Random832 18.04.16
Losowa uwaga: jestem pewien, że to „de Jour”, czyli francuskie słowo, w przeciwieństwie do „de jure”.
Pozew Fund Moniki z dnia
7
@QPaysTaxes to nie jest. de jure jest łaciną i kontrastuje z obecną sytuacją, tj. z tym, co jest de facto. De Jour powinien również być du Jour, aby przestrzegać francuskich zasad gramatyki.
Prime
1
Jest to przypadek niefortunnego fałszywego pokrewnego. Francuski „du jour” („dnia”) wygląda / brzmi bardzo podobnie do łacińskiego „de jure” („prawa”) w przeciwieństwie do „de facto” („faktu”). Można argumentować, że pax jest „standardem miesiąca” lub „standardem du Jour”, który naśmiewa się z tego, jak często proponowane są nowe standardy, podczas gdy ogromna liczba użytkowników po prostu pozostaje z tym, co dla nich działa (de facto standard), wiedząc, że (metaforycznie) jutro będzie nowy standard, który będą ignorować.
Monty Harder
19

Z GNU tar jest to po prostu

tar -xvf untrusted_file.tar

w pustym katalogu. GNU tar automatycznie usuwa wyprzedzenie/ nazwy członków podczas wypakowywania, chyba że wyraźnie zaznaczono inaczej z --absolute-namesopcją . 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. Komponent foo/../../bar/quxzostanie wyodrębniony jak bar/quxw katalogu najwyższego poziomu, a nie bar/quxw elemencie macierzystym katalogu najwyższego poziomu . GNU tar dba również o dowiązania symboliczne wskazujące poza katalog najwyższego poziomu, np. foo -> ../..I foo/barnie spowoduje barwyodrę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ć.

Gilles „SO- przestań być zły”
źródło
6

Aby uwzględnić kilka punktów, inne odpowiedzi nie:

  1. Najpierw sprawdź, co jest w pliku, zanim go rozpakujesz:

    tar -tvf untrusted_tar_file.tar
    

    Jeśli jest tam coś, czemu nie ufasz lub chcesz go wyodrębnić, nie rozpakuj archiwum.

  2. Po drugie, wyodrębnij archiwum tar jako użytkownik inny niż root, który ma dostęp tylko do zapisu do jednego katalogu, do którego wyodrębniasz archiwum. Na przykład wyodrębnij plik archiwum z katalogu domowego użytkownika innego niż root.
Andrew Henle
źródło
4
1. Nie jest to praktyczne w przypadku operacji wsadowych. 2. O ile nie korzystasz z niestandardowej konfiguracji, wszyscy użytkownicy mogą zapisać niektóre lokalizacje, w szczególności / tmp /
pipe
@pipe można również utworzyć katalog i nowego użytkownika i tylko ten użytkownik ma dostęp tylko do tego katalogu, a następnie uruchomić polecenie. Bardzo podoba mi się mój katalog domowy, dziękuję.
kot
2
@pipe Dlaczego, na Bożą dobrą Ziemię, NIGDY nie przekazywałbyś niezaufanych danych poprzez operację wsadową? Jeśli nie ufasz, NIE uruchamiasz go bez nadzoru.
Andrew Henle,
6
@AndrewHenle Uhm, ok. Jak myślisz, jak działa każdy serwer w Internecie? Czy uważasz, że jakiś facet z stackexchange przepuszcza ten komentarz przez swoją bazę danych i system znaczników podczas ręcznego monitorowania operacji? Ponieważ dane wejściowe to niezaufane dane za pomocą operacji wsadowej.
rura
Nie polecam rozpakowywania niezaufanego pliku bezpośrednio w katalogu domowym. Nie chcesz, żeby to nadpisało ciebie .bashrc i inne pliki .config /, prawda?
Hugal31,