专栏首页北京马哥教育Linux | 只有十三个字符的经典Fork炸弹,讨厌谁就去整他吧!

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

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限制了炸弹创建线程。

参考

http://en.wikipedia.org/wiki/Fork_bomb

作者:Saymagic 来源:https://blog.saymagic.tech/2015/03/25/fork-bomb.html

本文分享自微信公众号 - 马哥Linux运维(magedu-Linux),作者:Saymagic

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Apache 伪静态处理跳转中传递参数

    下面对比一下,看第一个配置文件 # 将 RewriteEngine 模式打开 RewriteEngine On RewriteBase / RewriteC...

    小小科
  • Nginx+FPM结构模型剖析及优化

    随着php脚本语言使用的普及,目前webserice服务大部分都在用nginx+(php-fpm)的结构,了解了其工作过程后才可以在各个方面想办法做调整优化和故...

    小小科
  • Linux 下使用 Sar 简介

    介绍 Sar 最早是实现在 Salaris Unix 系统里,后来移植到了大部分其他的 Unix 系统(如AIX,HP-UX等)。Linux 下也有法国人写的 ...

    小小科
  • python读取特定的行

    py3study
  • Flink零基础实战教程:股票价格数据流处理

    之前的《万字长文深度解析WordCount程序》使用WordCount展示了Flink程序的基本结构,本文将以股票价格案例来演示如何使用Flink的DataSt...

    PP鲁
  • Go语言学习(五)| 控制结构

    Go 对于值之间的比较有非常严格的限制,只有两个类型相同的值才可以进行比较,如果值的类型是接口,它们也必须都实现了相同的接口

    Mervyn
  • 学习纲要:JavaScript 数据类型

    Joel
  • 用好cBioportal数据库(一个高级点的例子)

    在芒果学习的生信论文中,第28篇生信文章是cBioPortal数据库使用最多,也是用的最好的。

    芒果先生聊生信
  • 业界 | 谷歌发布TTS新系统Tacotron 2:直接从文本生成类人语音

    机器之心
  • 强烈推荐 | CVPR2020 | 目标检测中的不平衡问题综述

    目标检测中的不平衡问题是一个非常古老的问题,自检测器诞生初始,各位学者就在进行研究。本文对目标检测中的不平衡问题(Class imbalance, Scale ...

    CNNer

扫码关注云+社区

领取腾讯云代金券