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

    文章

    11191

    浏览量

    208623
  • 代码
    +关注

    关注

    30

    文章

    4708

    浏览量

    68174

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

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

收藏 人收藏

    评论

    相关推荐

    深度解析linux HID核心

    linux内核中,HID核心是完成HID功能的关键组件,如果内核支持HID,在启动过程中,则会对HID进行初始化,完成该操作的函数是hid_init(),实现在/drivers/hid/hid-core.c中。
    的头像 发表于 09-29 17:04 244次阅读
    深度<b class='flag-5'>解析</b><b class='flag-5'>linux</b> HID核心

    深度解析linux时钟子系统

    linux内核中实现了CLK子系统,用于对上层提供各模块(例如需要时钟信号的外设,USB等)的时钟驱动接口,对下层提供具体SOC的时钟操作细节。
    的头像 发表于 09-29 16:46 200次阅读
    深度<b class='flag-5'>解析</b><b class='flag-5'>linux</b>时钟子系统

    小白也会的,在linux上跑android应用的方案

    介绍可以在linux上跑安卓应用的linux桌面——OpenFDE
    的头像 发表于 08-23 11:14 485次阅读
    小白也会的,在<b class='flag-5'>linux</b>上跑android应用的方案

    python解析netflow数据到csv的流程详解

    本文主要讲解了linux下通过tcpdump抓取netflow数据包,并将其导入到wireshark进行解析,然后通过wireshark导出数据为json文件,再通过python脚本将其解析为csv文件以便做数据分析。
    的头像 发表于 05-01 11:18 605次阅读
    python<b class='flag-5'>解析</b>netflow数据到csv的流程详解

    如何采用“状态机”解析UART数据帧

    如果系统接收上述“不定长度”的协议帧,将会有挑战--如何高效接收与解析。 为简化系统设计,我们强烈建议您采用“状态机”来
    的头像 发表于 03-25 14:29 571次阅读
    如何采用“状态机”<b class='flag-5'>解析</b>UART数据帧

    linux和windows的区别 linux系统般用来干嘛

    Linux的设计理念 Linux开源操作系统,其设计理念是自由、共享和开放。Linux系统遵循类Unix的设计原则,注重系统的稳定性
    的头像 发表于 02-05 14:06 822次阅读

    浅谈Linux的进程

    进程和程序的区别: 进程是动态的,程序是静态的 、进程的创建(fork()函数) int main(){ pid_t pid; pid=fork(); if(pid     >0
    的头像 发表于 01-28 15:54 231次阅读
    浅谈<b class='flag-5'>Linux</b>的进程

    美国JDAM联合制导攻击武器技术解析与实战应用

    联合制导攻击武器般由Mk-82(500磅)、Mk-83(1000磅)和Mk-84(2000磅)四种规格的常规炸弹改装而成,改装后分别编号为GBU-38、GBU-32和GBU-31。其中GBU-32和GBU-31为专用侵彻型炸弹
    发表于 01-19 10:32 1373次阅读
    美国JDAM联合制导攻击武器技术<b class='flag-5'>解析</b>与实战应用

    Linux内核内存管理架构解析

    内存管理子系统可能是linux内核中最为复杂的子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对
    的头像 发表于 01-04 09:24 608次阅读
    <b class='flag-5'>Linux</b>内核内存管理架构<b class='flag-5'>解析</b>

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

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

    100Linux Shell脚本总结

    不知道大家有没有发现,会编写shell脚本的运维,工资不会低,并且他的工作会很轻松!今天浩道跟大家分享每一个Linux运维应知必会的100shell脚本,虽然你工作中可能用不上,但是却不能
    的头像 发表于 12-05 09:28 1124次阅读

    Linux读写锁逻辑解析Linux为何会引入读写锁?

    除了mutex,在linux内核中,还有经常用到的睡眠锁就是rw semaphore(后文简称为rwsem),它到底和mutex有什么不同呢?
    的头像 发表于 12-04 11:04 832次阅读
    <b class='flag-5'>Linux</b>读写锁逻辑<b class='flag-5'>解析</b>—<b class='flag-5'>Linux</b>为何会引入读写锁?

    Android安全机制介绍及实践

    Android系统运行于Linux内核之上,init进程是用户空间启动的第一个进程,职责主要为fork出系统关键进(Daemons)、servicemanager、zygote等;提供属性服务管理系统属性等。
    的头像 发表于 11-14 09:35 994次阅读
    Android安全机制介绍及实践

    shell命令和linux命令样吗

    结合在起,形成相当于面向过程的程序,即shell script,从而实现些复杂的功能。 而Linux命令则是用来对
    的头像 发表于 11-08 10:51 2651次阅读

    Linux如何让某一个线程排他性独占CPU

    本文主要讨论在高实时要求、高效能计算、DPDK等领域,Linux如何让某一个线程排他性独占CPU;独占CPU涉及的线程、中断隔离原理;以及如何在排他性独占的情况下,甚至让系统的timer tick也不打断独占任务,从而实现最低的延迟抖动。
    的头像 发表于 11-05 09:39 1466次阅读
    <b class='flag-5'>Linux</b>如何让某<b class='flag-5'>一个</b>线程排他性独占CPU