Linux-这个脚本为什么会导致系统挂掉?

发布于 2016-12-28 13:16:52 字数 52 浏览 1311 评论 3

这个脚本为什么会导致系统挂掉?

:(){ :|:& };:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-09-17 17:44:38

这个实例在维基百科有详细的介绍,内容如下:
fork炸弹(fork bomb)在计算机领域中是一种利用系统调用fork(英语:Fork (operating system))(或其他等效的方式)进行的拒绝服务攻击[1]。与病毒与蠕虫不同的是,fork炸弹没有传染性,而且fork炸弹会使对同时执行进程/程序数设限的系统无法执行新程序,对于不设限的系统则使之停止响应[2]。以fork炸弹为代表的自我复制程序有时亦被称为wabbit。
fork炸弹的原理
fork炸弹以极快的速度创建大量进程(进程数呈以2为底数的指数增长趋势),并以此消耗系统分配予进程的可用空间使进程表饱和,而系统在进程表饱和后就无法运行新程序,除非进程表中的某一进程终止;但由于fork炸弹程序所创建的所有实例都会不断探测空缺的进程槽并尝试取用以创建新进程,因而即使在某进程终止后也基本不可能运行新进程。fork炸弹生成的子程序在消耗进程表空间的同时也会占用CPU和内存,从而导致系统与现有进程运行速度放缓,响应时间也会随之大幅增加,以致于无法正常完成任务,从而使系统的正常运作受到严重影响。
除了恶意触发fork炸弹破坏的情况外,软件开发中有时也会不慎在程序中嵌入fork炸弹,如在用于监听网络套接字(英语:Network socket)并行使客户端-服务器结构系统中服务器端职责的应用程序中可能需要无限地进行循环(loop)与派生(fork)操作(类似下节示例程序所示),而在这种情况下源代码内的细微错误就可能在测试中“引爆”fork炸弹。

示例

以下程序段就是由Jaromil(英语:Jaromil)所作的在类UNIX系统的shell环境下触发fork炸弹的shell脚本代码[4],总共只用了13个字符(包括空格):
:(){ :|:& };:
注解如下:
:() # 定义函数,函数名为":",即每当输入":"时就会自动调用{}内代码
{ # ":"函数开始标识
: # 用递归方式调用":"函数本身
| # 并用管道(pipe)将其输出引至...
: # 另一次递归调用的":"函数
# 综上,":|:"表示的即是每次调用函数":"的时候就会生成两份拷贝
& # 调用间脱钩,以使最初的":"函数被杀死后为其所调用的两个":"函数还能继续执行
} # ":"函数结束标识
; # ":"函数定义结束后将要进行的操作...
: # 调用":"函数,"引爆"fork炸弹
其中函数名“:”只是简化的一例,实际实现时可以随意设定,

一个较易理解(将函数名替换为“forkbomb”)的版本如下:
forkbomb(){ forkbomb|forkbomb & } ; forkbomb
Windows下则可以批处理命令如下实现:
%0|%0
POSIX标准下的C与C++的实现:

 #include <unistd.h>

int main()
{
while(1)
fork();
return 0;
}

Perl语言的实现:

 fork while fork

泛泛之交 2017-03-26 08:05:42

Fork炸弹
这在shell中其实是一个递归程序,函数(:)不断调用自身,不断地生成新的进程,最终造成拒绝服务攻击。函数(:)调用前的&将子进程放入后台。这段代码会分支出大量的进程,所以被称为fork炸弹。
关于Fork炸弹,可以参考wiki的说明--Fork炸弹

:() # 定义函数,函数名为":",即每当输入":"时就会自动调用{}内代码
{ # ":"函数开始标识
: # 用递归方式调用":"函数本身
| # 并用管道(pipe)将其输出引至...
: # 另一次递归调用的":"函数
# 综上,":|:"表示的即是每次调用函数":"的时候就会生成两份拷贝
& # 调用间脱钩,以使最初的":"函数被杀死后为其所调用的两个":"函数还能继续执行
} # ":"函数结束标识
; # ":"函数定义结束后将要进行的操作...
: # 调用":"函数,"引爆"fork炸弹

对于这个问题,可以通过修改配置文件/etc/security/limits.conf来限制可生成的最大进程数来预防。

晚风撩人 2017-02-08 13:29:08

 :()
{
:|: &
}
;
:

* 第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。
* 第 2 行表示函数体开始。
* 第 3 行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。
* 第 4 行表示函数体结束。
* 第 5 行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。
* 第 6 行表示调用本函数。

冒号”:”其实是函数名,这个bash脚本就是在不断的执行该函数,然后不断fork出新的进程。

详细见fork炸弹

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文