mas*_*mas 15 security bash alias
如果你要全局设置
alias ':(){ :|:& };:'='echo fork bomb averted'
Run Code Online (Sandbox Code Playgroud)
这是否是避免 Bash fork 炸弹执行的有效安全策略,还是仍然有执行它的方法?
我想这个问题可以归结为:当命令别名为其他东西时,有没有办法执行命令?
ilk*_*chu 52
在2,不,3,......当中的主要障碍是:
它不是别名的有效名称。Bash 的在线手册:
字符 ... 以及上面列出的任何 shell 元字符或引用字符可能不会出现在别名中。
(
, )
, &
,|
和空格在 Bash 4.4 中消失了。
那个特定的字符串并不是在 shell 中编写 fork 炸弹的唯一方法,只是因为它看起来很晦涩而闻名。例如,不需要调用函数:
而不是实际由字母组成的东西。
如果您可以设置别名,用户可以取消设置别名,通过在命令行上转义别名来绕过它,或者完全禁用别名,可能是通过在脚本中运行该函数(Bash 不会在非交互式 shell 中扩展别名) .
即使 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点。)
小智 18
不,有太多的方法可以编写叉式炸弹。
邪恶的 fork-bomb 编写器只会使用不同的函数名称再试一次。或者其他改变,直到他的叉式炸弹成功。
无心的 fork-bomb 编写者不会首先产生规范的 fork-bomb。
实际上,自己很容易成为一个不经意的分叉炸弹作家。例如,您可以将 recursivemake
与外部的 uncheckedcd
结合使用,将其与-j
option 和不存在的子目录结合使用——这是我偶然发现的一个真实例子。
您无法防范所有可能性,当然也无法防范坚定的攻击者。您将获得的只是增加系统的复杂性。
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)