Mac 上的叉子炸弹?

8 osx security process fork

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

小智 3

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;
}
Run Code Online (Sandbox Code Playgroud)

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

1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)

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