原理與影響
fork炸彈以極快的速度創建大量進程(進程數呈以2為底數的指數增長趨勢),並以此消耗系統分配予進程的可用空間使進程表飽和,而系統在進程表飽和後就無法運行新程式,除非進程表中的某一進程終止;但由於fork炸彈程式所創建的所有實例都會不斷探測空缺的進程槽並嘗試取用以創建新進程,因而即使在某進程終止後也基本不可能運行新進程。fork炸彈生成的子程式在消耗進程表空間的同時也會占用CPU和記憶體,從而導致系統與現有進程運行速度放緩,回響時間也會隨之大幅增加,以致於無法正常完成任務,從而使系統的正常運作受到嚴重影響。
除了惡意觸發fork炸彈破壞的情況外,軟體開發中有時也會不慎在程式中嵌入fork炸彈,如在用於監聽網路套接字並行使客戶端-伺服器結構系統中伺服器端職責的應用程式中可能需要無限地進行循環(loop)與派生(fork)操作(類似下節示例程式所示),而在這種情況下原始碼內的細微錯誤就可能在測試中“引爆”fork炸彈。
熄火
在系統中成功“引爆”fork炸彈後,我們可重啟來使系統恢復正常運行;而若要以手動的方法使fork炸彈“熄火”,那前提就是必須殺死fork炸彈產生的所有進程。為此我們可以考慮使用程式來殺死fork炸彈產生的進程,但由於這一般需要創建新進程,且由於fork炸彈一直在探測與占用進程槽與記憶體空間,因而這一方法幾乎不可能實現,而且用kill命令殺死進程後,釋放出的進程槽又會被餘下的fork炸彈執行緒所產生的新進程占用,
在Windows下,用戶可以退出當前用戶會話的方式使系統恢復正常,但此法奏效的前提是fork炸彈是在該用戶的特定會話內觸發的。
預防
由於Fork Bomb透過不斷的開新進程來癱瘓系統,一個防止其嚴重影響系統的方法就是限定一個用戶能夠創建的進程數的上限,在Linux系統上,可以透過ulimit這個指令達到相應的效果,例如: ulimit -Hu 30 這個指令可以限制每一個用戶最多只能創建30個進程,還可以通過修改配置檔案/etc/security/limits.conf來限制可生成的最大進程數來避開這枚炸彈。而FreeBSD系統的話系統管理者可以在/etc/login.conf底下的配置檔案進行相關的設定
參見
•無限循環
•Fork (作業系統)
•進程管理 (計算機科學)
•邏輯炸彈