fork炸弹
:(){ :|:& };: ? ? ? ? ? ? ? ? ? ? ? ? # 著名的 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底下的設置檔進行相關的設置
轉載于:https://blog.51cto.com/welcomeweb/1737704
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
- 上一篇: Material Design学习之 S
- 下一篇: 使用Spring AOP中MethodI