Premessa - Cos’è una fork bomb

Possiamo immaginarci una fork bomb come un attacco di tipo DoS (Denial of Service) contro un sistema che utilizza la funzione fork. Nel kernel Linux, la fork è una chiamata di sistema che permette a un processo (padre) di creare un altro processo (figlio) contenente inizialmente una copia di se stesso; una fork bomb sfrutta proprio questa syscall per eseguire fork all’infinito e quindi esaurire le risorse del sistema e renderlo inutilizzabile (sarà necessario un riavvio).

La Fork Bomb in Bash

Vediamo come il comando bash $ :(){ :|:& };: sia effettivamente una fork bomb:

  • :() dichiara la funzione (ricorsiva) chiamata :, che non prevede argomenti
  • {} i comandi tra le parentesi sono il corpo della funzione
  • :|: qui c’è la ricorsione: la funzione chiama se stessa e manda (tramite pipe) l’output ad un’altra chiamata di se stessa
  • & fa eseguire il comando precedente (il corpo della funzione) in background, così che i processi figli non vengano killati
  • ; è per separare comandi multipli in bash
  • : è la chiamata alla funzione definita

Se la distribuzione che usiamo utilizza systemd, questo comando anche se eseguito non porterebbe ad alcun crash. Questo perchè systemd, per ogni utente, imposta un limite alle risorse utilizzabili (numero di processi, cicli di CPU, utilizzo della RAM).

Extra - Proteggersi da una fork bomb

Supponiamo di essere su un sistema senza protezione “nativa” della fork bomb e vediamo come potremmo rimediare. Esiste il comando ulimit per controllare (opzione -u) il numero massimo di processi utilizzabili da un utente. Una volta scelto il nuovo numero (ovviamente, minore del precedente) da assegnare, dovremo modificare il file /etc/security/limits.conf e aggiungere la seguente linea:

# Per tutti gli utenti del gruppo wheel
@wheel  hard nproc  [numero_processi]

# Solo per l'utente qsl
qsl  hard nproc  [numero_processi]