
Si tuvieras que configurar globalmente
alias ':(){ :|:& };:'='echo fork bomb averted'
¿Sería esa una estrategia de seguridad eficaz para evitar la ejecución de la bomba Bash Fork o todavía habría una manera de ejecutarla?
Supongo que la pregunta se convierte en: ¿hay alguna forma de ejecutar un comando cuando tiene un alias con otra cosa?
Respuesta1
Los dos , no, tres ,... Entre los principales obstáculos para ello se encuentran:
No es un nombre válido para un alias.Manual en línea de Bash:
Es posible que los caracteres ... y cualquiera de los metacaracteres del shell o entre comillas enumerados anteriormente no aparezcan en un nombre de alias.
(
,)
,&
y|
los espacios en blanco están disponibles en Bash 4.4.Esa cadena en particular no es la única forma de escribir una bomba de horquilla en el caparazón, solo es famosa porque parece oscura. Por ejemplo, no es necesario llamar a la función
:
en lugar de algo compuesto de letras.Si pudiera establecer el alias, el usuario podría desarmar el alias, evitarlo escapando el nombre del alias en la línea de comando o deshabilitar los alias por completo, posiblemente ejecutando la función en un script (Bash no expande los alias en shells no interactivos) .
Incluso si el shell está lo suficientemente restringido como para detener todas las versiones de una bomba bifurcada, un sistema de propósito general tendrá otras utilidades programables que pueden recurrir y bifurcar subprocesos. ¿Tienes Perl o un compilador de C? Suficientemente fácil. Incluso awk probablemente podría hacerlo. Incluso si no los tiene instalados, también deberá impedir que el usuario introduzca archivos binarios compilados desde fuera del sistema o que los ejecute,
/bin/sh
lo que probablemente deba ser un shell completamente operativo para que funcione el resto del sistema.
Solo usaulimit -u
(es decir RLIMIT_NPROC
, ) o equivalente para restringir la cantidad de procesos que un usuario puede iniciar. En la mayoría de los sistemas Linux haypam_limits
que puede establecer el límite de recuento de procesos antes de que se inicie cualquier comando elegido por el usuario.
Algo como esto /etc/security/limits.conf
pondría un límite estricto de 50 procesos para todos los usuarios:
* hard nproc 50
(Stephen Kittya mencionadopunto 1, Jeff Schallermencionado2 y 3.)
Respuesta2
No. Hay demasiadas formas de escribir una bomba-tenedor.
El malvado escritor de la bomba de tenedor volverá a intentarlo con un nombre de función diferente. U otras modificaciones hasta que su bomba-tenedor tenga éxito.
El escritor inadvertido de la bomba-tenedor no producirá la bomba-tenedor canónica en primer lugar.
En realidad, es bastante fácil convertirse en un escritor inadvertido de tenedores de bombas. Por ejemplo, podrías usar recursivo make
con un externo sin marcar cd
, combinándolo con la -j
opción y subdirectorios no existentes, un ejemplo real con el que me topé una vez.
No es posible protegerse contra todas las posibilidades y mucho menos contra un atacante decidido.Lo único que conseguirás será aumentar la complejidad de tu sistema.
Respuesta3
No se le puede dar un alias a una bomba horquilla, porque no es unanombre de alias válido:
$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name
Los caracteres '/', '$', '`', '=" y cualquiera de los metacaracteres del shell o entre comillas enumerados anteriormente no pueden aparecer en un nombre de alias.
Algunos shells no verifican los nombres de alias cuando se declaran, sino cuando interpretan comandos, y luego omiten el nombre no válido. Una bomba fork siempre incluirá &
, que no se puede incluir en un nombre de alias válido, por lo que no es posible protegerse de esta manera.
Respuesta4
Dos veces, no.
Esa no es la única manera de escribir una bomba-tenedor.
También hay varias formas de ejecutar "un comando" cuando hay un alias:
command the-command
\the-command
Ejemplo:
$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html output.png
$ command ls
jeff.html output.png