0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

最為精簡的一個Linux Fork炸彈解析

Linux愛好者 ? 來源:博客 ? 作者:Saymagic ? 2021-09-07 16:12 ? 次閱讀

轉(zhuǎn)自:http://blog.saymagic.cn/2015/03/25/fork-bomb.html

Jaromil在2002年設(shè)計了最為精簡的一個Linux Fork***,整個代碼只有13個字符,在shell中運(yùn)行后幾秒后系統(tǒng)就會宕機(jī):

:() { :|:& };:

這樣看起來不是很好理解,我們可以更改下格式:

:()

{

:|:&

};

更好理解一點(diǎn)的話就是這樣:

bomb()

{

bomb|bomb&

};

bomb

因?yàn)閟hell中函數(shù)可以省略function關(guān)鍵字,所以上面的十三個字符是功能是定義一個函數(shù)與調(diào)用這個函數(shù),函數(shù)的名稱為:,主要的核心代碼是:|:&,可以看出這是一個函數(shù)本身的遞歸調(diào)用,通過&實(shí)現(xiàn)在后臺開啟新進(jìn)程運(yùn)行,通過管道實(shí)現(xiàn)進(jìn)程呈幾何形式增長,最后再通過:來調(diào)用函數(shù)引爆***。因此,幾秒鐘系統(tǒng)就會因?yàn)樘幚聿贿^來太多的進(jìn)程而死機(jī),解決的唯一辦法就是重啟。

Bomb一下

秉著不作不死的心態(tài),我們也來運(yùn)行一下,于是我將矛頭指向云主機(jī),我使用了國內(nèi)的一個2G內(nèi)存的云主機(jī),首先在本地開啟兩個終端,在一個終端連接云主機(jī)后運(yùn)行***,幾秒后再嘗試用另外一個終端登錄,效果可以看下面Gif圖:

看,運(yùn)行一段時間后直接報出了-bash: fork: Cannot allocate memory,說明內(nèi)存不足了。并且我在二號終端上嘗試連接也沒有任何反應(yīng)。因?yàn)槭翘摂M的云主機(jī),所以我只能通過主機(jī)服務(wù)商的后臺來給主機(jī)斷電重啟。然后才能重新登錄:

***危害

Fork***帶來的后果就是耗盡服務(wù)器資源,使服務(wù)器不能正常的對外提供服務(wù),也就是常說的DoS(Denial of Service)。與傳統(tǒng)1v1、通過不斷向服務(wù)器發(fā)送請求造成服務(wù)器崩潰不同,F(xiàn)ork***有種坐山觀虎斗,不費(fèi)一兵一卒斬敵人于馬下的感覺。更嚇人的是這個函數(shù)是不需要root權(quán)限就可以運(yùn)行的??吹骄W(wǎng)上有帖子說某些人將個性簽名改為Fork***,結(jié)果果真有好奇之人中槍,試想如果中槍的人是在公司服務(wù)器上運(yùn)行的話,oh,!

預(yù)防方式

當(dāng)然,F(xiàn)ork***沒有那么可怕,用其它語言也可以分分鐘寫出來一個,例如,python版:

import os

while True:

os.fork()

Fork***的本質(zhì)無非就是靠創(chuàng)建進(jìn)程來搶占系統(tǒng)資源,在Linux中,我們可以通過ulimit命令來限制用戶的某些行為,運(yùn)行ulimit -a可以查看我們能做哪些限制:

ubuntu@10-10-57-151:~$ ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 7782

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 7782

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

可以看到,-u參數(shù)可以限制用戶創(chuàng)建進(jìn)程數(shù),因此,我們可以使用ulimit -u 20來允許用戶最多創(chuàng)建20個進(jìn)程。這樣就可以預(yù)防bomb***。但這樣是不徹底的,關(guān)閉終端后這個命令就失效了。我們可以通過修改/etc/security/limits.conf文件來進(jìn)行更深層次的預(yù)防,在文件里添加如下一行(ubuntu需更換為你的用戶名):

ubuntu - nproc 20

這樣,退出后重新登錄,就會發(fā)現(xiàn)最大進(jìn)程數(shù)已經(jīng)更改為20了,

這個時候我們再次運(yùn)行***就不會報內(nèi)存不足了,而是提示-bash: fork: retry: No child processes,很棒,此時說明Linux限制了***創(chuàng)建線程。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207921
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67771

原文標(biāo)題:解析超經(jīng)典的 Fork 炸彈

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    python解析netflow數(shù)據(jù)到csv的流程詳解

    本文主要講解了linux下通過tcpdump抓取netflow數(shù)據(jù)包,并將其導(dǎo)入到wireshark進(jìn)行解析,然后通過wireshark導(dǎo)出數(shù)據(jù)為json文件,再通過python腳本將其解析為csv文件以便做數(shù)據(jù)分析。
    的頭像 發(fā)表于 05-01 11:18 ?534次閱讀
    python<b class='flag-5'>解析</b>netflow數(shù)據(jù)到csv的流程詳解

    linux和windows的區(qū)別 linux系統(tǒng)般用來干嘛

    Linux的設(shè)計理念 Linux開源操作系統(tǒng),其設(shè)計理念是自由、共享和開放。Linux系統(tǒng)遵循類Unix的設(shè)計原則,注重系統(tǒng)的穩(wěn)定性
    的頭像 發(fā)表于 02-05 14:06 ?683次閱讀

    淺談Linux的進(jìn)程

    進(jìn)程和程序的區(qū)別: 進(jìn)程是動態(tài)的,程序是靜態(tài)的 、進(jìn)程的創(chuàng)建(fork()函數(shù)) int main(){ pid_t pid; pid=fork(); if(pid?????>0
    的頭像 發(fā)表于 01-28 15:54 ?198次閱讀
    淺談<b class='flag-5'>Linux</b>的進(jìn)程

    美國JDAM聯(lián)合制導(dǎo)攻擊武器技術(shù)解析與實(shí)戰(zhàn)應(yīng)用

    聯(lián)合制導(dǎo)攻擊武器般由Mk-82(500磅)、Mk-83(1000磅)和Mk-84(2000磅)四種規(guī)格的常規(guī)炸彈改裝而成,改裝后分別編號為GBU-38、GBU-32和GBU-31。其中GBU-32和GBU-31為專用侵徹型炸彈
    發(fā)表于 01-19 10:32 ?1095次閱讀
    美國JDAM聯(lián)合制導(dǎo)攻擊武器技術(shù)<b class='flag-5'>解析</b>與實(shí)戰(zhàn)應(yīng)用

    Linux內(nèi)核內(nèi)存管理架構(gòu)解析

    內(nèi)存管理子系統(tǒng)可能是linux內(nèi)核中最為復(fù)雜的子系統(tǒng),其支持的功能需求眾多,如頁面映射、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片管理、頁面緩存、頁面統(tǒng)計等,而且對
    的頭像 發(fā)表于 01-04 09:24 ?556次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核內(nèi)存管理架構(gòu)<b class='flag-5'>解析</b>

    Linux常用命令自學(xué)手冊》+本手邊linux速查字典

    的兩本書,《linux就該這么學(xué)》和《Linux常用命令自學(xué)手冊》。 首先,這邊書還是延續(xù)了劉老師精簡的風(fēng)格,從目錄上看,幾乎涵蓋了linux命令中最常用的200
    發(fā)表于 12-26 08:46

    100Linux Shell腳本總結(jié)

    不知道大家有沒有發(fā)現(xiàn),會編寫shell腳本的運(yùn)維,工資不會低,并且他的工作會很輕松!今天浩道跟大家分享每一個Linux運(yùn)維應(yīng)知必會的100shell腳本,雖然你工作中可能用不上,但是卻不能
    的頭像 發(fā)表于 12-05 09:28 ?970次閱讀

    Linux讀寫鎖邏輯解析Linux為何會引入讀寫鎖?

    除了mutex,在linux內(nèi)核中,還有經(jīng)常用到的睡眠鎖就是rw semaphore(后文簡稱為rwsem),它到底和mutex有什么不同呢?
    的頭像 發(fā)表于 12-04 11:04 ?728次閱讀
    <b class='flag-5'>Linux</b>讀寫鎖邏輯<b class='flag-5'>解析</b>—<b class='flag-5'>Linux</b>為何會引入讀寫鎖?

    Android安全機(jī)制介紹及實(shí)踐

    Android系統(tǒng)運(yùn)行于Linux內(nèi)核之上,init進(jìn)程是用戶空間啟動的第一個進(jìn)程,職責(zé)主要為fork出系統(tǒng)關(guān)鍵進(jìn)(Daemons)、servicemanager、zygote等;提供屬性服務(wù)管理系統(tǒng)屬性等。
    的頭像 發(fā)表于 11-14 09:35 ?848次閱讀
    Android安全機(jī)制介紹及實(shí)踐

    shell命令和linux命令樣嗎

    結(jié)合在起,形成相當(dāng)于面向過程的程序,即shell script,從而實(shí)現(xiàn)些復(fù)雜的功能。 而Linux命令則是用來對
    的頭像 發(fā)表于 11-08 10:51 ?2442次閱讀

    Linux如何讓某一個線程排他性獨(dú)占CPU

    本文主要討論在高實(shí)時要求、高效能計算、DPDK等領(lǐng)域,Linux如何讓某一個線程排他性獨(dú)占CPU;獨(dú)占CPU涉及的線程、中斷隔離原理;以及如何在排他性獨(dú)占的情況下,甚至讓系統(tǒng)的timer tick也不打斷獨(dú)占任務(wù),從而實(shí)現(xiàn)最低的延遲抖動。
    的頭像 發(fā)表于 11-05 09:39 ?1372次閱讀
    <b class='flag-5'>Linux</b>如何讓某<b class='flag-5'>一個</b>線程排他性獨(dú)占CPU

    DNS的各種玩法:程序編譯到進(jìn)程的過程解析

    Linux中使用fork創(chuàng)建進(jìn)程,返回進(jìn)程id。通過id的不同讓父子進(jìn)程各干其事,然后使用execvp執(zhí)行具體任務(wù)
    發(fā)表于 10-20 11:10 ?310次閱讀
    DNS的各種玩法:程序編譯到進(jìn)程的過程<b class='flag-5'>解析</b>

    文總結(jié)linux的platform驅(qū)動

    linux設(shè)備驅(qū)動中,有許多沒有特定總線的外設(shè)驅(qū)動,在實(shí)際開發(fā)中,又需要使用到總線、驅(qū)動和設(shè)備模型這三概念,故而linux提供了platform這個虛擬總線,掛接在platform總線上的驅(qū)動稱為platform驅(qū)動
    的頭像 發(fā)表于 10-16 16:45 ?803次閱讀
    <b class='flag-5'>一</b>文總結(jié)<b class='flag-5'>linux</b>的platform驅(qū)動

    Linux驅(qū)動模塊.ko內(nèi)存精簡優(yōu)化過程

    Linux 驅(qū)動模塊可以獨(dú)立的編譯成 .ko 文件,雖然大小般只有幾 MB,但對總內(nèi)存只有幾十 MB 的小型 Linux 系統(tǒng)來說,常常也是
    發(fā)表于 09-25 09:23 ?1140次閱讀

    LINUX隨身指南分享

    選項(xiàng)的意義以及典型用法的示范。本手冊的參考資料以Fedora Linux為準(zhǔn),但是大部分信息同樣適用于其他Linux系統(tǒng)。如果你需要立刻學(xué)會Linux的實(shí)際應(yīng)用,或是你身邊需要本簡短
    發(fā)表于 09-25 08:25