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

安全基础
网管技术:常见BIOS报错信息及解决方法
分布式拒绝服务(DDOS)攻击及防范研究
四种宽带接入方式及其传输速率
网管必读 解读无线网络的七大安全困惑
经验:识别系统的非法进程及剿杀
全面清除系统垃圾的方法
QQ、网游等账号防盗防骗的实用小经验
上网前保证Windows XP系统安全的办法
七种DDoS攻击技术方法简介
硬盘与内存检测 四种查毒绝招
当网站注册时输入验证码总是不正确解决方法
不让自己的秘密留在别人的电脑中
IE崩溃遭难不求人 快速简单处理方法
损招 让应用程序莫名其妙地失效
不再弹广告 破除隐身僵尸木马的隐身妖术
利用QQ传播 网络欺骗“绑架”奥运会
渗透测试的攻与守 认清网络面临的问题
手动剿杀“上兴远程控制”木马
个人电脑防黑客入侵八准则
关注Windows系统服务中的安全隐患

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 31 ::
收藏到网摘: 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 位),任何人对它都有写权限 —— 包括攻击者 —— 可以删除或者重命名文件,导致各种各样的问题。例如,一个可信任的程序可