Fork bombe en bash : Comprendre et s’en protéger

Fork bombe en bash : Comprendre et s’en protéger

AVERTISSEMENT : Les “fork bomb” n’ont rien de nouveau mais mènent encore à un déni de service sur des systèmes mal ou non protégés. Ne prenez pas le risque de tester ce genre de “jouets” sur un serveur en production.


Le principe d’une “fork bombe” (ou “fork bomb”) consiste à multiplier un processus jusqu’à atteindre les limites du système.
La multiplication des processus sature le système et consomme rapidement toutes les ressources disponibles.
Les processus en cours ne disposent alors plus de ressources suffisantes pour fonctionner correctement et les nouveaux processus doivent attendre que des ressources se libèrent pour démarrer.
L’ensemble mène à un gel du système ou/et à un déni de service (DoS).
La forme la plus courante de la fork bombe bash est la suivante :
:(){ :|:& };:
Cette forme, cryptique, est plus ou moins destinée à masquer les effets de cette ridicule fonction récursive.
Sous une forme plus explicite, nous pourrions écrire :
1
2
3
4
:() {
    :|:&
};
:
  • ligne 1 : création d’une fonction nommée “:” ne prenant aucun argument (“()”) ;
  • ligne 2 : corps de la fonction. Elle s’appelle (premier “:”) est son retour est envoyé (le pipe “|”) à une autre occurrence d’elle même (deuxième “:”) en arrière plan (le fork est là … “&” ) ;
  • ligne 3 : fin de la fonction “};” ;
  • ligne 4 : lancement de la bombe (appel de la fonction “:”).
Comme vous pouvez le constater, cette fonction ne fait en réalité pas grand chose mais est d’une efficacité étonnante.
L’ensemble s’éclaircit dès qu’un nom explicite est donné à la fonction :
1
2
3
4
ForkBomb () {
    ForkBomb | ForkBomb &
}
ForkBomb
La fonction originale peut-être retrouvée sous différents aspects tel que sa forme octale, hexadécimale, etc.

Comment protéger son système ?

Un moyen simple de protéger son système consiste à fixer des limites au nombre de processus pouvant être instanciés par les utilisateurs, “max user processes”, via la fonction “ulimit“. Le nombre maximum de processus d’un utilisateur peut être interrogé directement via l’option “-u” “d’ulimit”:
$ ulimit -u
16071
Cette valeur peut-être fortement réduite afin de protéger le système :
$ ulimit -u 100
$ ulimit -u
100
L’attaque se trouve alors rapidement bloquée (pas plus de 100 processus instanciés par l’utilisateur) et le système conserve suffisamment de ressources pour assurer les services qu’il héberge.
Voir Contrôle des ressources systèmes (ulimit) pour plus d’informations sur l’outil.

Appliquer la limite à tous les utilisateurs

La restriction du nombre de processus maximum instancié par les utilisateurs peut être mise en place, via le fichier “/etc/security/limits.conf” :
$ cat /etc/security/limits.conf
...
@users      soft      nproc      100
@users      hard      nproc      200
fhh         hard      nproc      300
Voir Contrôle des ressources systèmes (ulimit) pour plus d’informations sur le fichier “/etc/security/limits.conf”.
Une autre solution permettant de protéger le système consiste à utiliser les cgroups (disponible sur les noyaux supérieurs ou égale au 2.6.24).

Références

Contrôle des ressources systèmes (ulimit) : http://www.admin-linux.fr/?p=7608
  • A quoi ça sert au fait ?
  • A tester la réaction de votre système face à un “vrai” problème, à tester votre watchdog en situation réelle, à tester la mise en place de limites, etc.

    Posts les plus consultés de ce blog

    Guide pas à pas de la gestion de l’impression dans Windows Server 2008