当前位置: 首页 > 图文教程 > 网络安全 > 安全基础 > 安全编程: 避免竞争条件(3)

安全基础
IE浏览器防黑十大秘籍,黑客也没招
网络工程师讲解系统安全漏洞的形成和防治
清除导致XP系统反复重启的新网银木马
识破QQ欺骗网络地址的几种方法汇总
安全基础知识 细说暴库的原理与方法
排除无线突然中断故障实例
强搜天线 搜出WiFi世界的安全漏洞
网管应用技巧 内网安全十大策略说明
如何修改局域网内部打印机的IP地址
如何找出IIS中隐藏的网站
EFS加密技术的概念分析及一次解密经过
提高Windows XP系统安全性要关闭的10种服务
PHPBB 2.0.22 MOD版最新注入漏洞
修复Windows系统忘记密码的9个高招
用SockOnline软件轻松突破端口限制
安全基础知识 最强0到33600端口详解
执行文件方式加密FLASH文件的解密方法
网吧被入侵后的应对解决方法
网页“黑手”如何攻击你的Windows系统
不要让别人读了你的信 谈私密数据保护

安全基础 中的 安全编程: 避免竞争条件(3)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 32 ::
收藏到网摘: n/a

遵守一些简单的规则,可以避免这些问题:

  不要使用 access(2) 来判定您是否可以做某件事情;通常攻击者会在调用 access(2) 后改变该情形,所以,通过调用 access(2) 获得的任何数据都可能不再是可信任的。换一种方式,将您的程序的特权设置得恰好是您想要的特权(例如,设置它的有效 id、文件系统 id 或者有效 gid,并通过 setgroups 来清除所有不需要的组);然后调用 open(2) 直接打开或创建您需要的文件。在类 Unix 系统上,open(2) 调用是原子的(与以前的 NFS 系统版本 1 和版本 2 不同)。

  当创建一个新文件时,使用 O_CREAT | O_EXCL 模式打开它(确保只有在创建一个新文件时调用 O_EXCL 才会成功)。最初只授与非常有限的权限;至少禁止任意的用户修改它!通常,这表示您需要使用 umask 和/或打开参数,将初始的访问权限局限于用户,也可以局限于用户所在的组。不要尝试在创建完文件后再去减少权限,因为这样做会导致竞争条件。在大部分类 Unix 系统上,只在打开文件时才检查权限,所以,攻击者可以在权限位(permission bit)允许时打开文件,并使该文件一直处于打开状态,不管权限如何改变。如果您愿意,还可以在以后将权限修改得更为开放。您还需要为打开失败做好准备。如果您绝对需要能打开某个新文件,那么应该创建一个循环:(1)创建一个“随机”的文件名,(2)使用 O_CREAT | O_EXCL 选项打开文件,
(3)成功打开文件后停止循环。

  当对文件的元信息进行操作时(比如修改它的所有者、对文件进行统计,或者修改它的权限位),首先要打开该文件,然后对打开的文件进行操作。只要有可能,应尽量避免使用获取文件名的操作,而是使用获取文件描述符的操作。这意味着要使用 fchown( )、fstat( ) 或 fchmod( ) 系统调用,而不使用取得文件名的函数,比如 chown()、chgrp() 和 chmod()。这样做将避免文件在您的程序运行时被替换(一种可能的竞争条件)。例如,如果您关闭一个文件,然后使用 chmod() 来修改其权限,那么攻击者很可能在这两个步骤之间移动或删除该文件,并创建指向另一个文件(比如 /etc/passwd)的符号链接。

  如果您的程序需要遍历文件系统(递归地遍历子目录),那么要提防攻击者可能会利用您正在遍历的目录结构。这种情形的一个常见的例子是,运行您的程序的管理员、系统程序或者有特权的服务器正在遍历的是由普通用户控制的文件系统部分。GNU 文件实用程序(fileutils)可以完成递归目录删除和目录移动,但是在版本 4.1 之前,当遍历目录结构时,它只是简单的遵循“..”这个特殊条目。当文件被删除时,攻击者可以将一个低层级的目录移动到更高的层级;fileutils 将会遵循“..”目录向上到更高层级,可能会一直到文件系统的根。通过在适当的时间删除目录,攻击者可以删除计算机中的任何文件。您不应该信任“..”或“.”,如果它们是由攻击者控制的。

  如果可以,不要将文件放置在可以由不信任用户共享的目录中。如果不是那样,那么应该尽量不使用在用户间共享的目录。不要介意创建只能由受信任的特定进程访问的目录。

  考虑避免使用传统的共享目录 /tmp 和 /var/tmp。如果您可以只使用一个管道,将数据从一个位置发送到另一个位置,那么您就可以简化程序,并排除潜在的安全问题。如果您确实需要创建一个临时文件,那么可以考虑将临时文件存储到其他地方。如果您不是在编写一个有特权的程序,那么这点尤其需要考虑;如果您的程序没有特权,那么将临时文件放置在用户目录内部会更安全一些(处理 root 用户时要当心,它以“/”作为其主目录)。这样,即使您没有“正确地”创建临时文件,攻击者通常也无法引发问题(因为攻击者不能利用用户主目录的内容)。

  但是,无法总是能够避免使用共享目录,所以我们需要理解如何处理 /tmp 等共享目录。这一点非常复杂,所以它应该自己占用一节!


共享目录(比如 /tmp)


共享目录基本概念

  如果您可信任的程序将要与潜在的非信任用户共享一个目录,那么要特别小心。在类 Unix 系统中,最常见的共享目录是 /tmp 和 /var/tmp,对这些目录的错误使用滋生了很多安全缺陷。最初创建 /tmp 目录,是将它作为一个创建临时文件的方便位置,通常不应该与任何其他人共享临时文件。不过,该目录很快它就有了第二个用途 —— 创建用户间共享对象的标准位置。由于这些标准目录有多种用途,使得操作系统难以加强访问控制来防止攻击;因此,您必须正确地使用它们,以避免受到攻击。

  当您使用共享目录时,确保目录和文件有适当的权限。显然,您需要限制哪些人可以对共享目录中创建的文件进行读写操作。但是,在类 Unix 系统中,如果多个用户都可以向同一目录添加文件,而且您计划通过一个有特权的程序向该目录添加文件,那么要确保为该目录设置“sticky”位。在一个普通的目录中(没有 sticky 位),任何人对它都有写权限 —— 包括攻击者 —— 可以删除或者重命名文件,导致各种各样的问题。例如,一个可信任的程序可