7

可能重复:
access() 安全漏洞

我引用手册页访问(2):

警告:使用access () 来检查用户是否被授权,例如,在实际使用open (2) 之前打开文件会产生安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。因此,应避免使用此系统调用。

这是什么意思,在什么情况下会引起关注?

4

3 回答 3

9

这是一个经典的“检查时间到使用时间”的竞争条件。

于 2012-07-17T14:52:40.050 回答
4

这只是 Set-user-ID 和 set-group-ID 应用程序的安全问题。对于以用户本身身份运行的应用程序,没有威胁,因为无论如何操作系统都会拒绝相关操作。

考虑这种情况:您有一个root通过 set-user-id 运行的 UNIX 程序。该程序用于access检查另一个用户的文件权限,然后将文件作为 运行root,但前提是权限检查成功。假设程序被调用securerun,你运行它如下:

securerun myfile

攻击者可以使用以下算法使利用此安全漏洞的程序运行:

  • 写一个xyz用户有执行权限的文件
  • 启动两个线程,A然后B
  • 线程A等待几毫秒,然后执行cp norunning xyz替换xyz攻击者想要运行但没有运行权限的文件
  • 线程B调用securerun xyz

如果攻击者通过正确的时机获得幸运,您securerun将检查 old 的执行权限xyz,但它会运行 new ,这是黑客不应该运行xyz的副本。norunning由于检查和执行之间的时间窗口很短,如果攻击者在循环中多次尝试他的策略,那么他一定会在某个时候走运。

于 2012-07-17T15:05:28.863 回答
3

典型错误代码:

  • 用于access检查是否代表用户在以提升权限运行的程序中读取文件
  • 这里的小间隙
  • 打开文件

在“短间隙”期间,用户可能能够操作文件系统,例如:

ln -f secret_file.txt non_secret_file.txt

然后open将打开秘密文件进行读取,即使如果在access检查完成时链接已经到位,检查也会失败。

于 2012-07-17T15:06:05.290 回答