Si tuviera que establecer globalmente
alias ':(){ :|:& };:'='echo fork bomb averted'
¿sería una estrategia de seguridad efectiva para evitar la ejecución de la bomba tenedor Bash o todavía habría una manera de ejecutarla?
Supongo que la pregunta se reduce a: ¿hay alguna forma de ejecutar un comando cuando se alias a otra cosa?
a(){ a|a& };a
Respuestas:
Los
dos, no,tres, ... Entre los principales obstáculos para eso están:No es un nombre válido para un alias. Manual en línea de Bash :
(
,)
,&
,|
Y los espacios en blanco son en Bash 4.4.Esa cadena en particular no es la única forma de escribir una bomba tenedor en el caparazón, simplemente famosa porque parece oscura. Por ejemplo, no hay necesidad de llamar a la función en
:
lugar de algo realmente compuesto de letras.Si pudiera establecer el alias, el usuario podría desactivar el alias, eludirlo 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 los shells no interactivos) .
Incluso si el shell está lo suficientemente restringido como para detener todas las versiones de una bomba de horquilla, 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á evitar que el usuario traiga binarios compilados desde fuera del sistema o
/bin/sh
que se ejecute, lo que probablemente deba ser un shell completamente operativo para que funcione el resto del sistema.Simplemente use
ulimit -u
(es decirRLIMIT_NPROC
) o equivalente para restringir la cantidad de procesos que puede iniciar un usuario. En la mayoría de los sistemas Linux haypam_limits
que establecer el límite de recuento de procesos antes de que se inicien los comandos elegidos por el usuario.Algo como esto
/etc/security/limits.conf
pondría un límite estricto de 50 procesos para todos los usuarios:(Stephen Kitt ya mencionó el punto 1, Jeff Schaller mencionó 2 y 3.)
fuente
&
?&
limitación.No. Hay demasiadas formas de escribir una bomba tenedor.
El malvado escritor de la bomba tenedor intentará nuevamente con un nombre de función diferente. O otras alteraciones hasta que su bomba tenedor tenga éxito.
El escritor involuntario de la bomba de horquilla no producirá la bomba de horquilla canónica en primer lugar.
En realidad, es bastante fácil convertirse en un escritor involuntario de bombas tenedor. Por ejemplo, podría usar recursivo
make
con un externo, sin marcarcd
, combinándolo con la-j
opción y subdirectorios no existentes, un ejemplo real con el que me topé una vez.No puede protegerse contra todas las posibilidades, y ciertamente no contra un atacante determinado. Todo lo que logrará es aumentar la complejidad de su sistema.
fuente
No puede alias una bomba tenedor, porque no es un nombre de alias válido :
Algunos shells no comprueban los nombres de alias cuando se declaran, sino al interpretar comandos, y luego omiten el nombre no válido. Siempre se incluirá una bomba tenedor
&
, que no se puede incluir en un nombre de alias válido, por lo que no es posible protegerse de esta manera.fuente
dash
y,bosh
por ejemplo, ambos lo ignoran en silencio.Dos veces no.
Esa no es la única forma de escribir una bomba tenedor.
También hay varias formas de ejecutar "un comando" cuando hay un alias:
Ejemplo:
fuente
\ls
aparecióoutput.png
perocommand ls
no lo hizo?