Comment extraire en toute sécurité un fichier tar non approuvé?

30

Je voudrais pouvoir extraire un fichier tar, de sorte que tous les fichiers extraits soient placés dans un certain répertoire de préfixes. Toute tentative des fichiers tar d'écrire dans des répertoires externes devrait entraîner l'échec de l'extraction.

Comme vous pouvez l'imaginer, c'est pour que je puisse extraire en toute sécurité un fichier tar 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.

Demi
la source
2
Ce n'est pas assez paranoïaque. J'ai construit des tarballs méchants dans le passé qui sont montés via les liens symboliques qu'il a créés. J'ai fini par créer mon propre tar qui était setuid-root afin qu'il puisse exécuter les privilèges chroot (".") Et drop.
Joshua
8
@Joshua donc votre solution pour rendre un utilitaire très largement testé plus sûr était de créer votre propre version et de lui donner les privilèges root?
Arrêtez de nuire à Monica le
4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || sortie (1); setuid (getuid ()); est facile à auditer.
Joshua
2
Vous pouvez également vouloir inspecter le contenu du fichier tar en utilisant l' -toption.
Thomas

Réponses:

40

Vous n'avez pas du tout besoin de la paranoïa. GNU tar- et en fait tout programme bien écrit tarproduit au cours des 30 dernières années environ - refusera d'extraire des fichiers dans l'archive tar qui commencent par une barre oblique ou qui contiennent des ..éléments, par défaut.

Vous devez vous tarefforcer de forcer les programmes modernes à extraire de telles tarballs potentiellement malveillants: GNU et BSD ont tarbesoin de l' -Poption pour leur faire désactiver cette protection. Voir la section Noms de fichiers absolus dans le manuel GNU tar.

Le -Pdrapeau n'est pas spécifié par POSIX, ¹ cependant, d'autres tarprogrammes peuvent avoir différentes manières de faire face à cela. Par exemple, les outils de Schily starprogramme des utilisations -/et -..de désactiver ces protections.

La seule chose que vous pourriez envisager d'ajouter à une tarcommande naïve est un -Cindicateur pour la forcer à extraire des choses dans un répertoire temporaire sûr, vous n'avez donc pas à cdy accéder en premier.


A part :

  1. Techniquement, ce tarn'est plus du tout spécifié par POSIX. Ils ont essayé de dire au monde informatique Unix que nous devrions utiliser paxmaintenant au lieu de taret cpio, mais le monde informatique les a largement ignorés.

    Il est pertinent de noter ici que la spécification POSIX pour paxne dit pas comment elle doit gérer les barres obliques ou les ..éléments intégrés . Il y a un --insecureindicateur non standard pour BSDpax pour supprimer les protections contre les ..éléments de chemin incorporés , mais il n'y a apparemment pas de protection par défaut contre les barres obliques; la paxpage de manuel BSD recommande indirectement d'écrire -sdes règles de substitution pour faire face au risque de chemin absolu.

    C'est le genre de chose qui se produit lorsqu'une norme de facto reste active alors que la norme de jure est largement ignorée.

Warren Young
la source
7
pax - portable archive interchangeAwww, comme c'est mignon, POSIX pensant que ça va peut-être remplacer le format d'archive le plus utilisé: P
cat
1
@cat Le format d'archive par défaut est une variante tar assez largement prise en charge (AIUI, il est également censé prendre en charge le format cpio). Pax est plutôt une tentative de remplacer l' interface de commande pour traiter de telles archives, car la gestion des arguments de commande de tar est ... excentrique.
Random832
Note aléatoire: je suis presque sûr que c'est "de jour", c'est-à-dire le mot français, par opposition à "de jure".
Fund Monica's Lawsuit
7
@QPaysTaxes ce n'est pas le cas. de jure est latin et contraste avec la situation actuelle, c'est-à-dire ce qui est de facto. De jour devrait aussi être du jour pour obéir aux règles de grammaire française.
Prime
1
Il s'agit d'un malheureux faux parent. Le français du jour ressemble beaucoup au latin "de jure" ("de droit") ici contrasté avec "de facto" ("de fait"). On pourrait faire valoir que pax est la "norme du mois" ou "standard du jour" pour se moquer de la façon dont les nouvelles normes sont proposées si souvent, tandis que le vaste corps d'utilisateurs reste simplement avec ce qui fonctionne pour eux (norme de facto), sachant (métaphoriquement) qu'il y aura demain une nouvelle norme à ignorer.
Monty Harder
19

Avec GNU tar, c'est tout simplement

tar -xvf untrusted_file.tar

dans un répertoire vide. GNU tar supprime automatiquement les /noms des membres principaux lors de l'extraction, sauf indication contraire explicite avec l' --absolute-namesoption . GNU tar détecte également quand l'utilisation de ../provoquerait l'extraction d'un fichier en dehors du répertoire toplevel et place ces fichiers dans le répertoire toplevel à la place, par exemple un composant foo/../../bar/quxsera extrait comme bar/quxdans le répertoire toplevel plutôt que bar/quxdans le parent du répertoire toplevel . GNU tar prend également en charge les liens symboliques pointant en dehors du répertoire de haut niveau, par exemple foo -> ../..et foo/barne provoquera barpas leur extraction en dehors du répertoire de haut niveau.

Notez que cela ne s'applique qu'aux versions (suffisamment récentes de) GNU tar (ainsi qu'à certaines autres implémentations, par exemple * BSD tar et BusyBox tar). Certaines autres implémentations n'ont pas une telle protection.

En raison des liens symboliques, les protections que vous utilisez ne seraient pas suffisantes: l'archive pourrait contenir un lien symbolique pointant vers un répertoire en dehors de l'arborescence et extraire des fichiers dans ce répertoire. Il n'y a aucun moyen de résoudre ce problème uniquement sur la base des noms de membres, vous devez examiner la cible des liens symboliques.

Notez que si vous extrayez dans un répertoire qui contient déjà des liens symboliques, la garantie peut ne plus être valable.

Gilles 'SO- arrête d'être méchant'
la source
6

Pour couvrir quelques points, les autres réponses n'ont pas:

  1. Tout d'abord, regardez ce qu'il y a dans le fichier avant de l'extraire:

    tar -tvf untrusted_tar_file.tar
    

    S'il y a quelque chose dans lequel vous ne faites pas confiance ou que vous souhaitez extraire, n'extrayez pas l'archive tar.

  2. Ensuite, extrayez l'archive tar en tant qu'utilisateur non root qui n'a qu'un accès en écriture au seul répertoire dans lequel vous extrayez l'archive tar. Par exemple, extrayez l'archive tar à partir du répertoire personnel de l'utilisateur non root.
Andrew Henle
la source
4
1. Ce n'est pas pratique pour les opérations par lots. 2. Sauf si vous exécutez une configuration personnalisée, certains emplacements peuvent être écrits par tous les utilisateurs, notamment / tmp /
pipe
@pipe on peut également créer un répertoire et un nouvel utilisateur, et seul cet utilisateur a accès uniquement à ce répertoire, puis exécutez la commande. J'aime bien mon répertoire personnel, merci.
chat
2
@pipe Pourquoi sur la bonne Terre de Dieu transmettriez- vous JAMAIS des données non fiables via une opération par lots? Si vous ne lui faites pas confiance, vous ne l' exécutez PAS sans surveillance.
Andrew Henle
6
@AndrewHenle Uhm, d'accord. Comment pensez-vous que chaque serveur sur Internet fonctionne? Pensez-vous qu'un gars de stackexchange exécute ce commentaire via sa base de données et son système de balisage tout en surveillant manuellement l'opération? Parce que cette entrée est des données non fiables via une opération par lots.
pipe
Je ne recommanderais pas d'extraire un fichier non approuvé directement dans un répertoire personnel. Vous ne voulez pas qu'il vous écrase .bashrc et autres .config / fichiers, non?
Hugal31