我强烈反对在setuid/setgid安全代码中使用标准命令shell的脚本语言(如csh、sh和bash)。有些系统(如Linux)完全禁用它们,所以会制造不必要的移植性问题。在某些老的系统上,由于竞争状态(像在进程一节讨论的那样)它们基本上是不安全的。即使对于其它系统,它们也确实不是个好想法。标准命令shell由于会受到不明显输入的影响而依旧声名狼籍 -- 通常是由于它们在设计时是为了某个交互式用户“自动”地完成工作,而不是防范某个坚定的攻击者。例如,“隐藏的”环境变量甚至在脚本执行前就可以影响它们如何操作。即使是可执行文件的文件名或目录下的内容都会产生影响。例如,在许多Bourne shell的实现上,如下操作会获得root权限(感谢NCSA描述了这种利用):
% ln -s /usr/bin/setuid-shell /tmp/-x % cd /tmp % -x |
如果一定要使用shell脚本语言,至少应该把脚本放在一个不可被移动或改变的目录下,而且在脚本中非常明确地把PATH和IFS设为已知值。