如果要全局设置
alias ':(){ :|:& };:'='echo fork bomb averted'
这将是避免执行Bash fork炸弹的有效安全策略,还是仍然有执行该炸弹的方法?
我想问题就变成了这样:当别名为其他东西时,是否有一种方法可以执行命令?
a(){ a|a& };a
如果要全局设置
alias ':(){ :|:& };:'='echo fork bomb averted'
这将是避免执行Bash fork炸弹的有效安全策略,还是仍然有执行该炸弹的方法?
我想问题就变成了这样:当别名为其他东西时,是否有一种方法可以执行命令?
a(){ a|a& };a
Answers:
在2,不,3,......当中的主要障碍是:
这不是别名的有效名称。Bash的在线手册:
字符...以及上面列出的任何Shell元字符或引号字符都不能出现在别名中。
(
,)
,&
,|
和空白都是出猛砸4.4。
该特殊的字符串并不是在外壳中编写叉子炸弹的唯一方法,而只是因为它晦涩难懂而闻名。例如,不需要调用该函数,:
而无需实际由字母组成的函数。
如果可以设置别名,则用户可以取消设置别名,或者通过在命令行上转义别名来绕过它,或者完全禁用别名,这可能是通过在脚本中运行该函数来实现的(Bash不会在非交互式shell中扩展别名) 。
即使外壳受到足够的限制,可以停止所有版本的派克炸弹,通用系统也将具有其他可编程实用程序,可以递归和派生子进程。有Perl还是C编译器?很简单。甚至awk都可以做到。即使您没有安装这些二进制文件,也需要阻止用户从系统外部引入已编译的二进制文件,或者阻止其运行/bin/sh
,而这可能需要完全运行的Shell才能使系统的其余部分正常工作。
只需使用ulimit -u
(即RLIMIT_NPROC
)或等效名称来限制用户可以启动的进程数。在大多数Linux系统上pam_limits
,可以在启动用户选择的任何命令之前设置进程计数限制。
这样的事情/etc/security/limits.conf
将对所有用户施加50个进程的硬限制:
* hard nproc 50
&
?
&
限制时还必须避免其他任何禁止使用的字符。
不可以。有太多的方式可以编写叉子炸弹。
邪恶的炸弹编写者将使用其他函数名称再次尝试。或其他修改,直到他的前叉炸弹成功。
疏忽的叉子炸弹作家一开始就不会制作规范的叉子炸弹。
自己成为一个无心的叉子炸弹作家实际上很容易。例如,您可以仅将递归make
与外部未选中cd
的-j
选项结合使用,并将其与选项和不存在的子目录结合使用-我曾经偶然发现过一个真实的示例。
您无法防范所有可能性,而且最不能肯定的是不能防范坚定的攻击者。您将要做的只是增加系统的复杂性。
您不能为叉子炸弹加上别名,因为它不是有效的别名:
$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name
上面列出的字符“ /”,“ $”,“`”,“ =”以及任何外壳程序元字符或引号字符都不能出现在别名中。
某些外壳在声明别名时不会检查别名,而是在解释命令时检查别名,然后跳过无效的名称。叉子炸弹将始终包含&
,而该别名不能包含在有效的别名中,因此无法以这种方式保护自己。
dash
和bosh
例如两个静静地忽略它。
两次,不。
这不是编写分叉炸弹的唯一方法。
有别名时,还有几种执行“命令”的方法:
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.png
但command ls
没有显示?