Logo Informatizzati

Cari miei questa è una cosa che fa rabbrividire... Pubblico di seguito un articolo preso da http://blog.gnist.org/article.php?story=forkbomb (tradotto per noi poveri italiani; occhio, la traduzione non è fedele, ho riassunto un pò).
Per chi non ha voglia di leggere tutto accenno solo che si tratta di un metodo banalissimo quanto efficace di esaurire le risorse di sistema, lanciando uno script che richiama se stesso all'infinito!

Fork bomb, ovvero come buttare giù un server Linux in pochi secondi

Premessa: "fork()" è una chiamata di sistema che crea una copia esatta del processo attivo. Il nuovo processo viene chiamato "child" (la traduzione letterale sarebbe bambino ma è più adatto "figlio") e quello che lo ha invocato viene chiamato "parent" ("genitore").

Questa caratteristica può essere sfruttata anche per creare danni ad un sistema, una "fork bomb" appunto. Fortunatamente il sistema per evitare che ciò accada è semplice da adottare, anche se raramente viene adottato.

Veniamo al sodo: per creare una fork bomb ci sono diversi metodi, uno molto semplice è quello di creare uno script da una shell linux scrivendo questo:

#/bin/sh
$0 &
$0

Salva il file come "forkbomb.sh", eseguilo (NON FARLO ADESSO!) e in pochi secondi avrai il sistema inutilizzabile!

In sostanza questo script lancia se stesso ("$0") in background ("&"), poi lancia se stesso in foreground in attesa del completamento dello script stesso, cosa che non avverrà mai e quindi occupando risorse di sistema!

Semplice quanto micidiale!

E' possibile restringere il numero di processi eseguibili, attraverso il comando "ulimit". L'opzione "-u" mostra/controlla il numero di processi che l'utente attuale può eseguire:

$ ulimit -u

unlimited

Bella roba eh? Di default sono illimitati!

Modifica (per esempio) così:

$ ulimit -u 20

$ ulimit -u
20

In questo avremo impostato a 20 il numero massimo di processi eseguibili da shell e il risultato dell'esecuzione dello script (adesso puoi lanciarlo Wink) sarà:

$ ulimit -u 20
$ ./forkbomb.sh
./forkbomb.sh: fork: Risorsa temporaneamente non disponibile
./forkbomb.sh: fork: Risorsa temporaneamente non disponibile
./forkbomb.sh: fork: Risorsa temporaneamente non disponibile
./forkbomb.sh: fork: Risorsa temporaneamente non disponibile
....

Output dello script forkbomb.sh

Per far sì che questo parametro sia permanente dobbiamo modificare il file /etc/security/limits.conf:

# cat /etc/security/limits.conf
....
pippo hard nproc 20

"pippo" può essere un utente o un gruppo (anche altro ma per approfondimenti ti rimando al sito kernel.org, purtroppo in inglese).

Esci e rientra in shell (logout e login) per verificare i cambiamenti.

$ ulimit -u
20

Ovviamente questa modifica impedisce di apportare modifiche al paramentro da utente normale:

$ ulimit -u 100
-bash: ulimit: max user processes: cannot modify limit: Funzione non permessa

Attenzione però che l'utente root (o qualunque altro utente con UID 0) non è influenzato da limits.conf.

Tags

Commenti offerti da CComment