Fork 炸弹
Fork 炸弹 是什么?
Fork 炸弹通过让进程不断派生(fork)自身,耗尽主机进程表、内存与 CPU 的拒绝服务技术。
Fork 炸弹是一种恶意或意外的代码,它递归地派生子进程,每轮翻倍,直至内核上限、内存或 CPU 被占满,系统随之失去响应。经典的 POSIX 单行命令 :(){ :|:& };: 定义了一个名为 : 的函数,它将自身的两个副本管道连接后置于后台,然后调用它;每一代都会使进程数翻倍,因此进程表会在数秒内被填满。这一构想远早于 Unix——它最早的名称之一是 “wabbit” 或兔子(rabbit)程序,据称大约在 1969-1974 年间出现在华盛顿大学的一台 Burroughs 大型机上。
Fork 炸弹不像蠕虫那样通过网络传播;它们是本地的资源耗尽攻击,但在共享的多用户主机、CI 运行器和容器上极为有效——在这些环境中,单个非特权用户就能让所有人无法使用服务。
防御手段是限制一个进程树可消耗的资源,而非阻止系统调用本身。在 Linux 上,关键的控制手段包括 ulimit -u / PAM pam_limits(nproc),用于限制每个用户的进程数;以及 cgroups 的 pids 控制器(pids.max)——Docker 和 Kubernetes 通过 --pids-limit 将其暴露出来——用于限制容器的任务数量。账户隔离、不可信代码沙箱以及专用的 CI 执行器可进一步收缩爆炸半径。
flowchart TD
A[":() 函数<br/>调用自身两次"] --> B[子进程 1]
A --> C[子进程 2]
B --> D[孙进程]
B --> E[孙进程]
C --> F[孙进程]
C --> G[孙进程]
D --> H["…… 指数级增长 ……"]
E --> H
F --> H
G --> H
H --> I{"达到 pids.max / ulimit -u?"}
I -->|无限制| J[进程表耗尽 — 主机挂起]
I -->|已设限制| K[新的 fork 以 EAGAIN 失败 — 主机存活]● 示例
- 01
经典的 Bash 单行 DoS 演示 `:(){ :|:& };:`。
- 02
在无限循环内意外调用 fork 的有缺陷 CI 脚本。
● 常见问题
Fork 炸弹 是什么?
通过让进程不断派生(fork)自身,耗尽主机进程表、内存与 CPU 的拒绝服务技术。 它属于网络安全的 恶意软件 分类。
Fork 炸弹 是什么意思?
通过让进程不断派生(fork)自身,耗尽主机进程表、内存与 CPU 的拒绝服务技术。
如何防御 Fork 炸弹?
针对 Fork 炸弹 的防御通常结合技术控制与运营实践,详见上方完整定义。
Fork 炸弹 还有哪些其他名称?
常见的别称包括: Wabbit, 兔子病毒。