| 安全编程: 避免竞争条件(4) |
|
作者:网络 文章来源:转载 点击数: 更新时间:2006-1-19 |
| [ 字体:缩小 正常 放大 | 双击自动滚屏 ] |
请选择合适的字体颜色:
|
|
如果您正在编写 shell 脚本,那么可以使用管道,或者在用户的主目录存入临时文件。根本不要使用 /tmp 或 /var/tmp 目录;普通的 shell 通常无法支持文件描述符,所以临时文件清除器(tmpfile cleaners)最终将使它们失败。如果没有临时文件清除器,而且您只是必须在 /tmp 中创建临时文件,那么至少要使用 mktemp(1) 来防止更明显的攻击,因为 mktemp(1)(不是 mktemp(3))将使用 O_EXCL 来防止典型的竞争条件攻击。您可能做的最糟糕事情通常也是最令人不安的事:假定“$$”没有被攻击者猜出来,并且只是将信息重定向到这类文件;那么在创建时就不会按要求使用 O_EXCL 模式。攻击者可以简单地预创建类似的文件,或者反复创建和删除它们,最终接管程序。这样,类似的 shell 脚本几乎肯定有一个严重的缺陷:
清单 4. 有缺陷的 shell 脚本
echo "This is a test" > /tmp/test$$ # DON'T DO THIS.
不要再次使用临时文件名称(即不要删除和重新创建文件),不管您最初是如何获得“安全的”临时文件名称。攻击者都有可能观察到原始的文件名称,并在您第二次重新创建它时非法控制它。当然,要始终使用合适的文件权限。
做好自己的清理工作,或者通过使用退出处理器,或者利用 UNIX 文件系统语义,在创建后立即 unlink() 该文件,以便在清除目录条目的同时仍然可以访问该文件,直到指向它的最后一个文件描述符被关闭。于是,您就可以在自己的程序中通过传送文件描述符来访问该文件。对代码维护来说,解除文件的链接有很多好处:不管您的程序是怎样崩溃的,文件都会被自动删除。它还降低了维护者不安全地使用文件名的可能性(改为使用文件描述符)。立即解除链接也有一个小问题,即这使得管理员查看磁盘空间使用情况的难度稍有增加。
使这些对策成为操作系统的一部分已经取得了一些成功,尽管它们当前还没有被广为使用。要获得更多资料,请参阅参考资料列表中关于来自 OpenWall 项目的 Solar Designer 的 Linux 内核补丁、RaceGuard,以及 Eugene Tsyrklevich 和 Bennet Yee 的工作链接。
上一页 [1] [2]
|
|
| 文章录入:54iter 责任编辑:54iter |
上一篇文章: 安全编程: 避免竞争条件(3) 下一篇文章: 安全编程: 避免竞争条件(5) |
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |