Cómo parar y detectar la bomba tenedor

14
#include <stdlib.h>
#include <unistd.h>

int main()
{
   while(1)
      fork();
}

Este es el código para una bomba tenedor.

En nuestra universidad, nos conectamos a través de Telnet, es decir, el protocolo de servicio al cliente. Unos 100 sistemas están conectados al servidor. De repente, vimos que el servidor se volvía lento, y después de un tiempo se bloqueó. Llegué a saber que Sombody implementó una bomba tenedor.

¿Cómo podemos detectar en qué sistema se implementa la bomba tenedor? ¿Y cómo podemos detenerlo?

Un método es limitar el número máximo de procesos que puede poseer un solo usuario. ¿Hay algún método para detenerlo y saber desde qué sistema se ha implementado?

Rajesh M
fuente
19
Telnet? ¿Seriamente? Realmente deberías usar SSH ...
ThiefMaster
Consulte también unix.stackexchange.com/q/64611/17609
moooeeeep el
bueno, se migró de SO pero una respuesta podría ser a nivel de kernel. Algunos parches se han hecho tentativamente pero ninguno parece encontrar aceptación. Mi punto es: cómo detectarlo: bueno, cualquier uer sabrá que ya no puede usar el sistema, por lo que el punto de detección quizás no sea el punto clave. ¿Cómo recuperarse? La respuesta actual es reiniciar, diría: una forma de decirle al kernel que ejecute solo un proceso (el que desea limpiar el desorden) y detener a todos los demás, sean lo que sean. Esta podría ser una función accesible solo en la consola del sistema.
philippe lhardy

Respuestas:

16

Una forma es limitar la cantidad de procesos que un usuario puede ejecutar.

Simplemente inicie sesión como root y edite este archivo para agregar usuarios y configurar su límite.

# vi /etc/security/limits.conf

Agregue esta línea al archivo

john hard nproc 10

Ahora el usuario John solo puede crear 10 procesos.

Barath Bushan
fuente
Creo que debe reiniciar para que la nueva configuración /etc/security/limits.confsurta efecto.
Dan D.
2
No. Pero PAM los aplica, por lo que solo se aplican a nuevos inicios de sesión.
ThiefMaster
14

Para detener una bomba tenedor en funcionamiento, puede utilizar killall <name>para matar todos los procesos de la bomba. Sin embargo, dado que una bomba de horquilla generalmente produce una carga increíblemente alta en el sistema, es posible que no pueda usar SSH o ejecutarla. Por lo tanto, un reinicio podría ser necesario o al menos mucho más rápido.

Si cada usuario tiene su propia cuenta en el sistema, simplemente puede consultar el directorio de inicio de todos y buscar el ejecutable. Es probable que también haya subido el código fuente, por lo que encontrarlo no debería ser demasiado difícil. Si se tratara de una cuenta compartida para todos los estudiantes, no tiene suerte. Especialmente después de que la sesión telnet o ssh del usuario finalizó, no tiene oportunidad de averiguar quién la inició.

Sin embargo, en lugar de castigar al usuario que detonó esa bomba de horquilla, debería arreglar la configuración del sistema para desarmar las bombas de horquilla. Puede establecer límites de proceso por usuario utilizando /etc/security/limits.confy así evitar que una bomba de horquilla se salga de control; por ejemplo, con solo 50 procesos, una bomba de horquilla no causará mucho daño.

ThiefMaster
fuente
es imposible detectar de qué sistema viene aa?
Rajesh M
@ user1670364: no está claro lo que está preguntando. ¿Qué quieres decir con "viene"? Puedes saber qué usuario es el propietario del proceso, ¿qué más quieres saber?
David Schwartz
@DavidSchwartz quiero decir que es posible detectar la bomba tenedor en qué sistema se está implementando?
Rajesh M
@ user1670364: Si te refieres al sistema que realmente está ejecutando la bomba tenedor, es el que es lento. Si te refieres al usuario responsable, es el usuario el propietario de los procesos que se bifurcan.
David Schwartz