LINUX.ORG.RU

Защита от форк бомбы?

 , , ,


4

4

Нехороший человек стал надоедать с fork-бомбами. Я был уверен, что поборол его: http://blog.amet13.name/2014/12/fork-ispmanager.html Что я упустил или понял не так? Сейчас та же форк-бомба, только перловая ложит сервер, ничего сделать с сервером не могу:

user      909  0.0  0.0  16868   468 ?        D    20:51   0:00 /usr/bin/perl ffff.pl
user      910  0.0  0.0      0     0 ?        Z    20:51   0:00 [ffff.pl] <defunct>
user      911  0.0  0.0      0     0 ?        Z    20:51   0:00 [ffff.pl] <defunct>
user      912  0.0  0.0      0     0 ?        Z    20:51   0:00 [ffff.pl] <defunct>
На любую попытку ввести команду по ssh:
cannot allocate memory

★★★★★

позвоните уже администратору сервера

anonymous ()
$ ulimit -a
-t: cpu time (seconds)         unlimited
-f: file size (blocks)         unlimited
-d: data seg size (kbytes)     unlimited
-s: stack size (kbytes)        8192
-c: core file size (blocks)    0
-m: resident set size (kbytes) unlimited
-u: processes                  512
-n: file descriptors           1024
-l: locked-in-memory size (kb) 64
-v: address space (kb)         unlimited
-x: file locks                 unlimited
-i: pending signals            14495
-q: bytes in POSIX msg queues  819200
-e: max nice                   0
-r: max rt priority            0
-N 15:                         unlimited
sin_a ★★★★★ ()

В Solaris есть удобный механизм для ограничения количества запускаемых процессов/потоков — проект.

#projadd -U testuser -K 'project.max-lwps=(privileged,2048,deny)' user.testuser
Пользователь testuser не сможет запустить более 2048 потоков.

Deathstalker ★★★★★ ()
Ответ на: комментарий от sin_a

сейлормун, не используй лунную призму - она наше последнее секретное оружие. Воспользуйся ей, после того как придёт и сольётся такседомаск с банхаммером!

darkenshvein ★★★★★ ()
Ответ на: комментарий от darkenshvein

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

sin_a ★★★★★ ()
Ответ на: комментарий от sin_a

А по ссылке ходили? Я ограничивал processes до 20. Или что-то упустил?

Amet13 ★★★★★ ()

Есть какой-то «cgroups» может он лучше работает чем эти limits.conf

crowbar ()
Ответ на: комментарий от darkenshvein

userdel

Контролировать действия каждого нового юзера на хостинге?

memory quotas, OOM-killer

А конкретней можно?

Amet13 ★★★★★ ()

Хм. Форк бомба на С грузит систему овердохрена, по в итоге он убивается, и все продолжает работать в нормальном режиме.

roman77 ★★★★★ ()
Последнее исправление: roman77 (всего исправлений: 1)

Так подкрути лимиты. Что сложного

invokercd ★★★★ ()
Ответ на: комментарий от invokercd

Подкрутил, по ссылке написано. Может что-то упустил, вроде тестил, все нормально было.

Amet13 ★★★★★ ()
Ответ на: комментарий от Amet13

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

darkenshvein ★★★★★ ()

Сейчас та же форк-бомба, только перловая ложит сервер

Прям абсолютно та же? Прям один в один?
Докажи

zolden ★★★★★ ()
Ответ на: комментарий от zolden

Не та же.

Вот перловый скрипт с содержанием:

#!/usr/bin/perl
fork while fork
юзер закинул в cgi-bin.

Те подкрученные мною лимиты по ссылке не действуют в таком случае? И если да, что как быть?

Amet13 ★★★★★ ()

Неужто прописывать во всех конфигах pam limits?

Amet13 ★★★★★ ()
Ответ на: комментарий от sin_a

лимиты на кол-во процессов, а здесь памяти не хватает.

sdio ★★★★★ ()
Ответ на: комментарий от sdio

У меня вообще дефолтные значения Alt. Читал невнимательно и только у себя проверил что они работают.

sin_a ★★★★★ ()
Последнее исправление: sin_a (всего исправлений: 1)
Ответ на: комментарий от sdio

Почему памяти не хватает? Я же ограничение на процессы ставил, на баш-сессии они срабатывали, а на перловой - нет.

Вот и назревает вопрос, какой конфиг pam.d использует перл/cgi?

Amet13 ★★★★★ ()
Ответ на: комментарий от Amet13

какой конфиг pam.d использует перл/cgi?

Зависит от того, что у тебя там - модуль апача, чистый cgi(1 процесс на 1 запрос) или какой-нибудь FastCGI

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Amet13

Вот и назревает вопрос, какой конфиг pam.d использует перл/cgi?

скорее всего никакой

maloi ★★★★★ ()
Ответ на: комментарий от invokercd

стрёмное решение у тебя по ссылке.

Вместо загрузки с live - можно просто и безопасно загрузиться в single-mode

И еще, отрубить exec() и аналогичные фени которые не позволят школьникам портить всю малину.

PS: ispmanager - говно.

invokercd ★★★★ ()

дай угадаю, апач с каким-нибудь mod_fcgid, запущенный через init.d? Оно форкнет процесс с setuid и все твои лимиты сотрутся к чертям. Попробуй свой перл-форк запустить, в консоли он не должен работать, а в cgi-bin должен. Попробуй вписать свой ulimit -u или что ты там делаешь в инитскрипт стартующий апач и рестартани.

stevejobs ★★★☆☆ ()
Ответ на: комментарий от stevejobs

А что есть в содержимое перлового скрипта, собственно записать не #!/usr/bin/perl fork while fork а

#!/usr/bin/perl
system("ulimit -a");

Это уже будет считаться как вызов шелл команды и будет игнорировать limits?

Amet13 ★★★★★ ()
Последнее исправление: Amet13 (всего исправлений: 2)
Ответ на: комментарий от Amet13

я не помню перла, но по идее system(«ulimit -a») должно дернуть шелл, а system(«ulimit»,"-a") шелл не дернет

так ты уже попробовал ulimit -u 256 в конфиге апача? xD

stevejobs ★★★☆☆ ()
Ответ на: комментарий от Amet13
#!/usr/bin/perl
use strict;
use warnings;
my @info = system("bash -c \"ulimit -a\"");
foreach my $i (@info) {
 print "$i\n";
}
stevejobs ★★★☆☆ ()
Ответ на: комментарий от stevejobs

Нет, если честно не совсем понял, куда в инициализационный файл апача вставлять код. Сейчас проверю свои версии с pam и подумаю над Вашим предложением. Спасибо.

Amet13 ★★★★★ ()
Ответ на: комментарий от Amet13

вот еще нашел как шелл запускать из перла:

#!/usr/bin/perl
use strict;
use warnings;
my $info = <<`SHELL`;
ulimit -a
exit 0
SHELL
print "$info\n";
stevejobs ★★★☆☆ ()
Ответ на: комментарий от Amet13

Нет, если честно не совсем понял, куда в инициализационный файл апача вставлять код.

в самый верх инитскрипта. делаешь vim /etc/init.d/apache2 (или как он там у тебя называется), и первой же строчкой после #!/bin/sh делаешь ulimit -u 256 И сразу после этого перезапускаешь через sudo service apache2 restart

stevejobs ★★★☆☆ ()
Ответ на: комментарий от stevejobs

Да, в limits.conf ограничение удалил. В инициализационный скрипт запись добавил. Бомба по крону запустилась, лимит не сработал.

Amet13 ★★★★★ ()
Ответ на: комментарий от stevejobs

Значит, что я сделал.

Практически во всех конфигах /etc/pam.d/* прописал session required pam_limits.so.

В limits.conf:

@mgrsecure       soft    nproc          20
Запустил перловый скрипт с содержимым:
#!/usr/bin/perl
system("ulimit -a > new.file");
Таким образом при всех включеных лимитах во всех файлах в каком-то файле должен сработать лимит.

Либо я вообще не в ту сторону рою.

Amet13 ★★★★★ ()
Ответ на: комментарий от Amet13

каким именно модулем запускаются у тебя эти перловые скрипты в апаче?

stevejobs ★★★☆☆ ()

Просто нужно удалить интерпретатор пердла.

postman_ ★☆ ()
Ответ на: комментарий от stevejobs

Не знаю, как можно отследить?

Дефолтная связка apache+nginx+fastcgi cgi-bin юзерам разрешен.

Amet13 ★★★★★ ()
Ответ на: комментарий от stevejobs

Пока временное решение, сделать права 754 для перла и питона.

Amet13 ★★★★★ ()
Ответ на: комментарий от Amet13

В инициализационный скрипт запись добавил. Бомба по крону
запустилась, лимит не сработал.

А как, вообще, запускается apache ? И Апач ли ? Впрочем, если не Апач, всё может быть как-то аналогично.

Во многих Линуксах используется скрипт apachectl (apachectl2). В нём могут быть свои настройки для данного момента. Причём ещё этот apachectl может быть разным, в зависимости от дистрибутива. В некоторых httpd может запускаться через limited, тогда конфиг может быть в /etc/sysconfig/limits.d/ каком-нибудь, или в /etc/sysconfig/limits... Варианты, в общем, есть.

AS ★★★★★ ()
Последнее исправление: AS (всего исправлений: 1)
Ответ на: комментарий от AS

Пробовал в /etc/apache2/envvars писать:

APACHE_ULIMIT_MAX_PROCESSES='ulimit -u 20'

Перезапускал апач. Смотрел proc/$ID/limits для одного из процессов апача, лимит не работает.

Amet13 ★★★★★ ()
Ответ на: комментарий от Amet13

Пробовал в /etc/apache2/envvars писать:

Вопрос - кто это читает. Смотри в стартовый скрипт сначала. Надо найти, как именно запускается процесс httpd, и оттуда уже смотреть. Как это в Дебиане, не знаю, потому только принцип поиска объясняю.

AS ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.