Cómo proteger Ubuntu de la bomba tenedor

72

Escuché a alguien hablar sobre una bomba tenedor, investigué un poco y encontré información terrible sobre algunos personajes de aspecto extraño que la gente puede hacer que escriba en la línea de comando y, como resultado, haga cosas malas en la computadora. Ciertamente no emitiría comandos que no entiendo, pero uno nunca sabe lo que puede pasar.

Escuché que algunos sistemas operativos le permiten al administrador establecer un límite en los procesos de los usuarios para mitigar los efectos de las bombas de horquilla, ¿es esta protección en Ubuntu por defecto o una persona con privilegio de sudo tiene que configurar esto? ¿Si es así, cómo?

dblang
fuente

Respuestas:

73

Puede limitar fácilmente la cantidad de procesos que se pueden generar en Ubuntu y la mayoría de las otras distribuciones de Linux modificando /etc/security/limits.conf

sudoedit /etc/security/limits.conf

Luego agregue esta línea al final de ese archivo:

*    hard     nproc     nnn

dónde:

  • hard establece el límite en el nivel del kernel para que no se pueda cambiar sin reiniciar.
  • nproc es el número máximo de procesos por usuario.
  • nnn es un número que debe calcular para su sistema al:

    ps aux -L | cut --delimiter=" " --fields=1 | sort | uniq --count | sort --numeric-sort | tail --lines=1
    

El comando anterior enumerará todos los procesos para todos los usuarios, incluidos los subprocesos , los resumirá y enumerará el nombre de usuario con la mayor cantidad de procesos. Para estar seguro, abra todas las aplicaciones que normalmente necesita antes de ejecutar el comando anterior y luego duplique ese número por seguridad.

Una vez establecido este límite, deberá reiniciar, pero afectará a cada usuario no root en el sistema. Entonces, si un usuario no root ejecuta una bomba fork, tendrá ese límite estricto.

Los límites de grupo y comodín no se aplican al usuario raíz de forma predeterminada . Use el nombre rootde usuario literal en las reglas si desea aplicar una regla al superusuario.

Además, si no está buscando reiniciar en el corto plazo, puede usarlo, sudo ulimit -u 800lo que colocará la restricción solo en la sesión en ejecución, ¡ pero puede ser eludido fácilmente por una bomba tenedor con sudoprivilegios!

Después de reiniciar, se /etc/security/limits.confusará lo que esté dentro .

Alguna información adicional sobre las bombas de horquilla: no son malware ni nada terrible. Por lo general, consisten en algo tan básico como un script que se llama a sí mismo dos veces, lo que aumenta su presencia en la máquina exponencialmente. A pesar de que tienen una pequeña huella de memoria dado el rápido ritmo que multiplican, llenan rápidamente toda la RAM disponible y la máquina se congela o reinicia. El único peligro es perder información no guardada. Clasificaría una bifurcación mucho más como una broma que un software malicioso.

Un recordatorio importante:

Rara vez debe ejecutar algo en la línea de comando cuando no está 98% seguro de su acción. Si no puede leer los comandos que está ejecutando, no lo haga. Esto aplica el doble a los fragmentos ilegibles de caracteres hexadecimales / base64, que se pueden usar para ocultar todo tipo de maldad. Si no está seguro de un comando, siempre puede buscar sus acciones en las páginas de manual de Ubuntu y tener precauciones adicionales al usarlo, sudoya que se ejecutará como usuario root.

Marco Ceppi
fuente
@MarcoCeppi: su número no estaba lejos para un usuario típico de Unity: la salida para el cálculo es actualmente 404 para mi sistema ...
Fabby
1
Si, por ejemplo, pongo algo como alias ":(){ :|: & };:"="echo 'No.'"en mi .bashrc, ¿se ejecutará cada inicio de sesión?
UniversallyUniqueID
¿Hay alguna desventaja en elegir un límite de nproc más alto? Parece que no hay mucho espacio con un límite o incluso el doble del número actual de procesos, ¿un límite mucho más alto, incluso 10,000 o más, todavía sería efectivo contra una bomba tenedor? ¿Aproximadamente cuánto carnero consume cada bifurcación / proceso? ¿Quizás haya un límite derivado de RAM más universal?
Xen2050
1

Una forma simple que me gusta es crear un alias, aunque los alias no siempre se aplican, verifique la respuesta anterior.

alias :="echo No."

Ahora

$ :(){ :|: & };:
bash: syntax error near unexpected token `('
Adrian Webster
fuente
22
seguramente, esta es una solución común; ¿Cómo se detiene esto a(){ a|a & };a? (¿o algún otro nombre de función?)
gato