Shell脚本语言(sh及csh的变种)

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

如果一定要使用shell脚本语言,至少应该把脚本放在一个不可被移动或改变的目录下,而且在脚本中非常明确地把PATH和IFS设为已知值。