Esto se basa en esta pregunta falsa aquí. El problema descrito es tener un script bash que contiene algo en el sentido de:
rm -rf {pattern1}/{pattern2}
... que si ambos patrones incluyen uno o más elementos vacíos se expandirá al menos a una instancia de rm -rf /
, suponiendo que el comando original se transcribió correctamente y que el OP estaba haciendo la expansión de llaves en lugar de la expansión de parámetros .
En la explicación del OP del engaño , afirma:
El comando [...] es inofensivo pero parece que casi nadie se ha dado cuenta.
La herramienta Ansible previene estos errores, pero [...] nadie parecía saberlo, de lo contrario sabrían que lo que he descrito no podría suceder.
Entonces, suponiendo que tenga un script de shell que emita un rm -rf /
comando a través de la expansión de llaves o la expansión de parámetros, ¿es cierto que el uso de Ansible evitará que se ejecute ese comando? Y si es así, ¿cómo lo hace?
¿Ejecutar rm -rf /
con privilegios de root es realmente "inofensivo" siempre que esté usando Ansible para hacerlo?
rm
fuente, que analicé a continuación.Respuestas:
Tengo máquinas virtuales, explotémoslas. Para la ciencia.
Primer intento:
OK, entonces
command
solo pasa los literales y no pasa nada.¿Qué tal nuestro bypass de seguridad favorito
raw
?No vayas de nuevo! ¿Qué tan difícil puede ser eliminar todos tus archivos?
Ah, pero ¿y si fueran variables indefinidas o algo así?
Bueno, eso no funcionó.
Pero, ¿qué pasa si las variables están definidas, pero vacías?
¡Finalmente, un poco de progreso! Pero aún se queja de que no lo usé
--no-preserve-root
.Por supuesto, también me advierte que debería intentar usar el
file
módulo ystate=absent
. A ver si eso funciona.¡Buenas noticias para todos! ¡Comenzó a tratar de eliminar todos mis archivos! Pero desafortunadamente se encontró con un error. Dejaré arreglar eso y conseguir que el libro de jugadas destruya todo usando el
file
módulo como ejercicio para el lector.¡NO ejecute ningún libro de jugadas que vea más allá de este punto! Verás por qué en un momento.
Finalmente, para el golpe de gracia ...
¡Esta máquina virtual es un ex loro !
Curiosamente, lo anterior no pudo hacer nada en
command
lugar deraw
. Simplemente imprimió la misma advertencia sobre el usofile
constate=absent
.Voy a decir que parece que si no estás usando
raw
eso, hay alguna protección contra larm
pérdida de control. Sin embargo, no debes confiar en esto. Eché un vistazo rápido al código de Ansible y, aunque encontré la advertencia, no encontré nada que pudiera suprimir la ejecución delrm
comando.fuente
/boot
.boot
es la primera entrada de directorio en/
. Entonces no se perdieron archivos.rm -rf {{x}}/{{y}}
cuandoy
esté configurado en"*"
. El--no-preserve-root
cheque es útil para lo que es, pero no lo sacará de todas las situaciones posibles; es lo suficientemente fácil de evitar. Es por eso que esa pregunta no se detectó como un engaño de inmediato: teniendo en cuenta el mal inglés y los aparentes errores de sintaxis, es plausible .raw
, un malcron
podría ser otra forma de destruir un sistema.¿Ansible evitará la ejecución de
rm -rf /
un script de shell?Inspeccioné la fuente de coreutils rm , que tiene lo siguiente:
La única forma de borrar desde la raíz es pasar este bloque de código. De esta fuente :
Interpreto que esto significa que la función
get_root_dev_ino
devuelve nulo/
y, por lo tanto, rm falla.La única forma de omitir el primer bloque de código (con recursión) es tener
--no-preserve-root
y no utiliza una variable de entorno para anular, por lo que debería pasarse explícitamente a rm.Creo que esto prueba que a menos que Ansible pase explícitamente
--no-preserve-root
arm
, no lo hará.Conclusión
No creo que Ansible lo evite explícitamente
rm -rf /
porque élrm
mismo lo impide.fuente