Ceci est basé sur cette question de canular ici. Le problème décrit est d'avoir un script bash qui contient quelque chose à l'effet de:
rm -rf {pattern1}/{pattern2}
... qui, si les deux modèles incluent un ou plusieurs éléments vides, s'étendra à au moins une instance de rm -rf /
, en supposant que la commande d'origine a été correctement transcrite et que l'OP effectuait une expansion d'accolade plutôt qu'une expansion de paramètre .
Dans l' explication du PO sur le canular , le PO déclare:
La commande [...] est inoffensive mais il semble que presque personne ne l'a remarqué.
L'outil Ansible empêche ces erreurs, mais [...] personne ne semblait le savoir, sinon ils sauraient que ce que j'ai décrit ne pourrait pas se produire.
Donc, en supposant que vous avez un script shell qui émet une rm -rf /
commande via l'expansion d'accolade ou l'expansion de paramètres, est-il vrai que l'utilisation d' Ansible empêchera l'exécution de cette commande, et si oui, comment fait-elle cela?
L'exécution rm -rf /
avec les privilèges root est-elle vraiment "inoffensive" tant que vous utilisez Ansible pour le faire?
rm
source, que j'ai analysée ci-dessous.Réponses:
J'ai des machines virtuelles, explosons-en! Pour la science.
Premier essai:
OK, alors
command
passez les littéraux et rien ne se passe.Que diriez - vous de notre by - pass de sécurité préférée,
raw
?Non allez encore! Comment peut-il être difficile de supprimer tous vos fichiers?
Oh, mais que faire si c'étaient des variables non définies ou quelque chose?
Eh bien, cela n'a pas fonctionné.
Mais que faire si les variables sont définies, mais vides?
Enfin, quelques progrès! Mais il se plaint toujours que je ne l'ai pas utilisé
--no-preserve-root
.Bien sûr, cela m'avertit également que je devrais essayer d'utiliser le
file
module etstate=absent
. Voyons voir si ça marche.Bonnes nouvelles tout le monde! Il a commencé à essayer de supprimer tous mes fichiers! Mais malheureusement, il a rencontré une erreur. Je vais laisser la correction et obtenir le playbook pour tout détruire en utilisant le
file
module comme un exercice pour le lecteur.NE PAS exécuter de playbooks que vous voyez au-delà de ce point! Vous verrez pourquoi dans un instant.
Enfin, pour le coup de grâce ...
Cette VM est un ex-perroquet !
Fait intéressant, ce qui précède n'a rien fait avec
command
au lieu deraw
. Il vient d'imprimer le même avertissement concernant l'utilisation defile
avecstate=absent
.Je vais dire qu'il semble que si vous n'utilisez pas
raw
cela, il y a une certaine protection contre larm
folie. Mais vous ne devriez pas vous fier à cela. J'ai jeté un coup d'œil dans le code d'Ansible, et bien que j'ai trouvé l'avertissement, je n'ai rien trouvé qui supprimerait réellement l'exécution de larm
commande.la source
/boot
.boot
c'est la première entrée de répertoire dans/
. Aucun fichier n'a donc été perdu.rm -rf {{x}}/{{y}}
quandy
est réglé sur"*"
. Le--no-preserve-root
chèque est utile pour ce qu'il est, mais il ne vous sortira pas de toutes les situations possibles; c'est assez facile à contourner. C'est pourquoi cette question n'a pas été immédiatement considérée comme un canular: compte tenu du mauvais anglais et des erreurs de syntaxe apparentes, elle est plausible .raw
, un mauvaiscron
pourrait être une autre façon de détruire un système.Ansible empêchera-t-il l'exécution d'
rm -rf /
un script shell?J'ai inspecté la source coreutils rm , qui présente les éléments suivants:
La seule façon d'effacer de la racine est de dépasser ce bloc de code. De cette source :
J'interprète cela comme signifiant que la fonction
get_root_dev_ino
renvoie null on/
, et donc rm échoue.La seule façon de contourner le premier bloc de code (avec récursivité) est d'avoir
--no-preserve-root
et il n'utilise pas de variable d'environnement pour surcharger, donc il devrait être passé explicitement à rm.Je crois que cela prouve qu'à moins qu'Ansible ne passe explicitement
--no-preserve-root
àrm
, il ne le fera pas.Conclusion
Je ne crois pas qu'Ansible empêche explicitement
rm -rf /
parce querm
lui - même l'empêche.la source