:(){ :|:& };: # 著名的 fork炸彈,系統執行海量的程序,直到系統僵死
fork炸彈
fork炸彈(fork bomb)在計算機領域中是一種利用系統調用fork(或其他等效的方式)進行的拒絕服務攻擊。與病毒與蠕蟲不同的是,fork炸彈沒有傳染性,而且fork炸彈會使對同時執行程序/程式數設限的系統無法執行新程式,對于不設限的系統則使之停止響應。以fork炸彈為代表的自我複制程式有時亦被稱為wabbit。
fork炸彈的概念:程序遞歸式派生(fork,亦即自我複制),以使系統拒絕服務甚至崩潰
原理與影響
fork炸彈以極快的速度建立大量程序(程序數呈以2為底數的指數增長趨勢),并以此消耗系統配置設定予程序的可用空間使程序表飽和,而系統在程序表飽和後就無法運作新程式,除非程序表中的某一程序終止;但由于fork炸彈程式所建立的所有執行個體都會不斷探測空缺的程序槽并嘗試取用以建立新程序,因而即使在某程序終止後也基本不可能運作新程序。fork炸彈生成的子程式在消耗程序表空間的同時也會占用CPU和記憶體,進而導緻系統與現有程序運作速度放緩,響應時間也會随之大幅增加,以緻于無法正常完成任務,進而使系統的正常運作受到嚴重影響。
除了惡意觸發fork炸彈破壞的情況外,軟體開發中有時也會不慎在程式中嵌入fork炸彈,如在用于監聽網絡套接字并行使用戶端-伺服器結構系統中伺服器端職責的應用程式中可能需要無限地進行循環(loop)與派生(fork)操作(類似下節示例程式所示),而在這種情況下源代碼内的細微錯誤就可能在測試中"引爆"fork炸彈。
折疊編輯本段示例
以下程式段就是由Jaromil所作的在類UNIX系統的shell環境下觸發fork炸彈的shell腳本代碼,總共隻用了13個字元(包括空格):
:(){ :|:& };:
注解如下:
:() # 定義函數,函數名為":",即每當輸入":"時就會自動調用{}内代碼
{ # ":"函數開始辨別
: # 用遞歸方式調用":"函數本身
| # 并用管道(pipe)将其輸出引至...
: # 另一次遞歸調用的":"函數
# 綜上,":|:"表示的即是每次調用函數":"的時候就會生成兩份拷貝
& # 調用間脫鈎,以使最初的":"函數被殺死後為其所調用的兩個":"函數還能繼續執行
} # ":"函數結束辨別
; # ":"函數定義結束後将要進行的操作...
: # 調用":"函數,"引爆"fork炸彈
其中函數名":"隻是簡化的一例,實際實作時可以随意設定,一個較易了解(将函數名替換為"forkbomb")的版本如下:
forkbomb(){ forkbomb|forkbomb &} ; forkbomb
Windows下則可以批處理指令如下實作:
%0|%0
POSIX标準下的C與C++的實作:
#include <unistd.h>int main(){while(1) fork();return0;}
Perl語言的實作:
fork while fork
折疊編輯本段"熄火"
在系統中成功"引爆"fork炸彈後,我們可重新開機來使系統恢複正常運作;而若要以手動的方法使fork炸彈"熄火",那前提就是必須殺死fork炸彈産生的所有程序。為此我們可以考慮使用程式來殺死fork炸彈産生的程序,但由于這一般需要建立新程序,且由于fork炸彈一直在探測與占用程序槽與記憶體空間,因而這一方法幾乎不可能實作,而且用kill指令殺死程序後,釋放出的程序槽又會被餘下的fork炸彈線程所産生的新程序占用,
在Windows下,使用者可以退出目前使用者會話的方式使系統恢複正常,但此法奏效的前提是fork炸彈是在該使用者的特定會話内觸發的。
折疊編輯本段預防
由于Fork Bomb通過不斷的開新程序來癱瘓系統,一個防止其嚴重影響系統的方法就是限定一個使用者能夠建立的程序數的上限,在Linux系統上,可以通過ulimit這個指令達到相應的效果,例如: ulimit -Hu 30 這個指令可以限制每一個使用者最多隻能建立30個程序。而FreeBSD系統的話系統管理者可以在/etc/login.conf底下的設定檔進行相關的設定
本文轉自 憬薇 51CTO部落格,原文連結:http://blog.51cto.com/welcomeweb/1737704