您好,登錄后才能下訂單哦!
這篇文章主要介紹了Shell腳本中Fork炸彈的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
fork炸彈介紹
眾所周知,bash是一款極其強大的shell,提供了強大的交互與編程功能。這樣的一款shell中自然不會缺少函數這個元素來幫助程序進行模塊化的高效開發與管理。于是產生了由于其特殊的特性,bash擁有了fork炸彈。Jaromil在2002年設計了最為精簡的一個fork炸彈的實現。
所謂fork炸彈是一種惡意程序,它的內部是一個不斷在fork進程的無限循環,fork炸彈并不需要有特別的權限即可對系統造成破壞。fork炸彈實質是一個簡單的遞歸程序。由于程序是遞歸的,如果沒有任何限制,這會導致這個簡單的程序迅速耗盡系統里面的所有資源。
現在來看看Jaromil設計的最簡單的fork炸彈
fork炸彈分析
:() { :|:& };:
一行看似無法理解的只有13個字符的命令,即可占用掉所有系統的資源。其實,這行命令如果這樣寫成bash script就不難理解了
:() { :|:& } ; :
第 1 行 說明下面要定義一個函數,函數名為小數點,沒有可選參數。
第 2 行 表示函數體開始。
第 3 行 是函數體真正要做的事情,首先它遞歸調用本函數,然后利用管道調用一個新進程(它要做的事情也是遞歸調用本函數),并將其放到后臺執行。
第 4 行 表示函數體結束。
第 5 行 并不會執行什么操作,在命令行中用來分隔兩個命令用。從總體來看,它表明這段程序包含兩個部分,首先定義了一個函數,然后調用這個函數。
第 6 行 表示調用本函數。
冒號”:”其實是函數名,這個bash腳本就是在不斷的執行該函數,然后不斷fork出新的進程。
fork炸彈預防
那么,有沒有辦法扼制這種情況的發生呢?答案是肯定的,只需設置進程的limit數即可。
$ ulimit -u 128 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited max nice (-e) 20 file size (blocks, -f) unlimited pending signals (-i) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) unlimited max rt priority (-r) unlimited stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 128 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
在上面的例子中,我們將用戶可以創建的最大進程數限制為 128,執行fork炸彈會迅速fork出大量進程,此后會由于資源不足而無法繼續執行。使用工具ulimit即可設置各種限制數,具體的請參考該工具的man或help。
fork 炸彈讓我們認識到了遞歸函數的強大功能,同時也意識到一旦使用不當,遞歸函數所造成的破壞將是巨大的。實際上,fork 炸彈只是一個非常簡單的遞歸函數,它并不涉及參數傳遞、返回值等問題,而這些問題在使用bash編程時是否有完善的支持呢?在bash中編寫遞歸函數時應該注意相關問題。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Shell腳本中Fork炸彈的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。