access()有什么问题?

时间:2012-07-17 14:49:16

标签: c linux system-calls

  

可能重复:
  access() Security Hole

我引用了man page access(2):

  

警告:使用访问()检查用户是否有权使用打开(2)创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。 因此,应避免使用此系统调用。

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

3 个答案:

答案 0 :(得分:10)

这是一种典型的"Time of check to time of use"种族条件。

答案 1 :(得分:3)

这仅适用于Set-user-ID和set-group-ID应用程序。对于以用户身份运行的应用程序,没有威胁,因为操作系统会拒绝相关操作。

请考虑以下情况:您通过set-user-id运行的UNIX程序为root。该程序使用access检查另一个用户的文件权限,然后将文件作为root运行,但前提是权限检查已成功。假设该程序名为securerun,您可以按如下方式运行:

securerun myfile

攻击者可以使用此算法制作利用此安全漏洞的程序:

  • 编写用户具有执行权限的文件xyz
  • 启动两个主题AB
  • 线程A等待几毫秒,并执行cp norunning xyz以使用攻击者想要运行的文件替换xyz,但没有运行权限来执行此操作
  • 主题B调用securerun xyz

如果攻击者通过正确的时机获胜,您的securerun会检查旧xyz的执行权限,但会运行新的xyznorunning的副本{1}}黑客不应该运行。由于在检查和执行之间有一个很短的时间窗口,如果他在一个循环中多次尝试他的策略,攻击者肯定会在某些时候变得幸运。

答案 2 :(得分:3)

典型的错误代码:

  • 使用access检查是否代表用户在使用提升权限运行的程序中读取文件
  • 这里的差距
  • 打开文件

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

ln -f secret_file.txt non_secret_file.txt

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