Comment arrêter et détecter la bombe à fourche

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

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

Ceci est le code d'une bombe à fourche.

Dans notre université, nous nous connectons via telnet, c'est-à-dire le protocole de service client. Une centaine de systèmes sont connectés au serveur. Soudain, nous avons vu le serveur devenir lent et, après un certain temps, il s'est écrasé. J'ai appris que sombody avait mis en place une bombe à fourche.

Comment détecter sur quel système la bombe à fourche est implémentée? Et comment pouvons-nous l'arrêter?

Une méthode consiste à limiter le nombre maximal de processus qu'un seul utilisateur peut posséder. Existe-t-il une méthode pour l'arrêter et savoir à partir de quel système il a été mis en œuvre?

Rajesh M
la source
19
Telnet? Sérieusement? Vous devriez vraiment utiliser SSH ...
ThiefMaster
eh bien, il a été migré SO mais une réponse pourrait être au niveau du noyau. certains correctifs ont été provisoirement effectués, mais aucun ne semble être accepté. Mon point est: comment le détecter: tout utilisateur saura qu'il ne peut plus utiliser le système, donc le point de détection n'est peut-être pas le point clé. Comment récupérer? La réponse actuelle est le redémarrage, je dirais: un moyen de dire au noyau d'exécuter un seul processus (celui que vous voulez nettoyer) et d'arrêter tous les autres quels qu'ils soient. Cela pourrait être une fonctionnalité accessible uniquement dans la console système.
philippe lhardy

Réponses:

16

Une façon consiste à limiter le nombre de processus qu'un utilisateur peut exécuter.

Connectez-vous simplement en tant que root et modifiez ce fichier pour ajouter des utilisateurs et configurer leur limite.

# vi /etc/security/limits.conf

Ajoutez cette ligne au fichier

john hard nproc 10

Désormais, l'utilisateur john ne peut créer que 10 processus.

Barath Bushan
la source
Je pense que vous devez redémarrer pour que les nouveaux paramètres /etc/security/limits.confprennent effet.
Dan D.
2
Non. Mais ils sont appliqués par PAM et ne s'appliquent donc qu'aux nouvelles connexions.
ThiefMaster
14

Pour arrêter une bombe à fourche en cours d'exécution, vous pourriez être en mesure d'utiliser killall <name>pour tuer tous les processus de la bombe. Cependant, comme une bombe à fourche entraîne généralement une charge incroyablement élevée sur le système, vous ne pourrez peut-être pas y entrer ou l'exécuter. Un redémarrage peut donc être nécessaire ou au moins beaucoup plus rapide.

Si chaque utilisateur a son propre compte sur le système, vous pouvez simplement vérifier le répertoire personnel de chacun et rechercher l'exécutable. Les chances sont bonnes, il a également téléchargé le code source afin de le trouver ne devrait pas être trop difficile. S'il s'agissait d'un compte partagé pour tous les étudiants, vous n'avez pas de chance. Surtout après la fin de la session telnet ou ssh de l'utilisateur, vous n'avez aucune chance de savoir qui l'a démarrée.

Cependant, au lieu de punir l'utilisateur qui a fait exploser cette bombe à fourche, vous devriez plutôt corriger la configuration du système pour désarmer les bombes à fourche. Vous pouvez définir des limites de processus par utilisateur en utilisant /etc/security/limits.confet empêcher ainsi une bombe à fourche de devenir incontrôlable - avec par exemple seulement 50 processus, une bombe à fourche ne fera pas beaucoup de dégâts.

ThiefMaster
la source
il est impossible de détecter à partir de quel système son aa à venir?
Rajesh M
@ user1670364: Ce que vous demandez n'est pas clair. Qu'entendez-vous par «sa venue»? Vous pouvez dire à quel utilisateur appartient le processus, que voulez-vous savoir d'autre?
David Schwartz
@DavidSchwartz je veux dire qu'il est possible de détecter la bombe à fourche sur quel système elle est implémentée?
Rajesh M
@ user1670364: Si vous voulez dire le système qui exécute réellement la bombe à fourche, c'est celui qui est lent. Si vous voulez dire l'utilisateur qui est responsable, c'est l'utilisateur qui possède les processus qui bifurquent.
David Schwartz