叉炸弹保护不起作用:流程数量不受限制


8

我刚意识到我的系统并没有适当地限制每个用户的进程数量,因此也不能防止用户进行分叉炸弹并使整个系统崩溃:

user@thebe:~$ cat /etc/security/limits.conf | grep user
user        hard    nproc   512
user@thebe:~$ ulimit -u
1024
user@thebe:~$ :(){ :|:& };:
[1] 2559
user@thebe:~$ ht-bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
...
Connection to thebe closed by remote host.

这是一个错误,还是为什么它忽略了限制limits.conf,为什么不应用ulimit -n声称的限制呢?

PS:我真的不认为在过程限制之前会达到内存限制。这台机器有8GB的内存,当我放下前叉炸弹时,它只使用了4%的内存。

编辑:

我设法在现场CD上重现了这一点。所以我想这一定是一个错误。基本上,它最终杀死了所有进程,包括X11,SSHD等对系统至关重要的事物。

任何用户都可能使系统崩溃。


-n是文件描述符而不是进程的数量。您想要ulimit -u
psusi 2012年

@psusi,谢谢,但是得到的结果相同:suser@thebe:~$ ulimit -u 1024
d_inevitable 2012年

当我运行时,ulimit -u我得到了31325。当我运行时,ulimit -u 512它得到了512。当我运行该叉子炸弹时,我系统的其余部分就很好了。
psusi 2012年

Answers:


8

原来/etc/security/limits.conf确实可以,但是需要重新启动才能解释。注销还不够。

我建议任何人都对配置文件有限制,例如

user hard nproc 512

user您要限制的任何用户名替换。

或更好:

@group hard nproc 512

替换group为要限制的任何用户组。


根据所使用的软件,即使是单用户系统,也可能需要比512个进程更多的进程。如果您发现实施此操作后神秘地发现事情不起作用,则可能需要调整允许的实际进程数。
Zeiss Ikon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.