Linux的fork实现原理,【Linux】Fork炸弹详解
該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓
眾所周知,bash是一款極其強大的shell,提供了強大的交互與編程功能。這樣的一款shell中自然不會缺少“函數(shù)”這個元素來幫助程序進(jìn)行模塊化的高效開發(fā)與管理。于是產(chǎn)生了由于其特殊的特性,bash擁有了fork炸彈。Jaromil在2002年設(shè)計了最為精簡的一個fork炸彈的實現(xiàn)。
所謂fork炸彈是一種惡意程序,它的內(nèi)部是一個不斷在fork進(jìn)程的無限循環(huán),fork炸彈并不需要有特別的權(quán)限即可對系統(tǒng)造成破壞。fork炸彈實質(zhì)是一個簡單的遞歸程序。由于程序是遞歸的,如果沒有任何限制,這會導(dǎo)致這個簡單的程序迅速耗盡系統(tǒng)里面的所有資源。現(xiàn)在來看看Jaromil設(shè)計的最簡單的fork炸彈:
:() { :|:& };:
或者
.() { .|.& };.
一行看似無法理解的只有13個字符的命令,即可占用掉所有系統(tǒng)的資源。其實,這行命令如果這樣寫成bash script就不難理解了:
:()
{
:|: &
}
;
:
* 第 1 行說明下面要定義一個函數(shù),函數(shù)名為小數(shù)點,沒有可選參數(shù)。
* 第 2 行表示函數(shù)體開始。
* 第 3 行是函數(shù)體真正要做的事情,首先它遞歸調(diào)用本函數(shù),然后利用管道調(diào)用一個新進(jìn)程(它要做的事情也是遞歸調(diào)用本函數(shù)),并將其放到后臺執(zhí)行。
* 第 4 行表示函數(shù)體結(jié)束。
* 第 5 行并不會執(zhí)行什么操作,在命令行中用來分隔兩個命令用。從總體來看,它表明這段程序包含兩個部分,首先定義了一個函數(shù),然后調(diào)用這個函數(shù)。
* 第 6 行表示調(diào)用本函數(shù)。
冒號”:”其實是函數(shù)名,這個bash腳本就是在不斷的執(zhí)行該函數(shù),然后不斷fork出新的進(jìn)程。
對于函數(shù)名,大家可能會有所疑惑,小數(shù)點也能做函數(shù)名使用嗎?畢竟小數(shù)點是 shell 的一個內(nèi)嵌命令,用來在當(dāng)前 shell 環(huán)境中讀取指定 文件,并運行其中的命令。實際上的確可以,這取決于bash對命令的解釋順序。
默認(rèn)情況下,bash處于非POSIX模式,此時對命令的解釋順序如下:
* 關(guān)鍵字,例如 if、for 等。
* 別名。別名不能與關(guān)鍵字相同,但是可以為關(guān)鍵字定義別名,例如 end=fi。
* 特 殊內(nèi)嵌命令,例如 break、continue 等。POSIX 定義的特殊內(nèi)嵌命令包括:.(小數(shù)點)、:(冒號)、break、continue、 eval、exec、exit、export、readonly、 return、set、shift、times、trap 和 unset。 bash 又增加了一個特殊的內(nèi)嵌命令 source。
* 函數(shù)。如果處于非 POSIX 模式,bash 會優(yōu)先匹配函數(shù),然后再匹配內(nèi)嵌命令。
* 非特殊內(nèi)嵌命令,例如 cd、test 等。
* 腳本和可執(zhí)行程序。在 PATH 環(huán)境變量指定的目錄中進(jìn)行搜索,返回第一個匹配項。
由 于默認(rèn)情況下,bash 處于非 POSIX 模式,因此fork炸彈中的小數(shù)點會優(yōu)先當(dāng)成一個函數(shù)進(jìn)行匹配。(注:使用小數(shù)點代替其中的冒號,也能起到完全相同的效果。)
要使用POSIX模式來運行bash腳本,可以使用以下三種方法:
* 使用 –posix 選項啟動 bash。
* 在運行bash之后,執(zhí)行 set -o posix 命令。
* 使用 /bin/sh 。
那么,有沒有辦法扼制這種情況的發(fā)生呢?答案是肯定的,只需設(shè)置進(jìn)程的limit數(shù)即可。
[root@localhost ~]# ulimit -u 128
[root@localhost ~]# ulimit -a
core file size?????????? (blocks, -c) 0
data seg size??????????? (kbytes, -d) unlimited
max nice???????????????????????? (-e) 20
file size??????????????? (blocks, -f) unlimited
總結(jié)
以上是生活随笔為你收集整理的Linux的fork实现原理,【Linux】Fork炸弹详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 携程旅行网飞机票退票要扣多少手续费?
- 下一篇: 百度云api android,帮助文档首