mas Asked: 2018-08-29 05:19:45 +0800 CST2018-08-29 05:19:45 +0800 CST 2018-08-29 05:19:45 +0800 CST 全局别名 fork 炸弹会阻止其执行吗? 772 如果你要全局设置 alias ':(){ :|:& };:'='echo fork bomb averted' 这会是避免 Bash 分叉炸弹执行的有效安全策略,还是有办法执行它? 我想这个问题可以兑现:当命令被别名为其他东西时,有没有办法执行命令? bash security 4 个回答 Voted Best Answer ilkkachu 2018-08-29T06:02:40+08:002018-08-29T06:02:40+08:00 两个,不,三个,......其中的主要障碍是: 它不是别名的有效名称。Bash 的在线手册: 字符 ... 以及上面列出的任何 shell 元字符或引用字符可能不会出现在别名中。 (, ), &,|和空格在 Bash 4.4 中没有了。 那个特定的字符串并不是在 shell 中编写分叉炸弹的唯一方法,只是因为它看起来晦涩难懂而出名。例如,不需要调用函数:,而是调用实际上由字母组成的东西。 如果您可以设置别名,用户可以取消设置别名,通过在命令行上转义别名来规避它,或者完全禁用别名,可能通过在脚本中运行该函数(Bash 不会在非交互式 shell 中扩展别名) . 即使外壳被限制到足以阻止所有版本的分叉炸弹,通用系统也将具有其他可编程实用程序,可以递归和分叉子进程。有 Perl 或 C 编译器?很容易。甚至 awk 也可能做到这一点。即使您没有安装这些,您也需要阻止用户从系统外部引入已编译的二进制文件,或者阻止用户运行/bin/sh可能需要一个完全可操作的 shell 才能使系统的其余部分运行。 只需使用ulimit -u(ie RLIMIT_NPROC) 或等效项来限制用户可以启动的进程数。在大多数 Linux 系统上pam_limits,可以在用户选择的任何命令启动之前设置进程计数限制。 像这样的东西/etc/security/limits.conf会对所有用户施加 50 个进程的硬性限制: * hard nproc 50 (Stephen Kitt已经提到了第 1 点,Jeff Schaller提到了第 2 点和第 3 点。) cmaster - reinstate monica 2018-08-29T09:09:47+08:002018-08-29T09:09:47+08:00 不,写叉子炸弹的方法太多了。 邪恶的 fork-bomb 编写器将使用不同的函数名称再次尝试。或其他改动,直到他的叉式炸弹成功。 不经意的叉子炸弹作者一开始就不会生产出标准的叉子炸弹。 实际上,自己成为一个不经意的分叉炸弹作家是相当容易的。例如,您可以将 recursivemake与外部 uncheckedcd结合使用,将其与-j选项和不存在的子目录结合起来——这是我偶然发现的一个真实示例。 你不能防范所有的可能性,当然也不能防范一个坚定的攻击者。您将实现的只是增加系统的复杂性。 Stephen Kitt 2018-08-29T05:22:08+08:002018-08-29T05:22:08+08:00 你不能给分叉炸弹起别名,因为它不是一个有效的别名: $ alias ':(){ :|:& };:'='echo fork bomb averted' bash: alias: `:(){ :|:& };:': invalid alias name 字符 '/'、'$'、'`'、'=' 以及上面列出的任何 shell 元字符或引用字符可能不会出现在别名中。 一些shell在声明它们时不检查别名,但是在解释命令时,然后跳过无效的名称。叉子炸弹将始终包含&,它不能包含在有效的别名中,因此无法以这种方式保护自己。 Jeff Schaller 2018-08-29T05:24:12+08:002018-08-29T05:24:12+08:00 两次,没有。 这不是编写分叉炸弹的唯一方法。 当有别名时,还有几种方法可以执行“命令”: 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
两个,不,
三个,......其中的主要障碍是:它不是别名的有效名称。Bash 的在线手册:
(
,)
,&
,|
和空格在 Bash 4.4 中没有了。那个特定的字符串并不是在 shell 中编写分叉炸弹的唯一方法,只是因为它看起来晦涩难懂而出名。例如,不需要调用函数
:
,而是调用实际上由字母组成的东西。如果您可以设置别名,用户可以取消设置别名,通过在命令行上转义别名来规避它,或者完全禁用别名,可能通过在脚本中运行该函数(Bash 不会在非交互式 shell 中扩展别名) .
即使外壳被限制到足以阻止所有版本的分叉炸弹,通用系统也将具有其他可编程实用程序,可以递归和分叉子进程。有 Perl 或 C 编译器?很容易。甚至 awk 也可能做到这一点。即使您没有安装这些,您也需要阻止用户从系统外部引入已编译的二进制文件,或者阻止用户运行
/bin/sh
可能需要一个完全可操作的 shell 才能使系统的其余部分运行。只需使用
ulimit -u
(ieRLIMIT_NPROC
) 或等效项来限制用户可以启动的进程数。在大多数 Linux 系统上pam_limits
,可以在用户选择的任何命令启动之前设置进程计数限制。像这样的东西
/etc/security/limits.conf
会对所有用户施加 50 个进程的硬性限制:(Stephen Kitt已经提到了第 1 点,Jeff Schaller提到了第 2 点和第 3 点。)
不,写叉子炸弹的方法太多了。
邪恶的 fork-bomb 编写器将使用不同的函数名称再次尝试。或其他改动,直到他的叉式炸弹成功。
不经意的叉子炸弹作者一开始就不会生产出标准的叉子炸弹。
实际上,自己成为一个不经意的分叉炸弹作家是相当容易的。例如,您可以将 recursive
make
与外部 uncheckedcd
结合使用,将其与-j
选项和不存在的子目录结合起来——这是我偶然发现的一个真实示例。你不能防范所有的可能性,当然也不能防范一个坚定的攻击者。您将实现的只是增加系统的复杂性。
你不能给分叉炸弹起别名,因为它不是一个有效的别名:
一些shell在声明它们时不检查别名,但是在解释命令时,然后跳过无效的名称。叉子炸弹将始终包含
&
,它不能包含在有效的别名中,因此无法以这种方式保护自己。两次,没有。
这不是编写分叉炸弹的唯一方法。
当有别名时,还有几种方法可以执行“命令”:
例子: