全局别名 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

相关内容