Fork-бомба — шкідлива або помилково написана програма, яка нескінченно створює свої копії (системним викликом fork()), який, зазвичай, також створює свої копії й т. д.
Виконання такої програми може викликати велике навантаження обчислювальної системи або навіть відмова в обслуговуванні внаслідок нестачі системних ресурсів (дескрипторів процесів, пам'яті, процесорного часу), що і є ціллю.
Програма класичної fork-бомби (написаної мовою Сі) виглядає так:
#include <unistd.h> int main() { while(1) fork(); }
Схожими випадками витоку системних ресурсів є програми, які породжують зомбі. Однак, якщо більшість fork-бомб створюються навмисне, то ці проблеми, зазвичай, є результатом неуважності або некомпетентності програміста.
Історія
Близько 1978 року був створений ранній варіант fork-бомби під назвою wabbit (System / 360). Це може відбутися з аналогічної атаки під назвою 'RABBITS', яку повідомляють з 1969 р.
Опис
Fork-бомба породжує велику кількість власних копій і тим самим намагається заповнити вільне місце в списку активних процесів операційної системи. Після заповнення списку процесів стає неможливим старт корисної програми. Навіть якщо який-небудь інший процес припинить роботу і місце в списку процесів звільниться, то старт корисної програми малоймовірний, тому що безліч інших копій fork-бомби вже чекають можливості запустити свою чергову копію.
Крім заповнення списку процесів, можливі також стратегії заповнення віртуальної пам'яті, процесорного часу, сокетів і інших системних ресурсів. Результатом вичерпання цих ресурсів стає уповільнення роботи або практично зупинка операційної системи та / або корисних програм (зависання комп'ютера).
Fork-бомба може бути отримана і в результаті помилки при сумлінному програмуванні. Наприклад, програма, яка слухає мережевий порт, може при отриманні мережевого пакета або встановленні з'єднання «впасти» в нескінченний цикл створення своїх копій для обробки пакета або з'єднання. Проста помилка програмування може привести до витоку пам'яті або до наслідків, характерним для результатів роботи fork-бомби.
Приклади fork-бомб на різних мовах програмування
Виконання даних прикладів може привести до втрати незбережених даних. Не рекомендується виконувати їх без застосування належних запобіжних заходів. |
Bash:
:(){ :|:& };:
Perl:
fork while fork
import os while True: os.fork()
Ruby:
fork while fork
Інший варіант:
loop { fork }
<?php while(true) { pcntl_fork(); }
Пакетний файл Microsoft Windows:
:s start %0 goto :s
Інший варіант:
start %0 %0
Варіант на VB.NET
Do System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location) Loop While True
Труднощі ліквідації
У разі успішного спрацьовування fork-бомби стає важким або практично неможливим відновити нормальну роботу ЕОМ без перезавантаження, так як єдиний спосіб припинити роботу fork-бомби — це одночасне припинення роботи всіх працюючих копій fork-бомби. У більшості реалізацій операційних систем виклик команди для припинення роботи процесу вимагає запуску нового процесу, що в умовах успішно працюючої fork-бомби неможливо.
Однак, на практиці деякі fork-бомби не вимагають таких радикальних заходів і можуть бути знищені без необхідності перезавантаження. Розглянемо, наприклад, випадок бомби з прикладу вище:
:(){ :|:& };:
Особливість цього коду в тому, що він не зациклюється після неуспішного породження своїх копій, а завершує роботу. В результаті список процесів постійно знаходиться на межі заповнення: одна з копій fork-бомби завершується, і місце, що звільняється тут же займається новоствореним процесом з іншої копії fork-бомби. Стає можливим конкурувати з fork-бомбою за захоплення місця в списку процесів. Тоді, можливо, рано чи пізно запустити команду для одночасного знищення всіх копій-fork бомби або запустити безпечну програму, яка буде поступово «відвойовувати» місце в списку процесів до завершення роботи останнього процесу fork-бомби. Приклад такої безпечної програми на zsh:
while (sleep 100 &!) do; done
Запобігання
Один зі способів запобігання негативним наслідкам роботи fork-бомби — примусове обмеження кількості процесів, які користувач може запустити одночасно. Також можуть бути обмежені кількість виділеної віртуальної пам'яті та інші системні ресурси. При вичерпанні максимуму доступних процесів спроба процесу створити новий процес зазнає невдачі. Максимум що запускаються процесів повинен бути таким, щоб він дозволяв запустити розумне корисне кількість програм, але не приводив до краху системи при одночасному запуску fork-бомби від всіх користувачів системи.
Необхідно відзначити, що обмеження кількості процесів саме по собі не запобігає запуск fork-бомби, а лише направлено на мінімізацію можливої шкоди в разі її спрацьовування.
Інше розв'язання проблеми — інтелектуальне розпізнавання fork-бомби засобами самої операційної системи, але це рішення не знайшло широкого застосування.
Існує і така трудність, що якщо fork-бомба займає весь доступний процесорний час, то результати її роботи можуть бути катастрофічними не тільки на однопроцесорній, але і на багатопроцесорній системі, навіть при обмеженні числа процесів. Наприклад, якщо число процесорів 16, а максимум кількості запущених процесів 100, то на кожен процесор буде припадати в середньому 6-7 працюючих екземплярів fork-бомби, що пожирають процесорний час. Для розв'язання цієї проблеми застосовується обмеження по прив'язці до процесорів.
Див. Також
- fork () — системний виклик Unix-подібних операційних систем (відповідно до стандарту POSIX)
- Зомбі — схожі випадки витоку системних ресурсів
Примітки
- один з найбільш елегантних прикладів fork-бомби, створений [en]’ом
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Fork bomba shkidliva abo pomilkovo napisana programa yaka neskinchenno stvoryuye svoyi kopiyi sistemnim viklikom fork yakij zazvichaj takozh stvoryuye svoyi kopiyi j t d Rekursivne porodzhennya procesiv yake vede do vidmova v obslugovuvanni abo padinnyu sistemi Vikonannya takoyi programi mozhe viklikati velike navantazhennya obchislyuvalnoyi sistemi abo navit vidmova v obslugovuvanni vnaslidok nestachi sistemnih resursiv deskriptoriv procesiv pam yati procesornogo chasu sho i ye cillyu Programa klasichnoyi fork bombi napisanoyi movoyu Si viglyadaye tak include lt unistd h gt int main while 1 fork Shozhimi vipadkami vitoku sistemnih resursiv ye programi yaki porodzhuyut zombi Odnak yaksho bilshist fork bomb stvoryuyutsya navmisne to ci problemi zazvichaj ye rezultatom neuvazhnosti abo nekompetentnosti programista IstoriyaBlizko 1978 roku buv stvorenij rannij variant fork bombi pid nazvoyu wabbit System 360 Ce mozhe vidbutisya z analogichnoyi ataki pid nazvoyu RABBITS yaku povidomlyayut z 1969 r OpisFork bomba porodzhuye veliku kilkist vlasnih kopij i tim samim namagayetsya zapovniti vilne misce v spisku aktivnih procesiv operacijnoyi sistemi Pislya zapovnennya spisku procesiv staye nemozhlivim start korisnoyi programi Navit yaksho yakij nebud inshij proces pripinit robotu i misce v spisku procesiv zvilnitsya to start korisnoyi programi malojmovirnij tomu sho bezlich inshih kopij fork bombi vzhe chekayut mozhlivosti zapustiti svoyu chergovu kopiyu Krim zapovnennya spisku procesiv mozhlivi takozh strategiyi zapovnennya virtualnoyi pam yati procesornogo chasu soketiv i inshih sistemnih resursiv Rezultatom vicherpannya cih resursiv staye upovilnennya roboti abo praktichno zupinka operacijnoyi sistemi ta abo korisnih program zavisannya komp yutera Fork bomba mozhe buti otrimana i v rezultati pomilki pri sumlinnomu programuvanni Napriklad programa yaka sluhaye merezhevij port mozhe pri otrimanni merezhevogo paketa abo vstanovlenni z yednannya vpasti v neskinchennij cikl stvorennya svoyih kopij dlya obrobki paketa abo z yednannya Prosta pomilka programuvannya mozhe privesti do vitoku pam yati abo do naslidkiv harakternim dlya rezultativ roboti fork bombi Prikladi fork bomb na riznih movah programuvannyaVikonannya danih prikladiv mozhe privesti do vtrati nezberezhenih danih Ne rekomenduyetsya vikonuvati yih bez zastosuvannya nalezhnih zapobizhnih zahodiv Bash amp Perl fork while fork Python import os while True os fork Ruby fork while fork Inshij variant loop fork PHP lt php while true pcntl fork Paketnij fajl Microsoft Windows s start 0 goto s Inshij variant start 0 0 Variant na VB NET Do System Diagnostics Process Start System Reflection Assembly GetExecutingAssembly Location Loop While TrueTrudnoshi likvidaciyiU razi uspishnogo spracovuvannya fork bombi staye vazhkim abo praktichno nemozhlivim vidnoviti normalnu robotu EOM bez perezavantazhennya tak yak yedinij sposib pripiniti robotu fork bombi ce odnochasne pripinennya roboti vsih pracyuyuchih kopij fork bombi U bilshosti realizacij operacijnih sistem viklik komandi dlya pripinennya roboti procesu vimagaye zapusku novogo procesu sho v umovah uspishno pracyuyuchoyi fork bombi nemozhlivo Odnak na praktici deyaki fork bombi ne vimagayut takih radikalnih zahodiv i mozhut buti znisheni bez neobhidnosti perezavantazhennya Rozglyanemo napriklad vipadok bombi z prikladu vishe amp Osoblivist cogo kodu v tomu sho vin ne zaciklyuyetsya pislya neuspishnogo porodzhennya svoyih kopij a zavershuye robotu V rezultati spisok procesiv postijno znahoditsya na mezhi zapovnennya odna z kopij fork bombi zavershuyetsya i misce sho zvilnyayetsya tut zhe zajmayetsya novostvorenim procesom z inshoyi kopiyi fork bombi Staye mozhlivim konkuruvati z fork bomboyu za zahoplennya miscya v spisku procesiv Todi mozhlivo rano chi pizno zapustiti komandu dlya odnochasnogo znishennya vsih kopij fork bombi abo zapustiti bezpechnu programu yaka bude postupovo vidvojovuvati misce v spisku procesiv do zavershennya roboti ostannogo procesu fork bombi Priklad takoyi bezpechnoyi programi na zsh while sleep 100 amp do doneZapobigannyaOdin zi sposobiv zapobigannya negativnim naslidkam roboti fork bombi primusove obmezhennya kilkosti procesiv yaki koristuvach mozhe zapustiti odnochasno Takozh mozhut buti obmezheni kilkist vidilenoyi virtualnoyi pam yati ta inshi sistemni resursi Pri vicherpanni maksimumu dostupnih procesiv sproba procesu stvoriti novij proces zaznaye nevdachi Maksimum sho zapuskayutsya procesiv povinen buti takim shob vin dozvolyav zapustiti rozumne korisne kilkist program ale ne privodiv do krahu sistemi pri odnochasnomu zapusku fork bombi vid vsih koristuvachiv sistemi Neobhidno vidznachiti sho obmezhennya kilkosti procesiv same po sobi ne zapobigaye zapusk fork bombi a lishe napravleno na minimizaciyu mozhlivoyi shkodi v razi yiyi spracovuvannya Inshe rozv yazannya problemi intelektualne rozpiznavannya fork bombi zasobami samoyi operacijnoyi sistemi ale ce rishennya ne znajshlo shirokogo zastosuvannya Isnuye i taka trudnist sho yaksho fork bomba zajmaye ves dostupnij procesornij chas to rezultati yiyi roboti mozhut buti katastrofichnimi ne tilki na odnoprocesornij ale i na bagatoprocesornij sistemi navit pri obmezhenni chisla procesiv Napriklad yaksho chislo procesoriv 16 a maksimum kilkosti zapushenih procesiv 100 to na kozhen procesor bude pripadati v serednomu 6 7 pracyuyuchih ekzemplyariv fork bombi sho pozhirayut procesornij chas Dlya rozv yazannya ciyeyi problemi zastosovuyetsya obmezhennya po priv yazci do procesoriv Div Takozhfork sistemnij viklik Unix podibnih operacijnih sistem vidpovidno do standartu POSIX Zombi shozhi vipadki vitoku sistemnih resursivPrimitkiodin z najbilsh elegantnih prikladiv fork bombi stvorenij en om