:(){ :|: & };: distruggiamo il nostro pinguino

Distruggere forse non è la parola esatta, ma esiste un comando, o meglio uno script BASH che se eseguito riesce ad occupare tutto il tempo della CPU (o delle CPU) del proprio sistema, non permettendo di eseguire altre operazioni, nemmeno all’utente root.

Ci tengo a precisare che questo non è un bug dei sistemi derivati Unix, cerco di spiegarvi il codice incriminato:
:(){ :|: & };:

Sì, è vero, ad un primo sguardo sembra una cosa assolutamente senza senso; per capire meglio possiamo riscrivere il codice precedente come

a(){ a|a & };a

(poichè in Bash il simbolo : non è ne un operatore ne una parola riservata)

Il ; è usato in Bash per separare due istruzioni scritte su una stessa riga; quindi possiamo scrivere:

a() { a|a & }
a

Vi ricorda niente?
Ma certo! È la definizione di una funzione ! (nel nostro caso si chiamerà a)

Ma cosa fa questa funzione?

Riprendo una spiegazione di un post precedente:

Il | (pipe) dice alla shell di mandare l’output del comando a sinistra (echo) come input del comando a destra

Il simbolo & (ampersand) dice alla shell di non aspettare la fine del comando, ma di mandarlo in background, in secondo piano.

In conclusione la funzione si comporta in questo modo:

chiama se stessa e dice alla shell mi mandare l’output nuovamente alla stessa funzione, e per massimizzare il numero di chiamate alla funzione dice alla shell di non aspettare la fine del comando. Quindi ad ogni chiamata di a, la funzione a verrà chiamata ben due volte.

La chiamata alla funzione viene fatta usando fork (che genera un nuovo processo), ed è appunto per questo che viene chiamata Unix fork bomb.

Dunque sen non volete che la vostra box crashi non provate a scrivere quel pezzo di codice in un terminale,… ma se non resistete… basterà riavviare il computer con un hard reset.

Come prevenire una fork bomb?

La soluzione è molto semplice, basta limitare il numero di chiamate a fork che un utente può fare, ma ancora più semplice è limitare il numero di processi in esecuzione per ogni utente.

Per limitare il numero di processi è sufficiente modificare il file /etc/security/limits.conf, questo vale per Ubuntu come per qualsiasi altra distro, anche della famiglia RedHat.

Aggiungiamo al file /etc/security/limits.conf la riga

* hard nproc 2000

* indica che si applica a tutti gli utenti
hard indica che è un limite e non una soglia di avvertimento (soft)
nproc indica che vogliamo limitare il numero di processi
2000 è il numero massimo di processi; potete aumentarlo o diminuirlo, ma consiglio di stare tra i 1000 e i 10000

possiamo aggiungerlo usando un editor (es: gedit, come root) oppure con il solito tee:

echo "* hard nproc 2000" | sudo tee -a /etc/security/limits.conf

Purtroppo adesso occorre fare una cosa alla Windows… riavviare… se qualcuno conosce un modo alternativo per non rebootare…

Provate a lanciare

:(){ :|: & };:

adesso…

magia! bash: fork: Resource temporarily unavailable

Il kernel nega la creazione di altri processi🙂 !!

Per la cronaca…

un codice simile esiste anche per Winzoz (DOS, in Batch):

:s
 start %0
 goto s

che però non ha nessun possibile rimedio (chi l’avrebbe mai detto??)

Explore posts in the same categories: linux

Tag: , , ,

You can comment below, or link to this permanent URL from your own site.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...


%d blogger cliccano Mi Piace per questo: