Как остановить и обнаружить вилочную бомбу

14
#include <stdlib.h>
#include <unistd.h>

int main()
{
   while(1)
      fork();
}

Это код для вилочной бомбы.

В нашем колледже мы подключаемся через telnet, т.е. протокол обслуживания клиентов. Около 100 систем подключены к серверу. Внезапно мы увидели, что сервер стал работать медленно, и через некоторое время он вышел из строя. Я узнал, что кто-то применил вилочную бомбу.

Как мы можем определить, в какой системе реализована вилочная бомба? И как мы можем это остановить?

Одним из способов является ограничение максимального количества процессов, которыми может владеть один пользователь. Есть ли способ остановить его и узнать, из какой системы он был реализован?

Раджеш М
источник
19
Telnet? Шутки в сторону? Вы действительно должны использовать SSH ...
ThiefMaster
См. Также unix.stackexchange.com/q/64611/17609
moooeeeep
Ну, это было перенесено из SO, но один ответ может быть на уровне ядра. некоторые исправления были сделаны предварительно, но, похоже, ни одна из них не была принята. Моя точка зрения такова: как это обнаружить: любой пользователь знает, что он больше не может использовать систему, поэтому точка обнаружения, возможно, не является ключевой. Как восстановить? Текущий ответ - перезагрузка, я бы сказал: способ сказать ядру запустить только один процесс (тот, который вы хотите убрать в беспорядке) и остановить все остальные, какими бы они ни были. Это может быть функция, доступная только в системной консоли.
Филипп Лхарди

Ответы:

16

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

Просто войдите как root и отредактируйте этот файл, чтобы добавить пользователей и настроить их ограничение.

# vi /etc/security/limits.conf

Добавить эту строку в файл

john hard nproc 10

Теперь пользователь john может создать только 10 процессов.

Барат Бушан
источник
Я думаю, что вы должны перезагрузиться, чтобы новые настройки /etc/security/limits.confвступили в силу.
Дэн Д.
2
Нет. Но они применяются PAM, поэтому они применяются только к новым логинам.
ThiefMaster
14

Чтобы остановить работающую вилочную бомбу, вы можете killall <name>убить все процессы бомбы. Однако, поскольку бомба-вилка обычно приводит к невероятно высокой нагрузке на систему, вы не сможете подключиться к ней по SSH или выполнить ее. Таким образом, перезагрузка может быть необходимой или, по крайней мере, намного быстрее.

Если у каждого пользователя есть собственная учетная запись в системе, вы можете просто проверить домашний каталог каждого и найти исполняемый файл. Скорее всего, он также загрузил исходный код, поэтому найти его не должно быть слишком сложно. Если это была общая учетная запись для всех студентов, вам не повезло. Особенно после того, как сеанс telnet или ssh пользователя завершился, у вас нет возможности узнать, кто его запустил.

Однако вместо того, чтобы наказывать пользователя, взорвавшего эту вилочную бомбу, вы должны скорее исправить конфигурацию системы, чтобы обезвредить вилочные бомбы. Вы можете установить пределы процессов для каждого пользователя, используя /etc/security/limits.confи таким образом предотвратить выход из-под контроля вилочной бомбы - например, всего с 50 процессами вилочная бомба не нанесет большого ущерба.

ThiefMaster
источник
невозможно определить, из какой системы он приходит?
Раджеш М
@ user1670364: Не понятно, о чем ты спрашиваешь. Что вы подразумеваете под "его приходом"? Вы можете сказать, какой пользователь владеет процессом, что еще вы хотите знать?
Дэвид Шварц
@ Дэвид Шварц, я имею в виду, можно ли обнаружить вилочную бомбу, на какой системе он внедряется?
Раджеш М
@ user1670364: Если вы имеете в виду систему, которая на самом деле запускает вилочную бомбу, то она медленная. Если вы имеете в виду пользователя, который несет ответственность, то именно пользователь владеет процессами, которые разветвляются.
Дэвид Шварц