在Linux的shell脚本中,流传着一个很有意思,当然也是相当危险的脚本段,俗称Fork炸弹(Fork Bomb)。如下:
:(){ :|:& };:
Fork炸弹会以极快的速度创建大量的进程(进程数以指数式增长),以此消耗系统分配给予的进程可用空间,使进程表饱和。进程表饱和后,就无法运行新程序,除非终止进程表中的某一个进程;但被终止的进程,又会立刻被Fork炸弹探测到并被占用,导致仍然无法运行新的程序。Fork炸弹生成的子程序在消耗进程表空间的同时,也会占用CPU和内存,从而导致系统与现有进程运行速度放缓,响应时间也随之大幅增加,以致于无法完成正常的任务,从而使系统的正常运作受到严重影响。那么,这个由13个字符(包括两个空格字符)组成的所谓Fork炸弹,为何会有如此大的威力呢?
我们来看看这几个字符都干了些什么?
:() # 定义函数,函数名为":",不接受参数
{ # 函数体开始标识
: # 调用函数":",即调用自身。可见是一种递归调用。
| # 用管线(pipe)将结果输出至 ... (由于有管线操作,因此会fork一个新的进程处理)
: # 在新的进程中的调用函数":"。":|:"表示每次调用函数":",都会产生两份拷贝
& # 调用间脱钩,以使最初的":"函数被关闭后,其所调用的两个":"函数还能继续执行
} # 函数体结束标识
; # ":"函数定义结束后将要进行的操作 ...
: # 调用":"函数,即引爆fork炸弹
这么一解释,发现还真是那么可怕!好在Fork炸弹本身并没有传染性,只要重启下系统也就恢复了。
那么,我们有没有可能防范Fork炸弹的攻击呢?答案是显然的。Fork炸弹的攻击方式是不断占用进程数来瘫痪系统,那么,如果我们能够限制单个用户的进程数创建上限,就不至于被Fork炸弹瘫痪了。在Linux系统上,可以通过ulimit
这个指令来实现。例如,
$ ulimit 200
表示为当前用户创建200个进程上限。
Congratulations @pyericz! You received a personal award!
You can view your badges on your Steem Board and compare to others on the Steem Ranking
Do not miss the last post from @steemitboard:
Vote for @Steemitboard as a witness to get one more award and increased upvotes!