Le nom de fichier qui s'exécute : injection de wildcard tar jusqu'à root
Le défi
Une machine du service finance chez Calderwell lance une sauvegarde toutes les heures : elle se place dans le répertoire d'upload et archive avec tar tout ce qu'il contient. Le répertoire est accessible en écriture à l'utilisateur web, ce qui explique comment trois fichiers que personne n'a uploadés s'y sont retrouvés pendant la nuit. Deux d'entre eux ne sont pas du tout des rapports. Lisez le job de sauvegarde et le répertoire, puis donnez le nom exact du fichier déposé par un attaquant pour que la prochaine sauvegarde exécute son code en root.
Ce que tu vas apprendre
- Expliquer comment le shell développe un glob en arguments séparés avant que la commande ne les voie
- Comprendre que tar ne peut pas distinguer un nom de fichier d'une option une fois que le shell les a découpés
- Identifier --checkpoint-action comme la fonctionnalité de tar qui transforme un nom de fichier en exécution de code
- Comprendre pourquoi un dossier accessible en écriture sous un glob privilégié est en soi la vulnérabilité
- Connaître les alternatives sûres (find -exec, listes de fichiers explicites, préfixe ./)
Compétences testées
Prérequis
- Commandes shell de base (ls, cat)
- Ce que fait un glob (*)
Comment ça marche
Quand un shell voit tar czf out.tgz *, il remplace le * par tous les noms de fichiers du dossier et transmet chacun comme un argument séparé. La commande ne voit jamais de * ; elle voit une liste. Si l'un de ces noms de fichiers commence par un tiret, la commande le lit comme une option.
GNU tar possède une option, --checkpoint-action=exec=..., qui exécute une commande à intervalles réguliers. Un fichier nommé --checkpoint-action=exec=sh run.sh, placé dans le dossier, devient donc une instruction demandant à tar d'exécuter run.sh. Un attaquant qui peut seulement écrire des fichiers dans le dossier parcouru par le glob d'une tâche privilégiée fait exécuter son code avec les droits de l'utilisateur de cette tâche.
Le même piège s'applique à toute commande cmd * sur un contenu contrôlé par l'attaquant : chown, chmod, rsync et d'autres ont tous des échappatoires en forme d'option.
Erreurs fréquentes
- Répondre
run.sh. C'est le payload appelé par les options plantées, pas le fichier qui détourne tar. tar ne l'exécute que parce que le fichier d'option le lui demande. - Répondre avec un CSV. Les deux rapports sont le contenu ordinaire du spool et sont inoffensifs.
- Vouloir lancer la sauvegarde ici. La tâche tourne en root selon un calendrier ; il suffit de reconnaître ce que fera la prochaine exécution.
- Chercher un binaire SUID ou une règle sudo. L'élévation tient entièrement dans le glob et le nom de fichier, rien d'autre n'est mal configuré.
Comment s'en protéger
Ne laissez jamais une commande privilégiée parcourir par glob un dossier que d'autres peuvent modifier.
- Remplacez le glob par une liste explicite et préfixée :
find /srv/upload -maxdepth 1 -type f -print0 | tar --null -T - -czf ..., afin que les noms de fichiers ne puissent jamais être lus comme des options. - Ou désamorcez le tiret :
tar czf out.tgz -- *ou./*, pour que chaque opérande soit clairement un chemin. - Ne lancez pas la sauvegarde en root sur un spool accessible en écriture par le web. Abandonnez les privilèges, ou copiez le spool vers une zone de transit que l'utilisateur web ne peut pas toucher et sauvegardez celle-ci.
Solution complète
Statistiques de la communauté
Hacks du jour associés
Contributeurs crédités
Ces hackers ont signalé des problèmes, amélioré le contenu et renforcé cette page.