10
votes

Problèmes de sécurité potentiels avec ZipRarchive de PHP

Je veux permettre aux membres de la possibilité de télécharger du contenu à l'aide d'un fichier zip. Une fois téléchargée, je souhaite utiliser la classe ZipRarchive de PHP pour décompresser le contenu du fichier zip vers un répertoire, puis déplacez les fichiers dans notre système.

Je suis cependant préoccupé par les risques de sécurité potentiels et je ne trouve aucune documentation sur php.net. Le premier risque (puits, le seul) qui me vient à l'esprit est une personne qui crée un fichier zip avec des chemins relatifs tels que "../../etc/passwd" (s'ils supposent que je décompresse le fichier dans / tmp / somedir).

Je suis en train de créer du mal à créer un chemin relatif dans un fichier zip, je ne peux donc pas tester si une telle chose serait possible. Je ne trouve pas non plus le moyen d'extraire le contenu du fichier ZIP à l'aide de ZipRarchive et d'ignorer les annuaires (décompresser tous les fichiers, mais ne créez pas la structure de répertoire à l'intérieur du zip).

Quelqu'un peut-il me dire si un tel exploit est possible, et / ou comment ignorer la structure de répertoire dans un fichier zip à l'aide de ZIPARCHIVE?


2 commentaires

Bonne question, bien que cela ne trouve pas une réponse exhaustive. Avez-vous envisagé d'utiliser quelque chose d'autre (comme la commande zip de votre système d'exploitation) qui pourrait être mieux documentée en termes de sécurité?


@Pekka bonne idée. Je vais lire sur les pages de l'homme et d'autres documents.


4 Réponses :


1
votes

Vous devez vous assurer que le contenu extrait n'est pas servi directement par votre serveur d'applications. Donc, si quelqu'un a un fichier PHP dans ses archives qu'il ne peut pas l'exécuter via votre serveur Web.

Une autre chose est que vous devriez garder les choses en sécurité d'être incluses dans le contenu généré par l'utilisateur. Mais cela devrait également être considéré sans avoir d'archives zip en place.


0 commentaires

3
votes

question intéressante, mais je vous exhorte à y aller de manière différente. Je vous recommande vivement d'exécuter votre processus Web avec le moins de privilèges dans une prison chroot. En supposant que vous faites cela, la pire chose qui puisse arriver est votre site Web obtenue, puis vous restauez une sauvegarde et faites des criminalistes pour brancher ce trou spécifique. Les nouveaux trous sont découverts constamment, vous aurez une période très difficile de sécuriser votre site Web après des hésions comme celles-ci. Minimiser la bac à sable de l'attaquant va vraiment très loin.


0 commentaires

0
votes

En fin de compte, je vais avec la solution de Pekka, d'utiliser la ligne de commande Unzip utilitaire. Il fournit des commutateurs à ignorer les répertoires dans le fichier zip. Les préoccupations les autres ont souligné ne sont pas un problème ici. Une fois que les fichiers sont décompressés, nous les ajoutons au système à l'aide du même processus que nos téléchargements réguliers, ce qui signifie que chaque fichier est examiné à l'aide des mesures de sécurité que nous avons déjà en place.


0 commentaires

3
votes

J'ai eu les mêmes préoccupations et j'avais un coup d'œil au code source PHP 5.3 où j'ai trouvé ceci:

/* Clean/normlize the path and then transform any path (absolute or relative)
         to a path relative to cwd (../../mydir/foo.txt > mydir/foo.txt)
 */
virtual_file_ex(&new_state, file, NULL, CWD_EXPAND TSRMLS_CC);
path_cleaned =  php_zip_make_relative_path(new_state.cwd, new_state.cwd_length);
if(!path_cleaned) {
    return 0;
}


0 commentaires