日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典的 Fork 炸弹解析

發(fā)布時(shí)間:2024/4/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典的 Fork 炸弹解析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自: http://blog.saymagic.cn/2015/03/25/fork-bomb.html 本文地址:https://linux.cn/article-5685-1.html


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

  • :(){:|:&};:
  • 這樣看起來不是很好理解,我們可以更改下格式:

  • :()
  • {
  • :|:&
  • };
  • :
  • 更好理解一點(diǎn)的話就是這樣:

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

    Bomb一下

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

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

    炸彈危害

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

    預(yù)防方式

    當(dāng)然,Fork炸彈沒有那么可怕,用其它語言也可以分分鐘寫出來一個(gè),例如,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個(gè)進(jìn)程。這樣就可以預(yù)防bomb炸彈。但這樣是不徹底的,關(guān)閉終端后這個(gè)命令就失效了。我們可以通過修改/etc/security/limits.conf文件來進(jìn)行更深層次的預(yù)防,在文件里添加如下一行(ubuntu需更換為你的用戶名):

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

    這個(gè)時(shí)候我們?cè)俅芜\(yùn)行炸彈就不會(huì)報(bào)內(nèi)存不足了,而是提示-bash: fork: retry: No child processes,說明Linux限制了炸彈創(chuàng)建進(jìn)程。

    參考

    http://en.wikipedia.org/wiki/Fork_bomb

    總結(jié)

    以上是生活随笔為你收集整理的经典的 Fork 炸弹解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。