#include <stdlib.h>
#include <unistd.h>
int main()
{
while(1)
fork();
}
这是叉子炸弹的代码。
在我们大学,我们通过 telnet 即客户端服务协议进行连接。大约有 100 个系统连接到服务器。突然我们发现服务器变慢了,过了一段时间就崩溃了。我才知道有人实施了 fork 炸弹。
我们如何检测哪个系统上实施了 fork 炸弹?我们如何阻止它?
一种方法是限制单个用户拥有的最大进程数。有什么方法可以停止它并知道它是从哪个系统实现的?
答案1
一种方法是限制用户可以运行的进程数量。
只需以 root 身份登录,然后编辑此文件,添加用户并配置其限制。
# vi /etc/security/limits.conf
将这一行添加到文件中
john hard nproc 10
现在用户john只能创建10个进程。
答案2
要停止正在运行的 fork 炸弹,您可以killall <name>
终止炸弹的所有进程。但是,由于 fork 炸弹通常会导致系统负载极高,您可能无法通过 SSH 进入或执行该操作。因此可能需要重新启动,或者至少要快得多。
如果每个用户在系统上都有自己的帐户,那么您只需检查每个人的主目录并搜索可执行文件即可。他很有可能还上传了源代码,因此找到它应该不难。如果这是所有学生共享的帐户,那么您就没那么幸运了。特别是在用户的 telnet 或 ssh 会话终止后,您就没有机会找出是谁启动了它。
但是,与其惩罚引爆 fork 炸弹的用户,不如修复系统配置以解除 fork 炸弹。您可以使用设置每个用户的进程限制,/etc/security/limits.conf
从而防止 fork 炸弹失控 - 例如,只有 50 个进程,fork 炸弹不会造成太大的损害。