Команда Bash:() {: |: &};: будет порождать процессы до смерти ядра. Можете ли вы объяснить синтаксис?
Я наткнулся на эту страницу и не могу понять, как это работает.
Эта команда "экспоненциально порождает подпроцессы, пока ваш ящик не заблокируется".
Но почему? То, что я больше ощущаю, это двоеточия.
[email protected]$ :(){ :|:& };:
Ответы
Ответ 1
Определяет функцию с именем :
, которая дважды вызывает вызов (Code: : | :
). Он делает это в фоновом режиме (&
). После ;
выполняется определение функции и запускается функция :
.
Итак, каждый экземпляр: запускает два новых: и так далее... Как двоичное дерево процессов...
Написанный в plain C, который есть:
while(1) {
fork();
}
Ответ 2
:(){ :|:& };:
.. определяет функцию с именем :
, которая сама порождает (дважды, одну трубку в другую) и сама фонов.
С разрывами строк:
:()
{
:|:&
};
:
Переименование функции :
на forkbomb
:
forkbomb()
{
forkbomb | forkbomb &
};
forkbomb
Вы можете предотвратить такие атаки, используя ulimit
, чтобы ограничить количество процессов для пользователя:
$ ulimit -u 50
$ :(){ :|:& };:
-bash: fork: Resource temporarily unavailable
$
Навсегда, вы можете использовать /etc/security/limits.conf
(по крайней мере, на Debian и других), например:
* hard nproc 50
Конечно, это означает, что вы можете запускать только 50 процессов, вы можете увеличить их в зависимости от того, что делает машина!
Ответ 3
У меня были разные эффекты при попытке этого. В зависимости (я полагаю) от настроенного верхнего предела для количества процессов и мощности ЦП, это вызвало едва ли удар по некоторым системам, полностью заморозив другие.