Bash的fork bomb以及解决办法

3:31:00 PM 0 Comments

:(){ :|:& };:
上面的代码在CU上看到的,有名的bash fork() bomb。在Bash 里跑这段代码,Linux系统差不多都会死。我在VM里的RHEL5上试着运行后,立即ps看到满屏的bash进程,之后系统就卡住了动不了。没办法,只好强行Reboot。

乍一看这段代码确实不好理解,如果展开来看就清晰多了。

:()
{
:|:&
};
:

还是晕晕的?再换一下就更好理解了。

a()
{
a|a&
};
a

简化一下,先定义一个函数a,再运行a。a函数里面递归调用自身a,并且利用管道fork一个子bash进程在后台运行a。

于是,运行a的后果是当前的bash陷入a的死循环,不断的fork,而且fork出来的子进程又都做同样的事,这样要不了一会儿,栈空间挂了,进程列表也会挂,系统就要崩溃了。

:(){ :|:& };:这个我刚开始也让我困惑,不知道bash里:可以用做函数名。还有:在bash里是builtin,具体可以info :看到其作用。

有必要了解bash解释命令的顺序

  1. Aliases
  2. Keywords such asfunctionand several others, likeifandfor
  3. Functions
  4. Built-ins likecdandtype
  5. Scripts and executable programs, for which the shell searches in the directories listed in thePATH

environment variable bash中函数优先内置命令,于是:被当作函数解释了。

预防 fork bomb的方法就是限制每个用户的进程数,可以在/etc/security/limits.conf里设置。具体用法可以参见该文件的注释部分或者man limits.conf

Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.