經典的 Fork 炸彈解析
Jaromil 在 2002 年設計了最為精簡的一個 Linux Fork 炸彈,整行程式碼只有 13 個字元(包括空格在內,空格不能刪除),在 shell 中執行後幾秒後系統就會當機:
:(){ :|:& };:
這樣看起來不是很好理解,我們可以更改下格式:
:()
{
:|:&
};
:
更好理解一點的話就是這樣:
bomb()
{
bomb|bomb&
};
bomb
因為 shell 中函式可以省略 function
關鍵字,所以上面的 13 個字元的功能是定義一個函式並呼叫這個函式,函式的名稱為 :
,主要的核心程式碼是 :|:&
,可以看出這是一個對函式本身的遞迴呼叫,透過 &
實現在後臺開啟新程式執行,透過管道實現程式呈幾何形式增長,最後再透過 :
來呼叫此函式引爆炸彈。因此,幾秒鐘內,系統就會因為處理不過來太多的程式而當機,解決的唯一辦法就是重啟。
Bomb 一下
秉著不作不死的心態,我們也來執行一下,於是我將矛頭指向雲主機,我使用了一個 2G 記憶體的雲主機,首先在本地開啟兩個終端,在一個終端連線雲主機後執行炸彈,幾秒後再嘗試用另外一個終端登入,效果可以看下圖:
看,執行一段時間後直接報出了 -bash: fork: Cannot allocate memory
,說明記憶體不足了。並且我在二號終端上嘗試連線也沒有任何反應。因為是虛擬的雲主機,所以我只能透過主機服務商的後臺來給主機斷電重啟。然後才能重新登入:
炸彈的危害
Fork 炸彈帶來的後果就是耗盡伺服器資源,使伺服器不能正常的對外提供服務,也就是常說的 DoS。與傳統 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 個程式。這樣就可以預防 Fork 炸彈。但這樣是不徹底的,關閉終端後這個命令就失效了。我們可以透過修改 /etc/security/limits.conf
檔案來進行更深層次的預防,在檔案裡新增如下一行(下面的 ubuntu
需更換為你的使用者名稱):
ubuntu - nproc 20
這樣,退出後重新登入,就會發現最大程式數已經更改為 20 了:
這個時候我們再次執行炸彈就不會報記憶體不足了,而是提示 -bash: fork: retry: No child processes
,說明 Linux 限制了炸彈建立程式。
參考資料
相關文章
- Linux fork 炸彈解析,Linux Fork BombLinux
- 經典炸彈人手遊《全民泡泡超人》今日全平臺上線
- Google經典面試題解析Go面試題
- 部分JS經典題目解析JS
- CSAPP二進位制炸彈實驗 bomb lab詳細解析APP
- 博弈論經典模型解析(入門級)模型
- 經典Java面試題彙總及答案解析Java面試題
- [面試題]事件迴圈經典面試題解析面試題事件
- 全面解析快取應用經典問題快取
- 效能下降的不定時炸彈_過舊的sql_profileSQL
- OpenAI深夜丟炸彈硬槓谷歌搜尋OpenAI谷歌
- 100+經典Java面試題及答案解析Java面試題
- Linux 中的 fork() 函式例項解析Linux函式
- 世界上最大的ZIP炸彈,附下載連結
- Oracle的遠端複製與異地容災的經典解析Oracle
- 洛谷 P2280 鐳射炸彈
- 十大經典排序演算法動畫與解析排序演算法動畫
- Java經典例項:把字串解析為日期時間Java字串
- 經典的反轉
- LeetCode題解(1652):拆炸彈(Python)LeetCodePython
- 澳洲公司推出無彈搶 可溫柔“轟炸”無人機無人機
- 自定義view實現超萌動感小炸彈View
- SICP 經典
- 太強了,全面解析快取應用經典問題快取
- 經典的行佈局
- jQuery cssHook的經典例子jQueryCSSHook
- 10條經典的貿易經驗
- 自拍也會變不定時炸彈?趨勢科技提醒:不法分子已經盯上了你的生物識別資訊
- 大資料“重磅炸彈”:實時計算框架 Flink大資料框架
- 牛津教授談人工智慧:這就像孩子在玩炸彈!人工智慧
- P5025 [SNOI2017] 炸彈 題解
- win10系統中有道詞典經常彈出廣告怎麼辦Win10
- 人工智慧研究:經典推理和非經典推理人工智慧
- 經典大廠前端面試題(含解析)基礎篇(一)前端面試題
- 8道經典JavaScript面試題解析,你真的掌握JavaScript了嗎?JavaScript面試題
- 經典面試題面試題
- AT 經典90題
- MVP模式的經典封裝MVP模式封裝