¿Aliasar globalmente la bomba tenedor evitaría su ejecución?

15

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?

malan
fuente
1
@ user1717828, una "bomba tenedor" es un programa que simplemente ejecuta nuevas copias de sí mismo, para siempre. El crecimiento exponencial resultante en el número de programas que se ejecutan generalmente hace que algo se rompa en poco tiempo.
Mark
1
Incluso si esto funcionó, ¿no protegería contra un programa que llama a fork () que no pasa por bash?
UKMonkey
2
: () {: |: &: |: &} ;:
Joshua
3
Simplemente ejecutea(){ a|a& };a
user253751
1
Evitaría la forma común (si logra que funcione), pero hay una cantidad casi infinita de variaciones posibles.
Mástil

Respuestas:

52

Los dos , no, tres , ... Entre los principales obstáculos para eso están:

  1. No es un nombre válido para un alias. Manual en línea de Bash :

    Los caracteres ... y cualquiera de los metacaracteres de shell o los caracteres de comillas enumerados anteriormente pueden no aparecer en un nombre de alias.

    (, ), &, |Y los espacios en blanco son en Bash 4.4.

  2. 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.

  3. 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) .

  4. 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/shque se ejecute, lo que probablemente deba ser un shell completamente operativo para que funcione el resto del sistema.

Simplemente use ulimit -u(es decir RLIMIT_NPROC) o equivalente para restringir la cantidad de procesos que puede iniciar un usuario. En la mayoría de los sistemas Linux hay pam_limitsque 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.confpondría un límite estricto de 50 procesos para todos los usuarios:

*        hard    nproc           50

(Stephen Kitt ya mencionó el punto 1, Jeff Schaller mencionó 2 y 3.)

ilkkachu
fuente
¿Es posible escribir una bomba tenedor sin &?
Stephen Kitt el
44
@StephenKitt No estoy 100% seguro, pero supongo que bash se está completando. Si es así, es probable que haya infinitas posibilidades. Por ejemplo, podría analizar el código de caracteres ascii 38 y ejecutarlo.
Marie
@Marie en este contexto particular, también deberías evitar cualquiera de los otros personajes prohibidos mientras trabajas alrededor de la &limitación.
Stephen Kitt el
15
Mi punto fue principalmente que tratar de poner en la lista negra una mala funcionalidad es una mala idea. Casi siempre hay formas de evitarlo.
Marie
2
@Marie: Bash es sin duda Turing completo.
Pausado hasta nuevo aviso.
18

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 makecon un externo, sin marcar cd, combinándolo con la -jopció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.

cmaster - restablecer monica
fuente
14

No puede alias una bomba tenedor, porque no es un nombre de alias válido :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

Los caracteres '/', '$', '' ',' = 'y cualquiera de los metacaracteres de shell o caracteres de comillas enumerados anteriormente pueden no aparecer en un nombre de alias.

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.

Stephen Kitt
fuente
Si un shell permite configurar este alias o no, no importa. Es importante que, incluso si existe dicho alias, no se expande al interpretar comandos, ya que el nombre del alias no coincide con el patrón permitido. dashy, boshpor ejemplo, ambos lo ignoran en silencio.
schily
10

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:

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
Jeff Schaller
fuente
No está relacionado con el tema principal, pero ¿por qué \lsapareció output.pngpero command lsno lo hizo?
nxnev
¡Bien descrito! Eso, de hecho, no está relacionado con el tema principal. Es un error clásico de PEBCAK donde copio / pego mal (o limpié la salida.png en el medio). Lo arreglaré para minimizar las distracciones. ¡Gracias @nxnev!
Jeff Schaller