
如果你要全域設定
alias ':(){ :|:& };:'='echo fork bomb averted'
這是否是避免 Bash 叉子炸彈執行的有效安全策略,或者仍然有辦法執行它?
我想這個問題可以歸結為:當命令別名為其他命令時,是否有辦法執行該命令?
答案1
兩個,不,三個…其中的主要障礙是:
它不是有效的別名。Bash 的線上手冊:
字元 ... 以及上面列出的任何 shell 元字元或引用字元不得出現在別名中。
(
、)
、&
和|
空格在 Bash 4.4 中已不再存在。這個特定的字串並不是在 shell 中編寫 fork 炸彈的唯一方法,只是因為它看起來晦澀難懂而出名。例如,不需要呼叫函數
:
而不是實際由字母組成的東西。如果您可以設定別名,則使用者可以取消設定別名,透過在命令列上轉義別名來規避它,或者完全停用別名,可能透過在腳本中執行該函數(Bash 不會在非互動式shell 中擴展別名) 。
即使 shell 受到足夠的限制以阻止所有版本的 fork 炸彈,通用系統也將具有其他可以遞歸和分叉子進程的可程式實用程式。有 Perl 或 C 編譯器嗎?很容易。甚至 awk 也能做到。即使您沒有安裝這些文件,您也需要阻止使用者從系統外部引入已編譯的二進位文件,或者阻止使用者執行
/bin/sh
可能需要完全可操作的 shell 才能使系統的其餘部分正常運作。
只需使用ulimit -u
(即RLIMIT_NPROC
)或等同於限制使用者可以啟動的進程數量。大多數 Linux 系統上都有pam_limits
可以在啟動使用者選擇的任何命令之前設定進程計數限制。
像這樣的東西/etc/security/limits.conf
會給所有用戶設定 50 個進程的硬限制:
* hard nproc 50
答案2
不。
邪惡的叉子炸彈作者只會用不同的函數名稱再次嘗試。或其他改變,直到他的叉子炸彈成功。
無意的叉子炸彈作者一開始就不會製作出規範的叉子炸彈。
事實上,你自己很容易無意中成為一個叉子炸彈作家。例如,您可以將遞歸make
與外部的、未經檢查的結合使用cd
,將其與-j
選項和不存在的子目錄結合起來——這是我偶然發現的一個真實例子。
您無法防範所有可能性,更不可能防範堅決的攻擊者。您將實現的只是增加系統的複雜性。
答案3
你不能給叉子炸彈起別名,因為它不是有效的別名:
$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name
字元“/”、“$”、“`”、“=”以及上面列出的任何 shell 元字元或引用字元不得出現在別名中。
有些 shell 在宣告別名時不檢查別名,而是在解釋指令時檢查別名,然後跳過無效名稱。 Fork 炸彈將始終包含&
,它不能包含在有效的別名中,因此不可能以這種方式保護自己。
答案4
兩次,沒有。
這並不是編寫叉子炸彈的唯一方法。
當有別名時,還有多種方法可以執行「命令」:
command the-command
\the-command
例子:
$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html output.png
$ command ls
jeff.html output.png