【发布时间】:2012-03-21 21:36:42
【问题描述】:
shell(或 bash)中的命令列表在竞争条件下的安全性如何?
if [ -h "$dir" ]; then
echo 'Directory exists and is a symlink'
exit 1
fi
cd "$dir"
上面的代码显然容易出现竞争条件:攻击者可以在检查之后创建符号链接,但仍然是在将目录更改为之前。
这同样适用于|| 命令列表吗?换句话说:下面的命令是否不受竞争条件的影响,或者上面的规则是否仍然适用?
[ -h "$dir" ] || cd "$dir"
带有错误信息:
[ -h "$dir" ]
&& { echo 'Directory exists and is a symlink'; exit 1; }
|| cd "$dir"
【问题讨论】:
-
您是否担心攻击者可能用符号链接替换现有目录,或者他/她可能创建符号链接,或两者兼而有之?
-
来自有关 -h 的测试手册页:保留此运算符是为了与该程序的先前版本兼容。不要依赖它的存在;请改用 -L。
-
@WilliamPursell:有趣……我的 sh(1) 手册页正好相反:»-L file 如果文件存在并且是符号链接,则为真。保留此运算符是为了与此程序的先前版本兼容。不要依赖它的存在;改用 -h。« man bash(1) 没有提到两者之间的任何区别。
-
@AdamLiss:两者都有。他可能会做任何事情来欺骗我进入错误的目录。创建一个单一的如果应该就足够了,但是当他在检查之后但在更改到目录之前用符号链接替换现有目录时,我可能会在其他地方结束。
-
@knittl pubs.opengroup.org/onlinepubs/009695399 开放组规范似乎没有表明 -h 和 -L 之间有任何区别。
标签: security bash shell symlink race-condition