携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
Fork bomb attack (Rabbit virus)
什么是 Fork bomb attack (Rabbit virus)?
分叉是Unix和Linux系统中使用的系统调用,它采用现有进程(又名父进程)并复制它,形成一个新进程(又名子进程)。这允许两个进程同时执行独特的任务。
分叉炸弹(也称为“兔子病毒”)是一种拒绝服务(DoS)攻击,其中分叉系统调用被递归使用,直到所有系统资源执行命令。系统最终会变得过载,无法响应任何输入。与大多数DoS攻击相反,大多数DoS攻击通常是通过外部淹没网络或计算机资源而发生的,而叉子炸弹使用它试图关闭的系统内的命令。有时它甚至可能是自己造成的。
攻击描述
在分叉炸弹攻击中,自我复制的子进程会消耗系统资源,阻止合法程序运行并阻止创建新进程。在攻击期间,键盘输入(例如,注销尝试)将被忽略,实质上锁定了系统。
由于分叉环路会消耗 CPU 和内存,因此系统资源通常在操作系统达到允许的最大进程之前很久就耗尽了。这会导致“内核崩溃”,即核心操作系统(内核)无法应对并崩溃。
对于大多数系统,冻结会持续到计算机重新启动,并且通常需要硬重新启动才能重新获得控制权。数据丢失的可能性很大。某些内核可能具有预设的限制,最终允许管理员访问系统
易受攻击的操作系统
所有Unix,Linux或类似Unix的操作系统都可能容易受到分叉炸弹攻击,包括Ubuntu,Debian,Red Hat或AIX。
Windows操作系统不容易受到传统的分叉炸弹攻击,因为它们无法分叉其他进程。要在Windows上创建类似于分叉炸弹的攻击,需要快速创建一组新进程。这需要比传统的叉形炸弹更复杂的编程。
叉形炸弹示例
以下字符包含用于启动分叉炸弹的基本 Linux shell 脚本:
- :() – 在 Linux 函数中定义一个函数,命名为 :
- { } – 包含函数将运行的命令
- :|: – 以递归方式运行命令,这意味着输出通过管道传输到在子shell中运行的命令的另一个版本
- & – 在后台运行前面的命令
- ;– 将定义命令的函数与下一个命令分开
- : – 运行命令,这是新创建的函数 – :
执行该命令会创建一个子进程,然后该子进程在无限循环中重复自身。结果是系统无法响应,因为其所有资源都用于创建这些空进程。
常见编程语言中叉弹攻击的代码示例包括:
示例 – Python Fork Bomb
#!/usr/bin/env python
import os
while True: os.fork()
示例 – Java Fork Bomb
/** A basic forkbomb */
public class Bomb {
/** Utility class */
private Bomb() {}
/** CLI entry point
@param args CLI flags
*/
public static void main(final String[] args) throws IOException {
while (true) {
Runtime.getRuntime().exec(
String.format("javaw -cp %s us.yellosoft.forkbombs.Bomb", System.getProperty("java.class.path"))
);
}
}
}
示例 – 红宝石叉炸弹
#!/usr/bin/env ruby
loop { fork { bomb } }
示例 – C叉炸弹
#include <unistd.h>
int main(void) {
for (;;) {
fork();
}
}
缓解方法
防止叉形炸弹是通过限制用户可以拥有的最大进程数来完成的。这是通过以下方式实现的:
- 使用 Unix/Linux ulimit 参数来限制用户可以创建的进程数。例如,ulimit=30 将用户限制为拥有 30 个进程。但是,该命令是特定于会话的 , 在会话结束后重置限制。
- 使用 /etc/security/limits.conf 文件在系统中设置进程限制。这是首选方法,因为该设置可以应用于所有配置文件,从而降低编辑每个用户的 .profile 设置的风险。
应该注意的是,即使设置了正确的 limits.conf,超级用户和任何具有管理权限的进程仍然可以发起分叉炸弹攻击。
即使使用现代操作系统,也没有完美的方法来防止叉形炸弹。但是,强制实施一般安全最佳实践并防止不受信任的软件在root上运行可以阻止绝大多数叉形炸弹攻击场景。