一个有关竞争条件的攻击

    了解什么是竞争条件,以及它们为什么会引发安全问题。本文向您展示了如何在类 UNIX® Unix-like)系统中处理常见的竞争条件,包括如何正确地创建锁文件、锁文件的替代者,如何处理文件系统,以及如何处理共享目录(特别是如何在 /tmp 目录下正确创建临时目录)。需要您对信号处理稍有了解。

    通过一个偷窃而来的口令,Mallory 成功地登录到一台运行 Linux 的重要服务器。其帐号是一个非常受限的帐号,但是 Mallory 知道如何使用它来制造麻烦。Mallory 安装并运行了一个行为非常奇怪的小程序,该程序使用多个进程在 /tmp 目录下快速地创建和删除很多不同的符号链接文件。(符号链接文件也称为 symlink,是一种简单的文件,当被访问时,它会将请求重定向到另一个文件。)Mallory 的程序不停地创建和删除很多指向同一特殊文件(/etc/passwd,口令文件)的不同符号链接文件。

这台重要的服务器的安全措施之一是,它每天都运行 Tripwire —— 具体地说,是较老的 2.3.0 版本。Tripwire 是一个检测重要文件是否被篡改的安全程序。与很多程序一样,Tripwire 启动时会尝试着创建一个临时文件。Tripwire 会查看并断定不存在名为/tmp/twtempa19212的文件,所以看起来这是一个合适的临时文件名称。但是在 Tripwire 完成检查后,Mallory 的程序就会使用该名称创建一个符号链接文件。这不是偶然的;Mallory 程序的设计目标就是创建最有可能为 Tripwire 所使用的文件名。然后 Tripwire 就会打开该文件,开始写入临时信息,但不用创建新的空文件,Tripwire 现在正在重写口令文件!从那时起,任何人 —— 甚至是管理员 —— 都不能登录到该系统,因为口令文件已经被破坏了。更糟的是,Mallory 的攻击完全可以覆盖所有文件,包括服务器上存储的重要数据。

以上片段摘自:http://www.ibm.com/developerworks/cn/linux/l-sprace.html

     这是我发现的一篇解释竞争条件的一个非常好的例子。操作系统习题中有这样一道题,

“对于多线程程序来说,对共享数据加锁可以有效避免冲突。现在有一个共享数据和多个线程,线程只有获得锁才能访问共享数据,问这样还会出现“竞争条件”(race condition) 吗?”。看了上面的例子,我豁然理解,因为有可能在你使用完共享数据(上文中的临时文件)短暂地释放锁后,有其他进程篡改了共享对象内容,或是像上面的攻击似地,利用系统使用临时文件名作为参数来进行写操作的不严谨的地方,在tripwire创建完临时文件后,创建一个链接到系统文件来破坏系统。至于自己多线程中出现这种情况就是编程者不细心了~

    文章中最后说,解决那个攻击问题的办法就是不要用文件名来修改你创建的文件,因为你无法保证那个名字还对应着你创建的文件。解决方法之一就是用文件句柄之类的东西唯一标示一个文件。

你可能感兴趣的:(一个有关竞争条件的攻击)