如何停止和检测叉子炸弹

Raj*_*h M 15 telnet operating-systems process c

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

int main()
{
   while(1)
      fork();
}
Run Code Online (Sandbox Code Playgroud)

这是分叉炸弹的代码。

在我们学院,我们通过 telnet 即客户端服务协议进行连接。大约 100 个系统连接到服务器。突然我们看到服务器变得很慢,一段时间后它崩溃了。我开始知道有人实施了一个叉子炸弹。

我们如何检测分叉炸弹是在哪个系统上实现的?我们怎样才能阻止它?

一种方法是限制单个用户可以拥有的最大进程数。有什么方法可以阻止它并知道它是从哪个系统实现的?

Bar*_*han 16

一种方法是限制一个用户可以运行的进程数。

只需以 root 身份登录,然后编辑此文件,即可添加用户并配置其限制。

# vi /etc/security/limits.conf
Run Code Online (Sandbox Code Playgroud)

将此行添加到文件中

john hard nproc 10
Run Code Online (Sandbox Code Playgroud)

现在用户 john 只能创建 10 个进程。

  • 否。但它们由 PAM 应用,因此它们仅适用于新登录。 (2认同)

Thi*_*ter 14

要停止正在运行的 fork 炸弹,您可以使用killall <name>来杀死炸弹的所有进程。但是,由于分叉炸弹通常会导致系统负载非常高,您可能无法通过 SSH 连接或执行它。因此,可能需要重新启动,或者至少要快得多。

如果每个用户在系统上都有自己的帐户,您只需检查每个人的主目录并搜索可执行文件即可。很有可能他还上传了源代码,所以找到它应该不会太难。如果它是所有学生的共享帐户,那你就不走运了。尤其是在用户的 telnet 或 ssh 会话终止后,您将没有机会找出是谁启动的。

但是,与其惩罚引爆叉形炸弹的用户,不如修复系统配置以解除叉形炸弹。您可以设置每个用户的进程限制/etc/security/limits.conf,从而防止分叉炸弹失控——例如,只有 50 个进程,分叉炸弹不会造成太大损害。