Форк бомба

Thank you for reading this post, don't forget to subscribe!

Форк бом­ба Linux – это один из самых ста­рых и наи­бо­лее эффек­тив­ных спо­со­бов выве­сти систе­му Linux из строя.

Это тип ата­ки типа “отказ в обслу­жи­ва­нии”, кото­рая рабо­та­ет путем порож­де­ния все боль­ше­го коли­че­ства про­цес­сов, пока в конеч­ном ито­ге все ресур­сы систе­мы не будут исчер­па­ны, и она не рухнет.

В этом руко­вод­стве вы уви­ди­те, как раз­ру­шить систе­му Linux с помо­щью форк бомбы.

Мы так­же рас­смот­рим неко­то­рые шаги, кото­рые вы може­те пред­при­нять для предот­вра­ще­ния таких вещей, как форк бом­ба и чрез­мер­ное коли­че­ство порож­да­е­мых про­цес­сов, кото­рые могут при­ве­сти к кра­ху вашей системы.

Сле­ду­ю­щая стро­ка кода явля­ет­ся корот­ким вари­ан­том использования:

$ :(){ :|:& };:

На пер­вый взгляд, это может пока­зать­ся абра­ко­даб­рой и доволь­но без­обид­ным для выпол­не­ния, но давай­те посмот­рим, что здесь про­ис­хо­дит на самом деле:

  • : – это имя функции
  • :|: вызы­ва­ет саму функ­цию и порож­да­ет дру­гой процесс
  • & пере­во­дит про­цесс в фоно­вый режим, что­бы его нель­зя было лег­ко убить
  • ; отме­ча­ет конец функции
  • : сно­ва вызы­ва­ет функцию

Имей­те в виду, что суще­ству­ют и дру­гие типы форк бомб.

Напри­мер, их мож­но запро­грам­ми­ро­вать на Perl, Python и дру­гих языках.

Та, кото­рую мы пока­за­ли здесь, явля­ет­ся наи­бо­лее часто исполь­зу­е­мой и будет рабо­тать в обо­лоч­ке Bash.

Вот тот же вызов функ­ции в более удо­бо­чи­та­е­мом формате:

forkbomb(){ forkbomb | forkbomb & }; forkbomb

Как вы може­те видеть, функ­ция вызы­ва­ет себя дважды .

Это дей­ствие нач­нет потреб­лять все ресур­сы вашей систе­мы и в конеч­ном ито­ге при­ве­дет к кра­ху вашей Linux-системы.

Ваши резуль­та­ты могут отли­чать­ся, в зави­си­мо­сти от кон­фи­гу­ра­ции систе­мы Linux, исполь­зу­е­мо­го дис­три­бу­ти­ва и т.д.

На нашей тесто­вой систе­ме Ubuntu выпол­не­ние fork bomb забло­ки­ро­ва­ло систе­му, и в конеч­ном ито­ге тер­ми­нал начал запол­нять­ся эти­ми сообщениями:

bash: fork: retry: Resource temporarily unavailable.

Даже после закры­тия тер­ми­на­ла систе­ма была слиш­ком мед­ли­тель­ной и не реа­ги­ро­ва­ла ни на что, и мы были вынуж­де­ны перезагрузиться.

Как предотвратить крах Linux из-за форк бомбы

Форк бом­ба эффек­тив­на, пото­му что она спо­соб­на порож­дать неогра­ни­чен­ное коли­че­ство процессов.

В кон­це кон­цов, ваша систе­ма не смо­жет обра­бо­тать их все, и про­изой­дет сбой.

Поэто­му мы можем предот­вра­тить подоб­ные сбои, огра­ни­чив коли­че­ство про­цес­сов, кото­рые может порож­дать поль­зо­ва­тель или груп­па пользователей.

Луч­ший спо­соб нало­жить огра­ни­че­ние на коли­че­ство про­цес­сов, кото­рые может порож­дать поль­зо­ва­тель, – это отре­дак­ти­ро­вать файл /etc/security/limits.conf.

В каче­стве при­ме­ра, давай­те попро­бу­ем вве­сти огра­ни­че­ние на коли­че­ство про­цес­сов, кото­рые могут порож­дать поль­зо­ва­те­ли из груп­пы “corporate”.

Добав­ле­ние этой стро­ки в файл поз­во­лит поль­зо­ва­те­лям из груп­пы порож­дать не более 30 процессов.

@corporate hard nproc 30

Что если мы хотим нало­жить огра­ни­че­ние на про­цесс для кон­крет­но­го пользователя?

В этом слу­чае мы поме­стим его имя поль­зо­ва­те­ля в пер­вое значение.

Вот стро­ка, кото­рую мы исполь­зу­ем, что­бы огра­ни­чить поль­зо­ва­те­ля с име­нем itsecforu в порож­де­нии мак­си­мум 40 процессов.

itsecforu hard nproc 40