我刚刚了解到一个叉子炸弹,一种有趣的拒绝服务攻击类型。维基百科(和其他一些地方)建议:(){ :|:& };:
在 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