安全编程: 避免竞争条件(5)

发表于:2007-05-25来源:作者:点击数: 标签:安全编程信号处理竞争条件
信号处理 在信号中也会发生竞争条件。程序可以注册处理各种类型的信号,但是信号可能会在最不合适的时候出现,包括您正在处理另一个信号的时候。在一个信号处理器内部,您通常应该做的一件事是,设置一个将在以后处理的全局标记。还有几个操作可以在信号中
信号处理

  在信号中也会发生竞争条件。程序可以注册处理各种类型的信号,但是信号可能会在最不合适的时候出现,包括您正在处理另一个信号的时候。在一个信号处理器内部,您通常应该做的一件事是,设置一个将在以后处理的全局标记。还有几个操作可以在信号中安全地完成,但不是很多,而且在处理信号之前,您必须对它有深入的理解。那是因为只有一些系统调用可以安全地调用内部信号:只有可重入的(re-entrant)或者不被信号中断的调用才可以被安全地调用。您可以调用库函数,但是只有极少数函数是被安全调用的;在一个信号处理器中调用大部分函数是出问题的主要原因,比如 free() 或者 syslog()。要获得更多资料,请阅读 Michal Zalewski 的名为 “Delivering Signals for Fun and Profit”的一篇文章。但是您最好只在一个信号处理器中设置标记(别的什么都不做),这胜过尝试创建复杂的处理器。


结束语

  本文讨论了什么是竞争条件,以及它为什么会导致安全问题。我们已经分析了如何正确地创建锁文件及其替代者。还研究了如何处理文件系统,并重点讨论了如何处理共享目录,以完成在 /tmp 目录下创建临时文件等一些常见任务。我们还简要地研究了信号处理,至少充分了解了使用它们的一种安全方法。

  当然,重要的是保护您的程序不受竞争条件的破坏。但是,当前的大部分程序都不能自己完成所有的事情;它们必须向其他程序库和程序(比如命令解释程序和 SQL 服务器)发出请求。攻击程序使用的最常见方式之一就是利用这些程序向其他程序发出请求的方式。所以,接下来我们将分析如何在不暴露缺陷的同时去调用其他程序。


参考资料

  您可以参阅本文在 developerWorks 全球站点上的 英文原文。


  阅读 developerWorks 上 David 的其他安全编程专栏文章。


  David 的 Secure Programming for Linux and Unix HOWTO(Wheeler,2003 年 3 月)一书详细地介绍了如何开发安全的软件。


  Jarno Huuskonen 于 2001 年 7 月 9 日发表了 Bugtraq email "Tripwire temporary files",给出了关于 Tripwire 1.3.1, 2.2.1 和 2.3.0 symlink / 竞争条件问题的资料。这是 CVE-2001-0774。


  CVE-2002-0435 指出了 GNU 文件实用程序中的竞争条件。


  可以在线获得 Perl 5.8 documentation of File::Temp。


  Kris Kennaway's posting to Bugtraq about temporary files(2000 年 12 月)深入讨论了临时文件。


  Michael Zalewski 的 Delivering Signals for Fun and Profit: Understanding, exploiting and preventing signal-handling related vulnerabilities(2001 年 5 月)描述了信号处理,这是引入竞争条件的另一种方式。


  Michal Zalewski 的 Problems with mkstemp() 讨论了源于自动清除临时目录的安全性问题。


  Security section of the GNOME Programming Guidelines 给出了关于如何创建临时文件的合理建议。


  Single Unix Specification version 3, 2004 版,a.k.a. IEEE Std 1003.1,2004 版,是对“类 UNIX”系统必须做什么的通用说明。


  Solar Designer 的 Linux kernel patch from the OpenWall project 引入了一些有趣的安全对策,包括预防有限的一组文件系统竞争条件攻击的附加访问限制。更具体地讲,它限制用户使用在某些目录下创建的不受信任的符号链接,并限制用户创建指向他们不能读写访问的文件的硬链接。


  Crispin Cowan、Steve Beattie、Chris Wright 和 Greg Kroah-Hartman 合著的 RaceGuard: Kernel Protection From Temporary File Race Vulnerabilities 一文来自 Usenix Association 的 2001 Usenix Security Symposium,介绍了 RaceGuard 这一 Linux 内核修改,它通过在运行时检测某些攻击来防范一些竞争条件攻击。


  Eugene Tsyrklevich 和 Bennet Yee 的 Dynamic Detection and Prevention of Race Conditions in File Aclearcase/" target="_blank" >ccesses 来自 12th USENIX Security Symposium(2003 年 8 月),描述了一种在文件系统中防范竞争条件的方法。他们修改了 OpenBSD 内核,以便在发现某个文件系统操作会干扰另外一个操作时,临时挂起该操作,从而允许第一个进程对某个文件对象的访问继续进行。


  在 developerWorks Linux 专区中,可以找到更多为 Linux 开发者准备的参考资料。


  可以从 developerWorks 的 Speed-start your Linux app 专区下载能够运行于 Linux 之上的、经过精挑细选的 developerWorks Subscription 产品的免费测试版本,其中包括 WebSphere® Studio Application Developer、WebSphere Application Server、DB2® Universal Database、Tivoli® Access Manager 和 Tivoli Directory Server。想更快速地开始上手,请参阅针对各种产品的 how-to 文章和技术支持。


  通过参与 developerWorks blogs 加入到 developerWorks 社区。


  可以在 Developer Bookstore Linux 专栏中定购 打折出售的 Linux 书籍。

原文转自:http://www.ltesting.net