又见Bash炸弹

  2010-09-27


今天一位同事在编码时不小心,忘记给循环加break。导致开发机(虚拟机)负载过高而无响应。ping值忽高忽低,ssh连不上,mysql连接超时。
这不禁让人想起大名鼎鼎的Bash炸弹:

:(){ :|:& };:

在Bash中,冒号(:)是可以做为函数名的,所以这个炸弹也就很容易理解了:

  1. 定义一个函数
  2. 函数体中,递归调用此函数,并把输出重定向到管道。
  3. Bash中,函数调用是会启动新进程的,而管道后端又启动一个进程。
  4. 管道启动的新进程又会继续递归启用管道、启动新进程。
  5. & 符号把任务置于后台运行,避免终端交互。
  6. 连锁反应会继续,直接到达内核资源限制。若无限制,则直接会把服务器拖死。

Perl 版本炸弹

perl -e “fork while fork” &

Python版本炸弹

import os
while(1):
os.fork()

Windows XP 批处理

:bomb
start %0
goto bomb

C语言版本

int main() { while(1) fork(); }

如何防范?

通过限制用户对资源的占用来防止。因为此类炸弹是用耗尽系统资源来达到攻击目的的。Linux的限制方法有:
ulimit 命令 或者 /etc/security/limits.conf