fork炸弹

:(){ :|:& };:                         # 著名的 fork炸弹,系统执行海量的进程,直到系统僵死

fork炸弹(fork bomb)在计算机领域中是一种利用系统调用fork(或其他等效的方式)进行的拒绝服务攻击。与病毒与蠕虫不同的是,fork炸弹没有传染性,而且fork炸弹会使对同时执行进程/程序数设限的系统无法执行新程序,对于不设限的系统则使之停止响应。以fork炸弹为代表的自我复制程序有时亦被称为wabbit。

fork炸弹的概念:进程递归式派生(fork,亦即自我复制),以使系统拒绝服务甚至崩溃

原理与影响

fork炸弹以极快的速度创建大量进程(进程数呈以2为底数的指数增长趋势),并以此消耗系统分配予进程的可用空间使进程表饱和,而系统在进程表饱和后就无法运行新程序,除非进程表中的某一进程终止;但由于fork炸弹程序所创建的所有实例都会不断探测空缺的进程槽并尝试取用以创建新进程,因而即使在某进程终止后也基本不可能运行新进程。fork炸弹生成的子程序在消耗进程表空间的同时也会占用CPU和内存,从而导致系统与现有进程运行速度放缓,响应时间也会随之大幅增加,以致于无法正常完成任务,从而使系统的正常运作受到严重影响。

除了恶意触发fork炸弹破坏的情况外,软件开发中有时也会不慎在程序中嵌入fork炸弹,如在用于监听网络套接字并行使客户端-服务器结构系统中服务器端职责的应用程序中可能需要无限地进行循环(loop)与派生(fork)操作(类似下节示例程序所示),而在这种情况下源代码内的细微错误就可能在测试中"引爆"fork炸弹。

折叠编辑本段示例

以下程序段就是由Jaromil所作的在类UNIX系统的shell环境下触发fork炸弹的shell脚本代码,总共只用了13个字符(包括空格):

:(){ :|:& };:

注解如下:

:() # 定义函数,函数名为":",即每当输入":"时就会自动调用{}内代码

{ # ":"函数开始标识

: # 用递归方式调用":"函数本身

| # 并用管道(pipe)将其输出引至...

: # 另一次递归调用的":"函数

# 综上,":|:"表示的即是每次调用函数":"的时候就会生成两份拷贝

& # 调用间脱钩,以使最初的":"函数被杀死后为其所调用的两个":"函数还能继续执行

} # ":"函数结束标识

; # ":"函数定义结束后将要进行的操作...

: # 调用":"函数,"引爆"fork炸弹

其中函数名":"只是简化的一例,实际实现时可以随意设定,一个较易理解(将函数名替换为"forkbomb")的版本如下:

forkbomb(){ forkbomb|forkbomb &} ; forkbomb

Windows下则可以批处理命令如下实现:

%0|%0

POSIX标准下的C与C++的实现:

#include <unistd.h>int main(){while(1) fork();return0;}

Perl语言的实现:

fork while fork

折叠编辑本段"熄火"

在系统中成功"引爆"fork炸弹后,我们可重启来使系统恢复正常运行;而若要以手动的方法使fork炸弹"熄火",那前提就是必须杀死fork炸弹产生的所有进程。为此我们可以考虑使用程序来杀死fork炸弹产生的进程,但由于这一般需要创建新进程,且由于fork炸弹一直在探测与占用进程槽与内存空间,因而这一方法几乎不可能实现,而且用kill命令杀死进程后,释放出的进程槽又会被余下的fork炸弹线程所产生的新进程占用,

在Windows下,用户可以退出当前用户会话的方式使系统恢复正常,但此法奏效的前提是fork炸弹是在该用户的特定会话内触发的。

折叠编辑本段预防

由于Fork Bomb通过不断的开新进程来瘫痪系统,一个防止其严重影响系统的方法就是限定一个用户能够创建的进程数的上限,在Linux系统上,可以通过ulimit这个指令达到相应的效果,例如: ulimit -Hu 30 这个指令可以限制每一个用户最多只能创建30个进程。而FreeBSD系统的话系统管理者可以在/etc/login.conf底下的设置档进行相关的设置

时间: 2025-01-15 18:46:38

fork炸弹的相关文章

Linux shell 的一个fork炸弹

.(){ .|.& };.  或者  :(){ :|:& };: 这13个字符由Jaromil ,在 2002 年设计了最为精简的一个 fork炸弹的实现. .()  说明下面要定义一个函数,函数名为小数点,没有可选参数:{    表示函数体的开始:.|.& 表示函数体真正要做的事情,首先它递归使用本函数,然后李永贵管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行.}    表示函数体的结束:;    并不会执行什么操作,在命令行中用来分隔两个命令用.从总体

递归应用:让系统卡住 fork炸弹

bash shell : { :|: } : 其中函数名":"只是简化的一例,实际实现时可以随意设定,一个较易理解(将函数名替换为"forkbomb")的版本如下: forkbomb(){ forkbomb|forkbomb &} ; forkbomb 注:| 的作用:管道,前者的输出作为后者的输入,此处若不加|呢?     用sleep 1: 做下缓冲(不让系统卡的太快)  原理: 递归应用:让系统卡住 fork炸弹,布布扣,bubuko.com

Linux fork炸弹解析 ——Linux Fork Bomb

Linux Fork Bomb :(){ :|: & };:是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统.如果你好奇地去执行了这个命令,那么赶快重启系统吧~! 命令解析 :() { : | : & };: :在这里是一个函数名,我们定义之,并在后面执行它. :|:&,:函数的输出通过管道传给另一个冒号函数作为输入,并且在后台执行. { };标识着里面的内容是一个函数主体. 最后一个:为定义完成后的一次函数执行. 原理解析 首先需要说明的是:是

fork 炸弹----linux

既然我们讨论的都是些奇怪的代码,不妨思考一下这一行: :(){ :|: & };: 对你来说,这可能看起来有些神秘,但是我看来,它就是那个臭名昭著的 Bash fork 炸弹.它会反复启动新的 Bash shell,直到你的系统资源消耗殆尽.系统崩溃. 不应该在最新的 Linux 系统上做这些操作.注意,我说的是不应该.我没有说不能.正确设置用户权限,Linux 系统能够阻止这些破坏性行为.通常用户仅限于分配使用机器可用内存.但是如果作为 root 用户的你运行了这行命令(或者它的变体 Bash

shell脚本fork炸弹 学习

:(){ :|:& };: 短短的13个字符却是个炸弹,以前看起来是单纯的死记硬背,现在也知道点皮毛原理了. :()    bash中允许:作为函数名 {}   函数体 :|:&    :先调用函数,然后管道调用另一个新进程(调用:函数),&放到后台执行 ;    命令间隔符 :   继续调用本身函数 程序员的思想是天马行空的,却又是很严禁的.

Windows版fork炸弹

Win键+R 在运行窗口输入 cmd /c @cd /d %temp% & echo @start /min cmd ^& cmd > cmd.bat & cmd 回车 愚人节快乐!

Linux Fork Bomb

众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序进行 模块化的高效开发与管理.于是产生了由于其特殊的特性,bash拥有了fork炸弹.Jaromil在2002年设计了最为精简的一个fork炸弹的实 现. 所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏.fork炸 弹实质是一个简单的递归程序.由于程序是递归的,如果没有任何限

88个 Linux 系统管理员必备的监控工具

随着互联网行业的不断发展,各种监控工具多得不可胜数.这里列出网上最全的监控工具.让你可以拥有超过80种方式来管理你的机器.在本文中,我们主要包括以下方面: 命令行工具 网络相关内容 系统相关的监控工具 日志监控工具 基础设施监控工具 监控和调试性能问题是一个艰巨的任务,但用对了正确的工具有时也是很容易的.下面是一些你可能听说过的工具,也有可能没有听说过——何不赶快开始试试? 八大系统监控工具 1. top 这是一个被预装在许多 UNIX 系统中的小工具.当你想要查看在系统中运行的进程或线程时:t

9个使用时必须时刻警惕的Linux命令

Linux shell/terminal命令非常强大,即使一个简单的命令就可能导致文件夹.文件或者路径文件夹等被删除.为了避免这样的事情发生,我们应该时刻注意PHP代码&命令,今天为大家带来9个必须时刻警惕的Linux命令&代码. Linux shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹.文件或者路径文件夹等被删除. 在一些情况下,Linux 甚至不会询问你而直接执行命令,导致你丢失各种数据信息. 一般来说在 Web 上推荐新的 Linux 用户执行这些命