如何停止和检测叉子炸弹


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

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

这是叉炸弹的代码。

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

我们如何检测到在哪个系统上实施了分叉炸弹?我们如何阻止它?

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


19
Telnet?认真吗 您应该真正使用SSH ...
ThiefMaster 2013年



很好,它是从SO迁移的,但是一个答案可能是在内核级别。一些补丁已经初步完成,但似乎没有一个被接受。我的观点是:如何检测它:任何用户都会知道它不再可以使用系统,因此检测点可能不是重点。如何恢复?我会说,当前的答案是重新启动,这是一种告诉内核仅运行一个进程(您要清理混乱的进程)并停止所有其他进程的方法。这可能是仅在系统控制台中可访问的功能。
philippe lhardy

Answers:


16

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

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

# vi /etc/security/limits.conf

将此行添加到文件

john hard nproc 10

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


我认为您必须重新启动才能使新设置/etc/security/limits.conf生效。
Dan D.

2
否。但是它们是由PAM应用的,因此仅适用于新登录名。
ThiefMaster

14

要停止正在运行的叉子炸弹,您可能可以使用它killall <name>来杀死炸弹的所有过程。但是,由于前叉炸弹通常会给系统带来极高的负载,因此您可能无法通过SSH或执行该负载。因此,重新启动可能是必要的,或者至少要快得多。

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

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


它无法检测到它来自哪个系统?
Rajesh M

@ user1670364:不清楚您要问什么。“即将到来”是什么意思?您可以告诉谁拥有该过程,您还想知道什么?
David Schwartz

@DavidSchwartz我的意思是它有可能检测到在哪个系统上实施的前叉炸弹?
Rajesh M

@ user1670364:如果您的意思是实际上正在运行前叉炸弹的系统,则它的运行速度很慢。如果您是负责的用户,则是拥有要进行分叉的流程的用户。
David Schwartz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.