Mac 上的 Fork 炸弹?

Mac 上的 Fork 炸弹?

我刚刚了解到一个叉子炸弹,一种有趣的拒绝服务攻击类型。维基百科(和其他一些地方)建议:(){ :|:& };:在 UNIX 机器上使用无限次分叉进程。然而,它似乎不适用于 Mac OS X Lion(我记得读过最流行的操作系统不容易受到这种直接攻击)。然而,我对这种攻击的工作原理(和外观)非常好奇,并且想在我的 Mac 上尝试一下。有没有办法绕过系统的安全措施,或者fork炸弹在Mac上是不可能的?

答案1

Fork 炸弹的工作原理:在 C(或类 C)代码中,fork()调用一个名为的函数。这会导致 linux 或 Unix 或 Unix-a-likes 创建一个全新的进程。这个进程有一个地址空间、一个进程ID、一个信号掩码、打开的文件描述符,以及占用操作系统内核有限内存中空间的所有东西。新创建的进程还在内核的数据结构中获得一个位置以供进程运行。对于调用的进程来说fork(),看起来好像什么也没发生。分叉炸弹进程会尝试fork()尽可能快地调用、尽可能多次地调用。

诀窍是新创建的进程也从回来fork()在相同的代码中。分叉后,您将有两个进程运行相同的代码。每个新的分叉炸弹进程都会尝试fork()尽可能快地调用、尽可能多次地调用。您作为示例给出的代码是 fork 炸弹的 Bash 脚本版本。

很快,所有操作系统内核的进程相关资源都被用完。进程表已满。等待运行的进程列表已满。实际内存已满,因此分页开始。如果这种情况持续足够长的时间,交换分区就会被填满。

对于用户来说,这是什么样的:一切都运行得非常慢。当您尝试诸如ls.尝试 aps会导致无休止的暂停(如果它运行的话)并返回一个很长的进程列表。有时这种情况需要通过电源线重新启动。

叉子炸弹在过去曾被称为“兔子”。因为它们的繁殖速度太快了。

只是为了好玩,我用 C 语言编写了一个 fork 炸弹程序:

#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
        while (1)
                fork();

        return 0;
}

我在 Arch Linux 下的一个 xterm 中编译并运行了该程序。我在另一个 xterm 中尝试获取进程列表:

1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable

第二个 xterm 中的 Z shell 无法fork()成功调用,因为与第一个 xterm 关联的 fork 炸弹进程已耗尽与创建和运行的进程相关的所有内核资源。

答案2

可以采取许多保障措施来防止叉子炸弹发挥作用。

最简单的是:

ulimit -u 1024

将用户进程数限制为 1024。

至于绕过系统保护措施,你肯定可以找到一些方法来做到这一点,但我不认为这里的任何人都会给你一个方法来做到这一点,但基本上你的系统用完了 PID,无法再生成考虑到你的炸弹正在占用 100% 的 CPU 并试图产生更多的炸弹,所以基本上会完全停止。

答案3

如果您真的非常想了解叉子炸弹是如何工作的,请尝试运行它,例如:(){ :|:& },然后:再次警告。我自己在 Ubuntu 上尝试过。系统将冻结!

给大家简单剖析一下:

:() { #Define a new shell function
  :|:& #Pipe function named ':' through itself, creating two copies of itself, and make them run in the background
} #End of function definition block
;: #Call the ':' function. Note how the function is defined with two calls to itself piped through each other. This starts a chain reaction: those two copies will in turn create two more, and so on, ad infinitum

尝试造成此类伤害时请注意这一点。

答案4

您可以执行此操作,但请确保该文件名为 file.py

import os 
while True
  os.startfile(file.py)

然后运行它:

python file.py

相关内容