Linux | 只有十三个字符的经典Fork炸弹,讨厌谁就去整他吧!

系统 Linux
Fork炸弹带来的后果就是耗尽服务器资源,使服务器不能正常的对外提供服务,也就是常说的DoS(Denial of Service)。与传统1v1、通过不断向服务器发送请求造成服务器崩溃不同,Fork炸弹有种坐山观虎斗,不费一兵一卒斩敌人于马下的感觉。更吓人的是这个函数是不需要root权限就可以运行的。

[[193409]]

Jaromil在2002年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在shell中运行后几秒后系统就会宕机:

 

这样看起来不是很好理解,我们可以更改下格式:

 

更好理解一点的话就是这样:

 

因为shell中函数可以省略function关键字,所以上面的十三个字符是功能是定义一个函数与调用这个函数,函数的名称为:,主要的核心代码是:|:&,可以看出这是一个函数本身的递归调用,通过&实现在后台开启新进程运行,通过管道实现进程呈几何形式增长,最后再通过:来调用函数引爆炸弹.因此,几秒钟系统就会因为处理不过来太多的进程而死机,解决的唯一办法就是重启。 

Bomb一下

秉着不作不死的心态,我们也来运行一下,于是我将矛头指向云主机,我使用了国内的一个2G内存的云主机,首先在本地开启两个终端,在一个终端连接云主机后运行炸弹,几秒后再尝试用另外一个终端登录,效果可以看下面Gif图: 

 

看,运行一段时间后直接报出了-bash: fork: Cannot allocate memory,说明内存不足了。并且我在二号终端上尝试连接也没有任何反应。因为是虚拟的云主机,所以我只能通过主机服务商的后台来给主机断电重启。然后才能重新登录:

 


炸弹危害 

Fork炸弹带来的后果就是耗尽服务器资源,使服务器不能正常的对外提供服务,也就是常说的DoS(Denial of Service)。与传统1v1、通过不断向服务器发送请求造成服务器崩溃不同,Fork炸弹有种坐山观虎斗,不费一兵一卒斩敌人于马下的感觉。更吓人的是这个函数是不需要root权限就可以运行的。看到网上有帖子说某些人将个性签名改为Fork炸弹,结果果真有好奇之人中枪,试想如果中枪的人是在公司服务器上运行的话,oh,!

预防方式 

当然,Fork炸弹没有那么可怕,用其它语言也可以分分钟写出来一个,例如,python版:

 

Fork炸弹的本质无非就是靠创建进程来抢占系统资源,在Linux中,我们可以通过ulimit命令来限制用户的某些行为,运行ulimit -a可以查看我们能做哪些限制:

 

可以看到,-u参数可以限制用户创建进程数,因此,我们可以使用ulimit -u 20来允许用户最多创建20个进程。这样就可以预防bomb炸弹。但这样是不彻底的,关闭终端后这个命令就失效了。我们可以通过修改/etc/security/limits.conf文件来进行更深层次的预防,在文件里添加如下一行(ubuntu需更换为你的用户名):

ubuntu - nproc 20

这样,退出后重新登录,就会发现最大进程数已经更改为20了,

 

这个时候我们再次运行炸弹就不会报内存不足了,而是提示-bash: fork: retry: No child processes,很棒,此时说明Linux限制了炸弹创建线程。

责任编辑:庞桂玉 来源: 马哥Linux运维
相关推荐

2010-05-24 14:43:39

Linux性能监测工具

2021-12-06 10:15:37

Linuxcat命令

2021-09-18 10:00:24

ReactJavaScript前端

2013-12-13 09:15:38

2021-10-06 15:58:26

Python工具代码

2022-03-03 10:18:51

Linux监控工具服务器

2017-03-27 09:42:58

JavaScript数据网格库

2023-11-20 22:04:33

2009-02-09 09:53:50

2017-09-06 15:53:55

机器学习人工智能框架

2009-06-19 13:39:07

Java程序员Flex

2021-07-23 16:22:58

鸿蒙HarmonyOS应用

2022-02-23 11:00:10

芯片GPUIntel

2019-12-16 09:26:05

Java设计操作系统

2009-06-24 13:06:41

JSF组件Facelets

2023-04-25 15:46:51

Python字符串

2020-09-07 07:35:03

Grep命令字符串

2018-01-26 14:41:04

编程Python开发

2011-09-01 21:41:42

SQL Server把字符分割成两个字符串

2017-01-13 15:45:05

Linuxfork函数详解
点赞
收藏

51CTO技术栈公众号