全局别名化叉子炸弹会阻止其执行吗?


15

如果要全局设置

alias ':(){ :|:& };:'='echo fork bomb averted'

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

我想问题就变成了这样:当别名为其他东西时,是否有一种方法可以执行命令?


1
@ user1717828,一个“叉子炸弹”是一个永久永久运行其自身新副本的程序。结果导致正在运行的程序数量呈指数增长,通常会导致某些东西在短期内中断。
马克

1
即使这行得通,也不会阻止调用fork()的程序不通过bash吗?
UKMonkey

2
:(){:|:&:|:&} ;:
约书亚

3
刚运行a(){ a|a& };a
user253751 '18

1
您会避免使用通用格式(如果您希望它能正常工作的话),但是可能会有几乎无限的变化。
桅杆

Answers:


52

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

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

    字符...以及上面列出的任何Shell元字符或引号字符都不能出现在别名中。

    ()&|和空白都是出猛砸4.4。

  2. 该特殊的字符串并不是在外壳中编写叉子炸弹的唯一方法,而只是因为它晦涩难懂而闻名。例如,不需要调用该函数,:而无需实际由字母组成的函数。

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

  4. 即使外壳受到足够的限制,可以停止所有版本的派克炸弹,通用系统也将具有其他可编程实用程序,可以递归和派生子进程。有Perl还是C编译器?很简单。甚至awk都可以做到。即使您没有安装这些二进制文件,也需要阻止用户从系统外部引入已编译的二进制文件,或者阻止其运行/bin/sh,而这可能需要完全运行的Shell才能使系统的其余部分正常工作。

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

这样的事情/etc/security/limits.conf将对所有用户施加50个进程的硬限制:

*        hard    nproc           50

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


有没有可能写一个叉子炸弹&
斯蒂芬·基特

4
@StephenKitt我不确定100%,但是我的猜测是bash即将完成。如果是这样,可能存在无限的可能性。例如,您可以解析ascii字符代码38并执行它。
玛丽

在这种特殊情况下,@ Marie在解决该&限制时还必须避免其他任何禁止使用的字符。
斯蒂芬·基特

15
我的观点主要是试图将不良功能列入黑名单是一个坏主意。几乎总是有办法。
玛丽

2
@玛丽:Bash肯定是图灵完成的。
暂停,直到另行通知。

18

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

邪恶的炸弹编写者将使用其他函数名称再次尝试。或其他修改,直到他的前叉炸弹成功。

疏忽的叉子炸弹作家一开始就不会制作规范的叉子炸弹。

自己成为一个无心的叉子炸弹作家实际上很容易。例如,您可以仅将递归make与外部未选中cd-j选项结合使用,并将其与选项和不存在的子目录结合使用-我曾经偶然发现过一个真实的示例。

您无法防范所有可能性,而且最不能肯定的是不能防范坚定的攻击者。您将要做的只是增加系统的复杂性。


14

您不能为叉子炸弹加上别名,因为它不是有效的别名

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

上面列出的字符“ /”,“ $”,“`”,“ =”以及任何外壳程序元字符或引号字符都不能出现在别名中。

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


Shell是否允许设置此别名无关紧要。重要的是,即使存在这样的别名,在解释命令时也不会将其扩展,因为别名名称与允许的模式不匹配。dashbosh例如两个静静地忽略它。
schily

10

两次,不。

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

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

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

与主要主题无关,但为什么\ls显示output.pngcommand ls没有显示?
nxnev

好眼力!的确,这与主要主题无关。这是经典的PEBCAK错误,我在其中复制/粘贴错误(或清除中间的output.png)。我会修复它,以减少干扰。谢谢@nxnev!
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.