Wie extrahiere ich eine nicht vertrauenswürdige TAR-Datei sicher?

30

Ich möchte in der Lage sein, eine TAR-Datei zu extrahieren, so dass alle extrahierten Dateien unter einem bestimmten Präfixverzeichnis abgelegt werden. Jeder Versuch der tar-Dateien, in externe Verzeichnisse zu schreiben, sollte dazu führen, dass die Extraktion fehlschlägt.

Wie Sie sich vielleicht vorstellen können, kann ich auf diese Weise eine nicht vertrauenswürdige TAR-Datei sicher extrahieren.

Wie kann ich das mit GNU machen tar?

Ich hatte die Idee dass:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

aber ich bin nicht sicher, ob das paranoid genug ist.

Demi
quelle
2
Es ist nicht paranoid genug. Ich habe in der Vergangenheit einige fiese Tarballs konstruiert, die über symbolische Verknüpfungen entstanden sind. Am Ende habe ich meinen eigenen Teer erstellt, der setuid-root war, damit er chroot (".") Ausführen und Berechtigungen löschen konnte.
Joshua
8
@Joshua Ihre Lösung, um ein vielfach erprobtes Dienstprogramm sicherer zu machen, bestand darin, eine eigene Version zu erstellen und ihr Root-Rechte zuzuweisen?
Hören Sie auf, Monica am
4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || Ausfahrt (1); setuid (getuid ()); ist einfach zu prüfen.
Joshua
2
Sie können auch mithilfe der -tOption überprüfen, was in der TAR-Datei enthalten ist .
Thomas

Antworten:

40

Sie brauchen die Paranoia überhaupt nicht. GNU tar- und in der Tat jede gut geschriebentar Programm, das in den letzten 30 Jahren oder so erstellt wurde - wird sich ..standardmäßig weigern, Dateien im Tarball zu extrahieren, die mit einem Schrägstrich beginnen oder Elemente enthalten .

Sie müssen sich sehr viel tarMühe geben , um moderne Programme dazu zu zwingen , solche potenziell bösartigen Tarballs zu extrahieren: Sowohl GNU als auch BSD tarbenötigen die -POption, um diesen Schutz zu deaktivieren. Siehe den Abschnitt Absolute Dateinamen im GNU tar-Handbuch.

Das -PFlag wird von POSIX jedoch nicht angegeben ¹, sodass andere tarProgramme möglicherweise andere Möglichkeiten haben , damit umzugehen. Zum Beispiel werden die Worte Schily Werkzeuge starProgramm Anwendungen -/und-.. , um diese Schutzfunktionen zu deaktivieren.

Das einzige, was Sie in Betracht ziehen könnten, um einen naiven tarBefehl zu ergänzen, ist ein -CFlag, das ihn zwingt, Dinge in ein sicheres temporäres Verzeichnis zu extrahieren, sodass Sie es nicht cdzuerst tun müssen .


Nebenbei :

  1. Technisch tarwird von POSIX gar nicht mehr angegeben. Sie versuchten der Unix-Computerwelt mitzuteilen, dass wir paxjetzt stattdessen verwenden solltentar und verwenden sollten cpio, aber die Computerwelt ignorierte sie weitgehend.

    Hierbei ist zu beachten, dass in der POSIX-Spezifikation für paxnicht festgelegt ist, wie führende Schrägstriche oder eingebettete ..Elemente behandelt werden sollen. Es gibt ein Nicht-Standard- --insecureFlag für BSDpax , um Schutzmaßnahmen gegen eingebettete Pfadelemente zu unterdrücken .., aber anscheinend gibt es keinen Standardschutz gegen führende Schrägstriche. Die BSD- paxManpage empfiehlt indirekt, -sSubstitutionsregeln zu schreiben , um das absolute Pfadrisiko zu behandeln.

    So etwas passiert, wenn ein De-facto-Standard weiterhin aktiv verwendet wird, während der De-jure-Standard weitgehend ignoriert wird.

Warren Young
quelle
7
pax - portable archive interchangeOh, wie süß, POSIX denkt, es wird möglicherweise das am häufigsten verwendete Archivformat ersetzen: P
cat
1
@cat Das Standardarchivformat ist eine einigermaßen weit verbreitete tar-Variante (AIUI soll auch das cpio-Format unterstützen). Pax ist eher ein Versuch, die Kommandoschnittstelle für den Umgang mit solchen Archiven zu ersetzen , da das Kommando-Argument-Handling von tar ... skurril ist.
Random832
Random Side Note: Ich bin mir ziemlich sicher, dass es "de jour" ist, dh das französische Wort, im Gegensatz zu "de jure".
Fund Monica Klage
7
@ QPaysTaxes ist es nicht. de jure ist lateinisch und kontrastiert mit der aktuellen Situation, dh was de facto ist. De jour sollte auch du jour sein, um die französischen Grammatikregeln einzuhalten.
Prime
1
Dies ist ein Fall eines unglücklichen falschen Verwandten. Das französische "du jour" ("des Tages") sieht dem lateinischen "de jure" ("des Gesetzes") sehr ähnlich und steht dem "de facto" ("der Tatsache") gegenüber. Man könnte argumentieren, dass pax der "Standard des Monats" oder "Standard du jour" ist, um sich darüber lustig zu machen, wie oft neue Standards vorgeschlagen werden, während die große Zahl der Benutzer einfach bei dem bleibt, was für sie funktioniert (de facto Standard). wohl wissend, dass es (bildlich gesprochen) morgen einen neuen Standard geben wird, den sie ignorieren müssen.
Monty Harder
19

Mit GNU Tar ist es einfach

tar -xvf untrusted_file.tar

in einem leeren Verzeichnis. GNU tar entfernt /beim Extrahieren automatisch die Namen der führenden Mitglieder, es sei denn, mit der --absolute-namesOption wird ausdrücklich nichts anderes angegeben . GNU Tar erkennt auch, wenn die Verwendung von../ einer Datei extrahiert außerhalb des Toplevel - Verzeichnis und legt die Dateien im Hauptverzeichnis verursachen würde , anstatt sein, zum Beispiel eine Komponente foo/../../bar/quxals extrahiert werden bar/quxin der Top - Level - Verzeichnis anstatt bar/quxim Stamm des Toplevel - Verzeichnis . GNU tar kümmert sich auch um symbolische Links, die außerhalb des Toplevel-Verzeichnisses verweisen, foo -> ../..und foo/barwird nicht dazu veranlasst bar, außerhalb des Toplevel-Verzeichnisses extrahiert zu werden.

Beachten Sie, dass dies nur für (ausreichend aktuelle Versionen von) GNU tar gilt (sowie für einige andere Implementierungen, z. B. * BSD tar und BusyBox tar). Einige andere Implementierungen haben keinen solchen Schutz.

Aufgrund von symbolischen Links würden die von Ihnen verwendeten Schutzfunktionen nicht ausreichen: Das Archiv könnte einen symbolischen Link enthalten, der auf ein Verzeichnis außerhalb des Baums verweist, und Dateien in diesem Verzeichnis extrahieren. Es gibt keine Möglichkeit, dieses Problem allein anhand der Mitgliedsnamen zu lösen. Sie müssen das Ziel symbolischer Links untersuchen.

Beachten Sie, dass die Garantie möglicherweise nicht mehr gültig ist, wenn Sie in ein Verzeichnis extrahieren, das bereits symbolische Links enthält.

Gilles 'SO - hör auf böse zu sein'
quelle
6

Um ein paar Punkte abzudecken, haben die anderen Antworten nicht:

  1. Schauen Sie zuerst nach, was in der Datei enthalten ist, bevor Sie sie extrahieren:

    tar -tvf untrusted_tar_file.tar
    

    Wenn es irgendetwas gibt, dem Sie nicht vertrauen oder das Sie extrahieren möchten, extrahieren Sie nicht das Archiv.

  2. Als zweites extrahieren Sie den Tarball als Nicht-Root-Benutzer, der nur Schreibzugriff auf das eine Verzeichnis hat, in das Sie den Tarball extrahieren. Extrahieren Sie beispielsweise den Tarball aus dem Basisverzeichnis des Nicht-Root-Benutzers.
Andrew Henle
quelle
4
1. Das ist für Batch-Operationen nicht praktikabel. 2. Sofern Sie kein benutzerdefiniertes Setup ausführen, können bestimmte Speicherorte von allen Benutzern beschrieben werden, insbesondere / tmp /
pipe am
@pipe könnte man auch ein Verzeichnis und einen neuen Benutzer anlegen, und nur dieser Benutzer hat Zugriff auf nur dieses Verzeichnis, und dann den Befehl ausführen. Mein Heimatverzeichnis gefällt mir sehr gut, danke.
Katze
2
@pipe Warum auf Gottes gute Erde würden Sie jemals passieren nicht vertrauenswürdige Daten über einen Batch - Betrieb? Wenn Sie ihm nicht vertrauen, führen Sie ihn NICHT unbeaufsichtigt aus.
Andrew Henle
6
@ AndrewHenle Uhm, ok. Wie funktioniert wohl jeder Server im Internet? Glauben Sie, dass ein Mitarbeiter von stackexchange diesen Kommentar in seiner Datenbank und seinem Markup-System ausführt, während er den Vorgang manuell überwacht? Weil es sich bei dieser Eingabe um nicht vertrauenswürdige Daten handelt.
Rohr
Ich würde nicht empfehlen, eine nicht vertrauenswürdige Datei direkt in ein Basisverzeichnis zu extrahieren. Sie möchten nicht, dass Sie .bashrc und andere .config / -Dateien überschrieben, oder?
Hugal,