fork炸弹c语言能否运行,Fork炸弹简析和应对方法
簡述
第一次聽到fork炸彈這種東西的時候以為是一個很神奇的破壞力驚人的高能腳本,然而稍微深入的了解了一下才發現這個玩意其實是個挺簡單純粹的東西,只是被一個叫Jaromil的家伙對他的精美包裝給戲耍了。他在2002年給出了Linux下fork炸彈的最經典的形式:
myths@myths-X450LD:~$ :(){ :|:& };:
一段非常忽悠人的代碼,只有13個字母,乍一看完全看不懂。。但其實這個代碼的思路非常簡單,就是遞歸的開一個新的進程,不斷的開不斷的開,直到操作系統崩潰。中招后唯一的解決辦法就是拔電源重啟。
作為長期寫C語言的我們來說,看這段代碼有一個很大的坎,就是標識符。C語言里的標識符是不會包含" : "這個東西的,然而這里的函數名恰恰就是這個“ : ”。所謂的fork炸彈,其實就是聲明了一個函數,這個函數的名字叫做" : " 他的函數體是調用它本身,并且用管道將他的輸出重定向到另一個該函數,并在后臺運行。最后調用這個函數。稍微清楚的寫法是:bomb(){
bomb|bomb&
};
bomb
這樣就清楚很多了,也就沒啥神秘的了。
后果
這段代碼執行的后果不用說,就是電腦死機。死機的原因就類似DDoS攻擊一樣,系統忙于處理這個垃圾程序生成的垃圾進程而無法分配給我們需要執行的程序。所以,一般沒事做的話不要跑這個代碼(話說我就無聊的跑了兩遍)。
其實fork炸彈的危險性倒不是特別大,破壞力也不是特別強,畢竟重啟一下就行了。Linux下也有其他擁有更強破壞力的命令,然而為什么都沒有他有名呢?原因很簡單,fork炸彈的執行不需要root權限!獲取root權限實在不容易,而fork炸彈可以完全繞過這一點來對電腦進行破壞,所以這才厲害。
預防
預防fork命令的方法也很清楚,就是限制系統的最大進程數,這樣就算運行了也不會死機了,就留給我們殺掉這個進程的機會了。
在這里我們可以通過ulimit命令來查看系統定義的最大進程數:myths@myths-X450LD:~$ 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) 15261
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) 15261
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
注意倒數第三行,根據這一行我們就可以看到當前的最大進程數是15261,而且可以看到對應的參數是 -u,這樣我們就可以進行修改了:
myths@myths-X450LD:~$ ulimit -u 200
這樣下來最大進程數就是200了。
但是這樣設置下來的數據只能在當前終端奏效,當關閉當前終端后,系統會重新調回默認值的。
所以最終的解決辦法是修改配置文件。系統的配置文件是 /etc/security/limits.conf :myths@myths-X450LD:~$ cat /etc/security/limits.conf
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#
#
#Where:
# can be:
# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
# - NOTE: group and wildcard limits are not applied to root.
# To apply a limit to the root user, must be
# the literal username root.
#
# can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
# can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open files
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit (KB)
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19]
# - rtprio - max realtime priority
# - chroot - change root to directory (Debian-specific)
#
#
#
#* soft core 0
#root hard core 100000
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#ftp - chroot /ftp
#@student - maxlogins 4
# End of file
我們發現里面的說明注釋還是很全的,照著弄就好了。這里我們一般是添加一句:myths soft npro 200
myths hard npro 200
最后保存下文件并且注銷下用戶,重新登陸回來可以看到配置已經更改。
注:我在這里發現了一個問題,就是在我的ubuntu 14,04 上,用修改配置文件的方法修改后會導致系統崩潰。。原因不明,可能是進程數設置小了吧。
總結
以上是生活随笔為你收集整理的fork炸弹c语言能否运行,Fork炸弹简析和应对方法的全部內容,希望文章能夠幫你解決所遇到的問題。