要明确确定这在多大程度上可能是“谨慎的步骤”,我认为您必须对可能的替代品进行一些原始的安全研究,其中包括:
- Debian的破折号
- OpenBSD 的 ksh
- 忙箱灰
- MirBSD/MirOS mksh
- ...当然还有其他人
Mark 的回答表明,至少 OpenBSD 已经接受了安全审查,但我不确定程度或是否有证据支持这一点(显然,他们直到最近才对通信安全的基石(OpenSSL)进行任何审查当他们将它分叉到 LibreSSL 中时)。另一方面,我很清楚直到最近才有人费心阅读 Bash 源代码以确保安全,否则很久以前就会发现“shellshock”;整个“功能导入”的事情是一个巨大的危险信号,任何安全研究人员一看到它就会仔细检查(并希望建议删除整个功能)。但对于其他人来说,情况并不那么清楚。
不过,很明显,上述所有方法的攻击面都比 Bash 小得多。为了让攻击者控制程序,必须有一些输入通道。这些当然可以是不明显的东西,例如资源限制、系统时钟等,但它们仍然是输入;一个绝对没有输入的程序是微不足道的。Bash 中的安全设计错误在于它采用了可能不受信任的输入(任意环境变量的内容)并将它们进行复杂的处理(解析为代码)。另一方面,据我所知,上面列出的 shell 都没有对环境变量的内容进行任何处理(除了具有特定既定含义的个别变量,例如LANG
and LC_*
,ENV
, IFS
, PATH
, PS1
, 等)或其他输入;他们只是将内容视为传递的抽象数据。
因此,从安全设计的角度来看,即使没有审核这些替代方案,我估计它们也是比 Bash 更安全的选择。是否会保持这种情况尚不清楚。当然,Bash 现在得到了很多新的关注,而其他 shell 不太可能受到这些关注,因此我们最终可能会修复 Bash 中的大部分问题,而其他 shell 中的问题仍然未知。然后您需要考虑各种因素,例如您是否可能单独定位,在这种情况下,使用不太主流的软件可能是一种负担。
就个人而言,我在大多数地方都使用 Busybox ash。如果不出意外,ash 和 dash 都使用 bash 的 1/5 内存并且启动速度快 2-8 倍,因此从非安全角度来看,它们也是非常实用的选择。