bash著名的fork炸弹
之前有听别人说过执行:() { :|:& };:这样的字符串,会导致Linux系统崩溃,但一直不解其意。最近看了相关的文章,总算明白这个字符串的含义。
众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能。这样的一款shell中自然不会缺少“函数”这个元素来帮助程序进行模块化的高效开发与管理。于是产生了由于其特殊的特性,bash拥有了fork炸弹。Jaromil在2002年设计了最为精简的一个fork炸弹的实现。
所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏。fork炸 弹实质是一个简单的递归程序。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源。现在来看看Jaromil设计的 最简单的fork炸弹:
可写成:() { :|:& };:或者.() { .|.& };.
现在我们把字符串分解下
.() { .|.& } ; .
第一行,定义一个函数.(),函数名为.
第二行和第四行{}就是函数内的内容
第三行,调用函数.即递归调用函数本身,管道|调用.函数,并且放到后台运行
第五行,因为是写在同一行,所以用;分隔
第六行,即进入脚本后,默认调用.函数
题外话,这种脚本,普通用户都可以执行,那么有没有办法避免这种隐患呢?
可以先思考下。
答案其实很简单,要想防止这种fork炸弹,也就是禁止用户创建过多的进程,可以修改/etc/security/limits.conf里的nproc,例如hard nproc 100来限制最大进程数