侵权投诉

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

Linux爱好者 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

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

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

收藏 人收藏
分享:

评论

相关推荐

PCB的设计、打板和焊接
最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 129次 阅读
General setup常规设置有哪些呢
请问一下General setup常规设置有哪些呢?
发表于 10-15 08:08 0次 阅读
怎样去解决耳机的电流声问题
怎样去解决耳机的电流声问题? 怎样去解决archlinux开关机啪啪响的问题? ...
发表于 10-15 07:26 0次 阅读
怎样通过读取电流节点的方式去获取电流呢
怎样通过读取电流节点的方式去获取电流呢?其实验代码是怎样的?...
发表于 10-15 06:48 0次 阅读
步进电机是如何实现正反转的
步进电机是如何实现正反转的?怎样去编写其代码?...
发表于 10-14 09:49 0次 阅读
PA_IK代码该如何去实现
PA_IK代码该如何去实现? PA_VMC算法的原理是什么?...
发表于 10-14 09:00 0次 阅读
STM32L151C8T6低功耗编程代码该如何去编写
STM32L151C8T6低功耗编程代码该如何去编写?
发表于 10-14 07:41 0次 阅读
怎样去定义一个结构体数组呢
数据结构的特点有哪些? 怎样去定义一个结构体数组呢? ...
发表于 10-14 07:25 0次 阅读
stm32mp1 Cortex M4开发篇1:stm32CubeIDE开发环境搭建
写在前面:本文章为《ARMCortex-M4裸机开发篇》系列中的一篇,,全系列总计14篇。笔者使用的....
的头像 刘洋其 发表于 10-13 17:53 21次 阅读
stm32mp1 Cortex M4开发篇1:stm32CubeIDE开发环境搭建
能快速找到代码运行最慢部分的编程神器
天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 104次 阅读
动态内存分配的注意事项及本质是什么
C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 222次 阅读
动态内存分配的注意事项及本质是什么
Linux重启命令介绍
下面介绍在 Linux 操作系统中重启和关闭相关的命令:shutdown、reboot、init、halt、poweroff、systemctl,你可以根据需要来选择...
发表于 10-13 15:33 101次 阅读
eBPF技术应用云原生网络实践系列之基于socket的service
背景介绍 Kubernetes 中的网络功能,主要包括 POD 网络,service 网络和网络策略....
的头像 Linux阅码场 发表于 10-13 10:54 204次 阅读
eBPF技术应用云原生网络实践系列之基于socket的service
【干货】嵌入式linux中的关机和重启命令
我们在使用linux虚拟机时,不能像Windows一样的直接关机,这样关机不利于linux虚拟机的再次使用,且可能会导致有些文件的丢失,...
发表于 10-13 10:25 101次 阅读
用Python实现3D地图教程
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 158次 阅读
用Python实现3D地图教程
关于Python对交通路口的红绿灯进行颜色检测
转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 214次 阅读
关于Python对交通路口的红绿灯进行颜色检测
spring中声明式事务实现原理猜想
  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 182次 阅读
stm32启动代码如何进行分析
stm32启动代码如何进行分析
发表于 10-13 06:44 0次 阅读
STM32MP157开发板评测:华清远见FS-MP1A开发板初体验!
华清远见FS-MP1A开发板使用(STM32MP1开发)1.1FS_MP1A硬件资源介绍FS-MP1....
的头像 刘洋其 发表于 10-12 18:21 66次 阅读
STM32MP157开发板评测:华清远见FS-MP1A开发板初体验!
xv6的文件系统是如何实现的
文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 123次 阅读
 xv6的文件系统是如何实现的
Linux中匿名页的访问分析
Linux 中 有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面....
的头像 Linux阅码场 发表于 10-12 17:52 151次 阅读
处理器中异常和中断解决
异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与....
的头像 单片机匠人 发表于 10-12 17:14 268次 阅读
RUST的真实驱动案例
我们无法确定RUST在内核的最终趋势,有多少人愿意迁移,但是至少Linus愿意试水。 Wedson ....
的头像 Linux阅码场 发表于 10-12 15:59 81次 阅读
RUST的真实驱动案例
那些有着巨大影响力的代码盘点
2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah P....
的头像 strongerHuang 发表于 10-12 15:46 174次 阅读
那些有着巨大影响力的代码盘点
那些书本上都没有提到的C语言volatile用法
许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句....
的头像 STM32嵌入式开发 发表于 10-12 14:47 864次 阅读
那些书本上都没有提到的C语言volatile用法
什么是MicroPython 它能做什么有什么局限
随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 216次 阅读
PO VO DTO转换神器的思路
当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思....
的头像 Linux爱好者 发表于 10-12 11:13 191次 阅读
如何在Colab中使用SQL
如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 158次 阅读
如何在Colab中使用SQL
命令行工具Kubectl的别样用法
  kubectl 是 K8s 官方附带的命令行工具,可以方便的操作 K8s 集群。这篇文章主要介绍....
的头像 马哥Linux运维 发表于 10-12 09:31 124次 阅读
学习嵌入式linux为什么推荐stm32mp157开发板?
stm32mp157是ST推出的一款双A7+M4多核异构处理器,既可以学习linux,又可以学习st....
的头像 刘洋其 发表于 10-11 18:21 33次 阅读
学习嵌入式linux为什么推荐stm32mp157开发板?
深度剖析Linux socket
socket fd 长什么样子? 什么是 socket fd ?粗糙的来讲,就是网络 fd,比如我们....
的头像 Linux爱好者 发表于 10-11 15:55 1917次 阅读
深度剖析Linux socket
一本教你怎么写出让同事无法维护的代码
‍对,你没看错,本文就是教你怎么写出让同事无法维护的代码。一、程序命名 容易输入的变量名 。比如:F....
的头像 Linux爱好者 发表于 10-11 15:45 166次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)
优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项....
的头像 OpenFPGA 发表于 10-11 15:31 239次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)
鸿蒙的网络管理功能你们知道有多厉害吗
  本示例演示了如何使用网络管理模块相关接口,演示了以下功能: 功能 1: 使用默认网络,打开连接,....
的头像 HarmonyOS技术社区 发表于 10-11 14:26 259次 阅读
鸿蒙的网络管理功能你们知道有多厉害吗
开发一个鸿蒙版仿苹果计算器教程.附代码
众所周知鸿蒙 JS 框架是非常轻量级的 MVVM 模式。通过使用和 Vue2 相似的属性劫持技术实现....
的头像 HarmonyOS技术社区 发表于 10-11 14:17 218次 阅读
开发一个鸿蒙版仿苹果计算器教程.附代码
Linux内核热补丁安全隐患的探索
Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在....
的头像 Linux阅码场 发表于 10-11 11:54 188次 阅读
Linux内核热补丁安全隐患的探索
剖析verilog2005的骚操作之对数函数
小技巧分享: verilog下取对数其实可用$clog2这个系统函数,和自己找代码里面写入funct....
的头像 玩儿转FPGA 发表于 10-09 15:29 196次 阅读
剖析verilog2005的骚操作之对数函数
Floyd如何求图的最短路径
前言 在 图论 中,在寻路最短路径中除了 Dijkstra 算法以外,还有 Floyd 算法也是非常....
的头像 算法与数据结构 发表于 10-09 14:38 133次 阅读
Floyd如何求图的最短路径
Python版test1实战说明
上一篇文章已经带着大家安装 DeepStream 的 Python 开发环境,并且执行最简单的 de....
的头像 NVIDIA英伟达企业解决方案 发表于 10-09 14:28 149次 阅读
教你们如何用 Python 快速制作海报级地图附代码
 1 简介 基于 Python 中诸如 matplotlib 等功能丰富、自由度极高的绘图库,我们可....
的头像 Linux爱好者 发表于 10-09 11:36 258次 阅读
如何用10行代码轻松在ZYNQ MP上实现图像识别
本文来自赛灵思高级产品应用工程师,张超。如今各种机器学习框架的普及使得个人搭建和训练一个机器学习模型....
的头像 XILINX开发者社区 发表于 10-09 10:47 1723次 阅读
如何用10行代码轻松在ZYNQ MP上实现图像识别
LMK04821芯片项目代码详解
大侠好,阿Q来也,今天是第二次和各位见面,请各位大侠多多关照。今天给各位大侠带来一篇项目开发经验分享....
的头像 FPGA技术江湖 发表于 10-08 17:51 286次 阅读
LMK04821芯片项目代码详解
如何用List组件减小JS运行内存
每种编程语言都有它的内存管理机制,不同设备上可用内存不同,分配给JS引擎可用的内存范围也不同。例如运....
的头像 HarmonyOS开发者 发表于 10-08 17:46 184次 阅读
Linux中如何用vim做golang开发环境
vim 做 golang 开发环境,多么炫酷!还没尝试过用 vim 做开发环境的同学可以跟着这篇文档....
的头像 马哥Linux运维 发表于 10-08 17:20 263次 阅读
Python定时任务的实现方式
在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond....
的头像 马哥Linux运维 发表于 10-08 15:20 1216次 阅读
如何链接两个名字一样动态库
在Linux应用的开发过程中,直接利用现成的第三方库(俗称:轮子)来完成自己的业务功能,是很常见的事....
的头像 Linux阅码场 发表于 10-08 14:58 194次 阅读
log2在verilog中到底有什么用
很多小伙伴对上一篇文章讲的取对数没感觉,觉得这个没什么用。确实很多时候用不着,verilog本身不够....
的头像 玩儿转FPGA 发表于 10-08 11:23 234次 阅读
log2在verilog中到底有什么用
如何在没有正式培训的情况下学习编程
从编程小白到完成第一款 Web 应用,我只用了 90 天,而且大多数时间都是在苦恼自己是否能成为开发....
的头像 程序人生 发表于 10-08 10:22 155次 阅读
204B实战应用-LMK04821代码详解(二)
大侠好,阿Q来也,今天是第二次和各位见面,请各位大侠多多关照。今天给各位大侠带来一篇项目开发经验分享....
的头像 OpenFPGA 发表于 10-08 10:18 467次 阅读
204B实战应用-LMK04821代码详解(二)
简述Hive 数据倾斜问题定位排查及解决
多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,....
的头像 数据分析与开发 发表于 10-08 09:10 188次 阅读
简述Hive 数据倾斜问题定位排查及解决
51、STM32和Linux点灯有什么区别
从入门到放弃是一个煎熬的过程,一旦入门,这个煎熬过程就会慢慢得到缓解,那么,怎样才算入门了呢? 嵌入....
的头像 strongerHuang 发表于 09-30 10:19 385次 阅读
如何用python实现贪吃蛇游戏
贪吃蛇 具体实现部分,大致分为三个模块来介绍:游戏初始化、游戏运行(蛇移动、吃掉食物)、游戏结束 1....
的头像 马哥Linux运维 发表于 09-29 18:05 453次 阅读
如何用python实现贪吃蛇游戏
Linux系统移植开发篇2:烧写linux镜像
本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见....
发表于 09-29 16:00 16次 阅读
Linux系统移植开发篇2:烧写linux镜像
如何用一行代码解决空指针问题
在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerExce....
的头像 Android编程精选 发表于 09-29 14:28 234次 阅读
导航对多返回栈的支持
欢迎来到第二个关于导航的 MAD Skill 系列的另一篇文章!本文我们将介绍一个呼声很高的功能,即....
的头像 谷歌开发者 发表于 09-29 11:21 287次 阅读
文件系统中的日志系统是如何实现的
日志 本文来聊聊文件系统中的日志系统,来看一个简单的日志系统是如何实现的。本文是接着前面的 xv6 ....
的头像 Linux阅码场 发表于 09-29 11:04 248次 阅读
文件系统中的日志系统是如何实现的
直流电机控制代码
直流电机控制代码(深圳市普德新星电源技术有限公司官网)- 直流机控制代码 可以控制直流机的转速以及正....
发表于 09-28 12:24 51次 阅读
直流电机控制代码
C语言中的“三字母词”是什么
某软件工程师接盘了前同事的项目,进度一拖再拖,最后发现问题出现在如下代码: // 注释语句 ??/2....
的头像 嵌入式ARM 发表于 09-26 14:46 252次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)
TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...
发表于 09-25 11:51 360次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)