全域別名 fork 炸彈會阻止執行嗎?

全域別名 fork 炸彈會阻止執行嗎?

如果你要全域設定

alias ':(){ :|:& };:'='echo fork bomb averted'

這是否是避免 Bash 叉子炸彈執行的有效安全策略,或者仍然有辦法執行它?

我想這個問題可以歸結為:當命令別名為其他命令時,是否有辦法執行該命令?

答案1

兩個,不,三個…其中主要障礙是:

  1. 它不是有效的別名。Bash 的線上手冊

    字元 ... 以及上面列出的任何 shell 元字元或引用字元不得出現在別名中。

    ()&|空格在 Bash 4.4 中已不再存在。

  2. 這個特定的字串並不是在 shell 中編寫 fork 炸彈的唯一方法,只是因為它看起來晦澀難懂而出名。例如,不需要呼叫函數:而不是實際由字母組成的東西。

  3. 如果您可以設定別名,則使用者可以取消設定別名,透過在命令列上轉義別名來規避它,或者完全停用別名,可能透過在腳本中執行該函數(Bash 不會在非互動式shell 中擴展別名) 。

  4. 即使 shell 受到足夠的限制以阻止所有版本的 fork 炸彈,通用系統也將具有其他可以遞歸和分叉子進程的可程式實用程式。有 Perl 或 C 編譯器嗎?很容易。甚至 awk 也能做到。即使您沒有安裝這些文件,您也需要阻止使用者從系統外部引入已編譯的二進位文件,或者阻止使用者執行/bin/sh可能需要完全可操作的 shell 才能使系統的其餘部分正常運作。

只需使用ulimit -u(即RLIMIT_NPROC)或等同於限制使用者可以啟動的進程數量。大多數 Linux 系統上都有pam_limits可以在啟動使用者選擇的任何命令之前設定進程計數限制。

像這樣的東西/etc/security/limits.conf會給所有用戶設定 50 個進程的硬限制:

*        hard    nproc           50

(史蒂芬·基特已經提到過第 1 點,傑夫夏勒提及2 和 3。

答案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

相關內容