经典的 Fork 炸弹解析 | 技术

admin 2021年12月27日01:39:11评论78 views字数 2478阅读8分15秒阅读模式
经典的 Fork 炸弹解析 | 技术
 
经典的 Fork 炸弹解析 | 技术
导读:Jaromil 在 2002 年设计了最为精简的一个 Linux Fork 炸弹,整行代码只有 13 个字符,在 shell 中运行后几秒后系统就会宕机
本文字数:2191,阅读时长大约:3分钟

http://blog.saymagic.cn/2015/03/25/fork-bomb.html
作者:Saymagic

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

  1. :(){:|:&};:

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

  1. :()
  2. {
  3. :|:&
  4. };
  5. :

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

  1. bomb()
  2. {
  3. bomb|bomb&
  4. };
  5. bomb

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

经典的 Fork 炸弹解析 | 技术

Bomb 一下

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

经典的 Fork 炸弹解析 | 技术

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

经典的 Fork 炸弹解析 | 技术

经典的 Fork 炸弹解析 | 技术

炸弹的危害

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

经典的 Fork 炸弹解析 | 技术

预防方式

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

  1. import os
  2. while True:
  3. os.fork()

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

  1. ubuntu@10-10-57-151:~$ ulimit -a
  2. core file size (blocks, -c) 0
  3. data seg size (kbytes, -d) unlimited
  4. scheduling priority (-e) 0
  5. file size (blocks, -f) unlimited
  6. pending signals (-i) 7782
  7. max locked memory (kbytes, -l) 64
  8. max memory size (kbytes, -m) unlimited
  9. open files (-n) 1024
  10. pipe size (512 bytes, -p) 8
  11. POSIX message queues (bytes, -q) 819200
  12. real-time priority (-r) 0
  13. stack size (kbytes, -s) 8192
  14. cpu time (seconds, -t) unlimited
  15. max user processes (-u) 7782
  16. virtual memory (kbytes, -v) unlimited
  17. file locks (-x) unlimited

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

  1. ubuntu - nproc 20

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

经典的 Fork 炸弹解析 | 技术

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

经典的 Fork 炸弹解析 | 技术

Shell 编程训练营

Shell 作为运维工程师工作中的很重要一部分,绝大多数人却并没有掌握的足以正常工作。rm -rf 的段子屡见不鲜,如果 Fork 炸弹发生在你的身边,危险你是否能够预见到呢?

为了帮助更多的运维工程师掌握 Shell 这门语言,Linux 中国将为大家带来系列公益训练营之 《Shell 编程训练营》,以帮助大家掌握 Shell 编程的精髓和奥义。本次训练营完全免费,得到了阿里云开发者社区的大力支持。

本次课程将会分三天进行授课:

◈ DAY 1:Shell 的基本介绍、常用命令以及 Shell 的流程控制
◈ DAY 2:Shell 中的数组应用、参数处理和函数的应用
◈ DAY 3:Shell 的编码规范、调试 Debug 方案以及公共函数库

在授课过程中, 老师将以实战与理论相结合的方式,带着你学习基础知识,并掌握实战能力。

在本次训练营中,训练营导师将会带着你用三天的时间,从 Shell 的基础开始,一起开发一个 Shell 脚本,帮助你掌握 Shell 编程的精髓,提升你的 Shell 编程能力。

此外,通过 Linux 中国专属渠道报名并完成训练营学习的同学,还将获得一张由 Linux 中国颁发的训练营结业证书、全网可查询的电子证书。并有机会获得一本赠送的最新计算机书籍(共计 30 本,直播时抽取赠送)。

经典的 Fork 炸弹解析 | 技术

课程安排

  • 授课时间:2021年 9 月 6 日 - 2021 年 9 月 8 日 21:00 - 22:00(为期 3 晚)

  • 授课方式:直播授课,有回放

  • 授课费用:免费授课,无任何费用

  • 上课地点:报名后进入专属钉钉群


~~点击“阅读原文”报名~~

经典的 Fork 炸弹解析 | 技术

本文始发于微信公众号(Linux中国):经典的 Fork 炸弹解析 | 技术

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月27日01:39:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   经典的 Fork 炸弹解析 | 技术https://cn-sec.com/archives/471968.html

发表评论

匿名网友 填写信息