Solaris
В Solaris есть удобный механизм для ограничения количества запускаемых процессов/потоков – это проэкт. Что бы пользователи не смогли положить сервер fork-бомбой, нужно им ограничить количество LWP. Создадим проект и поместим туда пользователя testuser:
#projadd -U testuser -K 'project.max-lwps=(privileged,2048,deny)' user.testuser
Теперь пользователь testuser не сможет запустить более 2048 потоков.
Для тестирования можно использовать такую бомбу:
#!/usr/bin/bash
:(){ :|:& };:
Больше for bomb на разных языках можно взять здесь
Linux
Если у вас запустили fork-бомбу, но у вас осталась ssh сессия, то можно убить все приложения вот так:
#exec busybox/python
откуда в цикле убить все процессы не порождая новых процессов.
Чтобы защититься от fork bomb достаточно выставить ограничения в файле /etc/security/limits.conf:
testuser hard nproc 2048
testuser hard nofile 2048
FreeBSD
Для защиты создаем соответствующий login class в /etc/login.conf
limited_profile:\ :maxproc=2048:\ :tc=default:
и потом его применить для конкретного пользователя:
# cap_mkdb /etc/login.conf
# pw usermod -L limited_profile testuser
# grep clamav /etc/master.passwd | cut -f5 -d':'
limited_profile
Но данные ограничения не будут работать, для jail’ов. То есть, внутри jail’a можно сделать fork bomb (например, root пользователь внутри самого jail’a может не иметь ограничений) и тем самым “положить” весь сервер. Для ограничения процессов с учётом jail’ов, нужно применять rctl (доступно, начиная с FreeBSD 9):
# rctl -a jail:myJail:maxproc:deny=100