[LatinaLUG] [Shell] Script letale

Gabriele Mambrini gm@badpenguin.org
Ven 9 Nov 2007 23:21:24 CET


Con ordine: per prima cosa deoffuschiamo il codice cominciando a
metterlo a capo in maniera più familiare.

.() {
 . | . &
}
.

A questo punto :-) dovrebbe intravvedersi la definizione di una
funzione, il cui nome è . (e che va a "nascondere" il built-in punto)

pippo() {
 pippo | pippo &
}
pippo

quindi questa funzione (che alla fine viene innescata) fa creare sub
shell che la rieseguono e le mette in background. Risultato dopo poco
tempo il sistema viene invaso da questi processi, che diventano talmente
tanti che il tutto il tempo viene passato a crearli e terminarli e non
vengono più schedulati in maniera usabili i processi "veri" dell'utente.
Quindi non si riesce più a chiudere quel termninale, ad dare un contro-C
a quella shell e nemmeno ad usare X o a fare login :-)

In realtà c'è un limite nel numero di processi che può generare un
utente e lo si può vedere con bash usando ulimit:

$ ulimit -u
16372

e il default è troppo alto. Infatti facendo girare
$ ulimit -u 200; .() { .|.& }; .

il sistema resta governabile e si riesce a fermare in tempo il piccolo
diavolo. Con un default più basso si può proteggere il sistema da questo
trucco. Chiudo con una nota di folklore:

# uname
OpenBSD
# ulimit -p
532

Gabriele


Maggiori informazioni sulla lista latina