0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

最为精简的一个Linux Fork炸弹解析

Linux爱好者 来源:博客 作者:Saymagic 2021-09-07 16:12 次阅读

转自:http://blog.saymagic.cn/2015/03/25/fork-bomb.html

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

:() { :|:& };:

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

:()

{

:|:&

};

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

bomb()

{

bomb|bomb&

};

bomb

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

Bomb一下

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

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

炸弹危害

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

预防方式

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

import os

while True:

os.fork()

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

ubuntu@10-10-57-151:~$ ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 7782

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 7782

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

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

ubuntu - nproc 20

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

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

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66740

原文标题:解析超经典的 Fork 炸弹

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux常用命令自学手册》+本手边linux速查字典

    的两本书,《linux就该这么学》和《Linux常用命令自学手册》。 首先,这边书还是延续了刘老师精简的风格,从目录上看,几乎涵盖了linux命令中最常用的200
    发表于 12-26 08:46

    DNS的各种玩法:程序编译到进程的过程解析

    Linux中使用fork创建进程,返回进程id。通过id的不同让父子进程各干其事,然后使用execvp执行具体任务
    发表于 10-20 11:10 156次阅读
    DNS的各种玩法:程序编译到进程的过程<b class='flag-5'>解析</b>

    Linux驱动模块.ko内存精简优化过程

    Linux 驱动模块可以独立的编译成 .ko 文件,虽然大小一般只有几 MB,但对总内存只有几十 MB 的小型 Linux 系统来说,常常也是一个非常值得优化的点。本文以一个实际例子,详细描述 .ko 内存精简优化的具体过程。
    发表于 09-25 09:23 514次阅读

    LINUX随身指南分享

    选项的意义以及典型用法的示范。本手册的参考资料以Fedora Linux为准,但是大部分信息同样适用于其他Linux系统。如果你需要立刻学会Linux的实际应用,或是你身边需要本简短
    发表于 09-25 08:25

    fork()函数详解

    pid_t fork(void);//pid_t为int类型,进行了重载
    的头像 发表于 08-15 09:41 778次阅读
    <b class='flag-5'>fork</b>()函数详解

    一文解析Linux中ARP学习和老化机制

    ARP学习和老化机制在Linux网络通信中起着至关重要的作用。ARP(Address Resolution Protocol)地址解析协议是将IP地址解析为MAC地址的一种机制。
    发表于 08-04 16:55 922次阅读

    fork和vfork有什么区别 简述fork与vfork的区别

    fork和vfork有什么区别,作为嵌入式工程师,这个肯定是要掌握的。
    的头像 发表于 08-03 17:12 1077次阅读
    <b class='flag-5'>fork</b>和vfork有什么区别 简述<b class='flag-5'>fork</b>与vfork的区别

    LCD2USB显示模块在LCD4LINUX的使用解释

    LCD2USB显示模块在LCD4LINUX中的使用解析
    的头像 发表于 07-12 11:03 1108次阅读

    Linux内核在Linux系统中到底处于一个什么样的地位

    Linux操作系统是当今世界上最为广泛使用的开源操作系统之一,内核则是一个操作系统的核心和灵魂所在。
    的头像 发表于 07-06 11:48 812次阅读
    <b class='flag-5'>Linux</b>内核在<b class='flag-5'>Linux</b>系统中到底处于一个什么样的地位

    Linux内核的作用

    Linux操作系统是当今世界上最为广泛使用的开源操作系统之一,内核则是一个操作系统的核心和灵魂所在。对于一名Linux驱动开发者来说,了解Linux内核的运行机制和
    发表于 07-06 11:46 1213次阅读
    <b class='flag-5'>Linux</b>内核的作用

    Arduino道具炸弹

    电子发烧友网站提供《Arduino道具炸弹.zip》资料免费下载
    发表于 06-30 10:25 0次下载
    Arduino道具<b class='flag-5'>炸弹</b>

    linux共享库下,调用共享库函数时,程序卡死在函数中的pid=fork()这里的原因?

    linux共享库下,调用共享库函数时,程序卡死在函数中的pid=fork()这里,来个大佬指导指导原因...
    发表于 06-20 06:55

    Linux中可怕的fork炸弹介绍

    Linux中的Fork炸弹Fork Bomb)是一种拒绝服务攻击的形式,它利用了操作系统中的“fork()”系统调用。
    的头像 发表于 05-22 10:46 2012次阅读
    <b class='flag-5'>Linux</b>中可怕的<b class='flag-5'>fork</b><b class='flag-5'>炸弹</b>介绍

    深度剖析Linux中进程控制(下)

    Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 返回值: 在子进程中返回0,父进程中返回子进程的PID
    的头像 发表于 05-12 10:49 320次阅读
    深度剖析<b class='flag-5'>Linux</b>中进程控制(下)

    深度剖析Linux中进程控制(上)

    Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 返回值: 在子进程中返回0,父进程中返回子进程的PID
    的头像 发表于 05-12 10:49 326次阅读
    深度剖析<b class='flag-5'>Linux</b>中进程控制(上)