ghosTzone
main(_){return _} && echo $? /* Keep It Simple Stupid | 本博客所有文章皆为原创 转载请注明 - ghosTM55 */

如何扼制fork炸弹

ghosTM55 posted @ 2008年11月25日 22:10 in bash , 7462 阅读

  众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能。这样的一款shell中自然不会缺少“函数”这个元素来帮助程序进行模块化的高效开发与管理。于是产生了由于其特殊的特性,bash拥有了fork炸弹。

  所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏。现在来看一个最简单的fork炸弹:

:() { :|:& };:

  一行看似无法理解的只有13个字符的命令,即可占用掉所有系统的资源。其实,这行命令如果这样写成bash script就不难理解了:

:()
{
    :|: &
}
;
:

  冒号":"其实是函数名,这个bash脚本就是在不断的执行该函数,然后不断fork出新的进程。那么,有没有办法扼制这种情况的发生呢?答案是肯定的,只需设置进程的limit数即可:

txi@ghosTunix.org:~> ulimit -u
200

  使用工具ulimit即可设置各种限制数,具体的请参考该工具的manual page。在这里笔者限制了max user processes数为200,所以,可以安全地执行这个fork炸弹了:

txi@ghosTunix.org:~> :() { :|:& };:
[1] 9593
txi@ghosTunix.org:~> bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
 

txi@ghosTunix.org:~> date
Tue Nov 25 14:11:51 CST 2008


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter