歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 經典的fork炸彈

經典的fork炸彈

日期:2017/2/27 15:48:25   编辑:Linux教程

Jaromil在2002年設計了最為精簡的一個Linux Fork炸彈,整個代碼只有13個字符,在shell中運行後幾秒後系統就會宕機:

:() { :|:& };:

這樣看起來不是很好理解,我們可以更改下格式:

:()
{
:|:&
};
:

更好理解一點的話就是這樣:

bomb()
{
bomb|bomb&
};
:

因為shell中函數可以省略function關鍵字,所以上面的十三個字符是功能是定義一個函數與調用這個函數,函數的名稱為:,主要的核心代碼是:|:&,可以看出這是一個函數本身的遞歸調用,通過&實現在後台開啟新進程運行,通過管道實現進程呈幾何形式增長,最後再通過來調用函數引爆炸彈.因此,幾秒鐘系統就會因為處理不過來太多的進程而死機,解決的唯一辦法就是重啟。

Bomb一下

秉著不作不死的心態,我們也來運行一下,於是我將矛頭指向雲主機,,我使用了國內的一個2G內存的雲主機,首先在本地開啟兩個終端,在一個終端連接雲主機後運行炸彈,幾秒後再嘗試用另外一個終端登錄,效果可以看下面Gif圖:

看,運行一段時間後直接報出了-bash: fork: Cannot allocate memory,說明內存不足了。並且我在二號終端上嘗試連接也沒有任何反應。因為是虛擬的雲主機,所以我只能通過主機服務商的後台來給主機斷電重啟。然後才能重新登錄:

炸彈危害

Fork炸彈帶來的後果就是耗盡服務器資源,使服務器不能正常的對外提供服務,也就是常說的DoS(Denial of Service)。與傳統1v1、通過不斷向服務器發送請求造成服務器崩潰不同,Fork炸彈有種坐山觀虎斗,不費一兵一卒斬敵人於馬下的感覺。更嚇人的 是這個函數是不需要root權限就可以運行的。看到網上有帖子說某些人將個性簽名改為Fork炸彈,結果果真有好奇之人中槍,試想如果中槍的人是在公司服 務器上運行的話,oh,!

預防方式

當然,Fork炸彈沒有那麼可怕,用其它語言也可以分分鐘寫出來一個,例如,python版:

import os
while True:
os.fork()

Fork炸彈的本質無非就是靠創建進程來搶占系統資源,在Linux中,我們可以通過ulimit命令來限制用戶的某些行為,運行ulimit -a可以查看我們能做哪些限制:

ubuntu@10-10-57-151:~$ 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) 7782
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
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) 7782
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

可以看到,-u參數可以限制用戶創建進程數,因此,我們可以使用ulimit -u 20來允許用戶最多創建20個進程。這樣就可以預防bomb炸彈。但這樣是不徹底的,關閉終端後這個命令就失效了。我們可以通過修改/etc/security/limits.conf文件來進行更深層次的預防,在文件裡添加如下一行(ubuntu需更換為你的用戶名):

ubuntu - nproc 20

這樣,退出後重新登錄,就會發現最大進程數已經更改為20了,

這個時候我們再次運行炸彈就不會報內存不足了,而是提示-bash: fork: retry: No child processes,說明Linux限制了炸彈創建線程。
原文:http://blog.saymagic.cn/2015/03/25/fork-bomb.html

Copyright © Linux教程網 All Rights Reserved