全局别名 fork 炸弹会阻止其执行吗?

mas*_*mas 15 security bash alias

如果你要全局设置

alias ':(){ :|:& };:'='echo fork bomb averted'
Run Code Online (Sandbox Code Playgroud)

这是否是避免 Bash fork 炸弹执行的有效安全策略,还是仍然有执行它的方法?

我想这个问题可以归结为:当命令别名为其他东西时,有没有办法执行命令?

ilk*_*chu 52

2,不,3,......当中的主要障碍是:

  1. 它不是别名的有效名称。Bash 的在线手册

    字符 ... 以及上面列出的任何 shell 元字符或引用字符可能不会出现在别名中。

    (, ), &,|和空格在 Bash 4.4 中消失了。

  2. 那个特定的字符串并不是在 shell 中编写 fork 炸弹的唯一方法,只是因为它看起来很晦涩而闻名。例如,不需要调用函数:而不是实际由字母组成的东西。

  3. 如果您可以设置别名,用户可以取消设置别名,通过在命令行上转义别名来绕过它,或者完全禁用别名,可能是通过在脚本中运行该函数(Bash 不会在非交互式 shell 中扩展别名) .

  4. 即使 shell 被限制到足以阻止所有版本的 fork 炸弹,通用系统也会有其他可编程实用程序,可以递归和分叉子进程。有 Perl 或 C 编译器吗?很容易。甚至 awk 也可能做到。即使你没有安装这些,你也需要阻止用户从系统外部引入编译的二进制文件,或者运行/bin/sh它可能需要成为一个完全可操作的 shell,以便系统的其余部分运行。

只需使用ulimit -u(ie RLIMIT_NPROC) 或等效项来限制用户可以启动的进程数。在大多数 Linux 系统上pam_limits,可以在启动用户选择的任何命令之前设置进程计数限制。

像这样的事情/etc/security/limits.conf会对所有用户设置 50 个进程的硬限制:

*        hard    nproc           50
Run Code Online (Sandbox Code Playgroud)

(Stephen Kitt已经提到了第 1 点,Jeff Schaller提到了第2 点和第 3点。)

  • 我的观点主要是试图将不良功能列入黑名单是一个坏主意。几乎总是有办法解决的。 (15认同)
  • @StephenKitt 我不是 100% 确定,但我的猜测是 bash 图灵完整。如果是这样,可能有无限的可能性。例如,您可以解析 ascii 字符代码 38 并执行它。 (4认同)
  • @Marie:Bash 肯定是图灵完备的。 (2认同)

小智 18

不,有太多的方法可以编写叉式炸弹。

邪恶的 fork-bomb 编写器只会使用不同的函数名称再试一次。或者其他改变,直到他的叉式炸弹成功。

无心的 fork-bomb 编写者不会首先产生规范的 fork-bomb。

实际上,自己很容易成为一个不经意的分叉炸弹作家。例如,您可以将 recursivemake与外部的 uncheckedcd结合使用,将其与-joption 和不存在的子目录结合使用——这是我偶然发现的一个真实例子。

您无法防范所有可能性,当然也无法防范坚定的攻击者。您将获得的只是增加系统的复杂性。


Ste*_*itt 14

你不能给 fork 炸弹取别名,因为它不是一个有效的别名

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name
Run Code Online (Sandbox Code Playgroud)

字符 '/'、'$'、'`'、'=' 以及上面列出的任何 shell 元字符或引用字符不能出现在别名中。

某些 shell 在声明时不会检查别名,但在解释命令时会检查它们,然后跳过无效名称。叉炸弹将始终包含&,它不能包含在有效的别名中,因此以这种方式保护自己是不可能的。


Jef*_*ler 10

两次,没有。

这不是编写叉式炸弹的唯一方法。

当有别名时,还有几种方法可以执行“命令”:

command the-command
\the-command
Run Code Online (Sandbox Code Playgroud)

例子:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png
Run Code Online (Sandbox Code Playgroud)