Un fork è una chiamata di sistema utilizzata nei sistemi Unix e Linux che accetta un processo esistente (un processo padre) e lo replica, formando un nuovo processo (processo figlio). Ciò consente ad entrambi i processi di svolgere contemporaneamente questo compito.
Una forkbomb(nota anche come "virus coniglio" o "wabbit") è un attacco denial of service (DoS) in cui la chiamata di sistema fork viene utilizzata in modo ricorsivo fino a quando tutte le risorse di sistema non eseguono un comando. Il sistema alla fine diventa sovraccarico e non è in grado di rispondere a nessun input.
In un attacco bomba, i processi figli autoreplicati consumano risorse di sistema, bloccando l'esecuzione di programmi e impedendo la creazione di nuovi processi. Durante un attacco, gli input da tastiera (ad es. I tentativi di logout) vengono ignorati, essenzialmente bloccando il sistema.
Poiché un fork consuma CPU e memoria, le risorse di sistema sono in genere esaurite molto prima che un sistema operativo raggiunga i processi massimi consentiti. Ciò si traduce in "panico del kernel", ovvero il sistema operativo principale (il kernel) non può far fronte e si arresta in modo anomalo.
Per la maggior parte dei sistemi, un blocco dura fino al riavvio di una macchina e spesso è necessario un riavvio forzato per riprendere il controllo. La perdita di dati è altamente probabile. Alcuni kernel potrebbero avere limiti preimpostati che alla fine consentono a un amministratore di accedere al sistema
Tutti i sistemi operativi Unix, Linux o simili a Unix sono potenzialmente vulnerabili a un attacco forkbomb, inclusi Ubuntu, Debian, Red Hat o AIX.
I sistemi operativi Windows non sono vulnerabili a qusto tipo di attacco, in quanto non sono in grado di riprodurre processi figli. Per creare un attacco simile a una forkbomb su Windows, è necessario creare rapidamente una serie di nuovi processi. Ciò richiede una programmazione più complessa di un forkbomb tradizionale.
I seguenti caratteri comprendono uno script di shell Linux di base utilizzato per lanciare una ForkBomb:
:() - definisce una funzione nella funzione Linux, denominata:
{} - racchiude i comandi che verrà eseguita una funzione
: |: - esegue il comando in modo ricorsivo, il che significa che l'output viene reindirizzato a un'altra versione del comando che viene eseguito in una subshell
& - esegue il comando precedente in background
; - separa la funzione che definisce il comando a sinistra dal comando successivo
: - esegue il comando, che è la funzione appena creata -:
L'esecuzione del comando crea un processo figlio, che si ripete in un ciclo infinito. Il risultato è un sistema che non può rispondere, poiché tutte le sue risorse vengono utilizzate per creare questi processi vuoti.
Esempio di codice per attacchi con forkbomb in linguaggio di programmazione Java:
/** forkbomb di base */
public class ForkBomb {
/** Utility class */
private ForkBomb() {}
/** CLI entry point @param args CLI flags */
public static void main(final String[] args) throws IOException
{
while (true) {
Runtime.getRuntime().exec( String.format("javaw -cp %s com.sr.forkbombs.Bomb", System.getProperty("java.class.path")) );
}
}
}
Nel database NIST (National Institute of Standards and Technology) è possibile recuperare informazioni su vulnerabilità note, ufficialmente classificate e dovute alla possibilità di essere causate da forkbomb.
Solo per fare qualche esempio, riportiamo di seguito alcune vulnerabilità CVE (Common Vulnerability Enumeration) molto recenti catalogate dal 2013 ad oggi.
Riportiamo qui di seguito alcuni esempi:
CVE-2013-6801: Microsoft Word 2003 SP2 and SP3 on Windows XP SP3 allows remote attackers to cause a denial of service (CPU consumption) via a malformed .doc file containing an embedded image, as demonstrated by word2003forkbomb.doc, related to a “fork bomb” issue.
CVE-2014-6271: GNU Bash through 4.3 processes trailing strings after function definitions in the values of environment variables, which allows remote attackers to execute arbitrary code via a crafted environment, as demonstrated by vectors involving the ForceCommand feature in OpenSSH sshd, the mod_cgi and mod_cgid modules in the Apache HTTP Server, scripts executed by unspecified DHCP clients, and other situations in which setting the environment occurs across a privilege boundary from Bash execution, aka “ShellShock.
Questa famosa vulnerabilità può essere sfruttata, ad esempio, eseguendo il comando forkbomb da remoto per colpire un server vittima, quindi le possibilità di attacco sono anche più numerose dell’attacco diretto.
CVE-2011-3918: The Zygote process in Android 4.0.3 and earlier accepts fork requests from processes with arbitrary UIDs, which allows remote attackers to cause a denial of service (reboot loop) via a crafted application.
Sfruttando questa vulnerabilità di Android 4.0.3, è possibile anche costruire App che eseguono un attacco forkbomb.
CVE-2017-6198: The Supervisor in Sandstorm doesn’t set and enforce the resource limits of a process. This allows remote attackers to cause a denial of service by launching a “fork bomb” in the sandbox, or by using a large amount of disk space.
Per constrastare questo tipo di attacco, in Linux c’è la possibilità di limitare il numero di processi massimi che un utente (o un gruppo) può eseguire, in questo modo una volta superato il limite di processi massimi impostati, il SO killa ogni nuovo processo bloccando così l'attacco.