如果你要全局设置
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