J'aimerais pouvoir extraire un fichier de goudron, de sorte que tous les fichiers extraits soient placés sous un certain répertoire de préfixe. Toute tentative des fichiers de goudron à écrire sur des annuaires extérieurs devrait entraîner l'échec de l'extraction.
Comme vous pouvez l'imaginer, c'est afin que je puisse extraire en toute sécurité un fichier de goudron non approuvé.
Comment puis-je faire cela avec GNU tar
?
Je suis venu avec:
tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar
mais je ne suis pas sûr que ce soit assez paranoïaque.
Vous n'avez pas besoin de la paranoïa du tout. =GNU tar
- et en fait tout Bien écrit tar
programme produit au cours des 30 dernières années environ - Refuser d'extraire des fichiers dans la tagball qui commencent par une barre oblique ou qui contiennent ..
éléments, par défaut.
Vous devez sortir de votre façon de forcer les programmes modernes tar
programmes pour extraire de telles builles potentiellement malveillantes: les deux GNU et BSD tar
nécessitent le -P
Option pour les faire désactiver cette protection. Voir la section noms de fichiers absolus dans le GNU gare manuel.
Les -P
Le drapeau n'est pas spécifié par POSIX, ¹ Cependant, d'autres programmes tar
peuvent avoir différentes façons de faire face à cela. Par exemple, les outils schily ' star
programme utilise -/
et -..
Pour désactiver ces protections.
La seule chose que vous pourriez envisager d'ajouter à une commande naïve tar
est une -C
Drapeau de la forcer à extraire des objets dans un répertoire temporaire sécurisé, de sorte que vous n'ayez pas à cd
y a d'abord.
ASIDES :
Techniquement, tar
_ n'est plus spécifié par Posix plus du tout. Ils ont essayé de dire au monde informatique UNIX que nous devrions utiliser pax
maintenant au lieu de tar
et cpio
, mais le monde informatique les ignora en grande partie .
Il est pertinent ici pour noter que la spécification POSIX pour pax
ne dis pas comment il devrait gérer des barres obliques de meneur ou intégré ..
éléments. Il y a un non standard --insecure
Drapeau pour BSD pax
Pour supprimer les protections contre Embedded ..
éléments de chemin, mais il n'y a apparemment pas de protection par défaut contre des barres obliques. La page BSD pax
Man Recommande indirectement l'écriture -s
Règles de substitution pour traiter le risque absolu sur le chemin.
C'est le genre de chose qui se produit lorsque une norme de facto reste en activité active pendant que la norme de jure est largement ignorée.
Avec GNU goudron, c'est simplement
tar -xvf untrusted_file.tar
dans un répertoire vide. GNU goudrette bandes automatiquement un nom de membre /
lors de l'extraction, sauf indication contraire explicitement autrement avec l'option --absolute-names
option . GNU TRAIL détecte également lorsque l'utilisation de ../
provoquerait une extraction d'un fichier en dehors du répertoire de toplevel et met ces fichiers dans le répertoire Toplevel à la place, par exemple. Un composant foo/../../bar/qux
_ _ sera extrait comme bar/qux
dans le répertoire de Toplevel plutôt que bar/qux
dans le parent du répertoire de Toplevel. GNU tar prend également en charge les liens symboliques pointant en dehors du répertoire Toplevel, par exemple. foo -> ../..
et foo/bar
_ _ ne provoquera pas bar
à extraire à l'extérieur du répertoire de Toplevel.
Notez que cela ne s'applique que (versions suffisamment récentes de) GNU goudron (ainsi que d'autres implémentations, par exemple Tar de BSD et goudron BSD). Certaines autres implémentations n'ont aucune protection.
En raison de liens symboliques, les protections que vous utilisez ne suffiraient pas suffisantes: l'archive pourrait contenir un lien symbolique pointant vers un répertoire à l'extérieur de l'arborescence et extraire des fichiers dans ce répertoire. Il n'y a aucun moyen de résoudre ce problème basé uniquement sur les noms des membres, vous devez examiner la cible de liens symboliques.
Notez que si vous extrayez dans un répertoire contenant déjà des liens symboliques, la garantie peut ne plus tenir.
Pour couvrir quelques points, les autres réponses n'ont pas:
Tout d'abord, regardez ce qui est dans le fichier avant de l'extraire:
tar -tvf untrusted_tar_file.tar
S'il y a quelque chose dans là, vous ne faites pas confiance ou que vous ne voulez pas extraire, n'extracez pas la Tarball.