什么是错的访问()? [重复](What is wrong with access()? [du

2019-09-19 15:47发布

可能重复:
访问()的安全漏洞

我从人的页面访问(2)引用:

警告 :使用访问 ()来检查,如果用户被授权,例如,其实这样做使用前打开一个文件打开 (2)创建了一个安全漏洞,因为用户可能会利用检查和打开文件之间的时间间隔短操纵它。 出于这个原因,应避免使用该系统调用。

这是什么意思,以及在什么情况下会是一个问题?

Answer 1:

这仅仅是设置用户ID和设置组ID应用的安全问题。 对于运行在用户本身的应用没有任何威胁,因为有问题的操作将被操作系统反正被拒绝。

考虑这种情况:你有运行的UNIX程序root通过设置用户ID。 该程序使用access检查其他用户的文件权限,然后运行该文件为root ,但只有在权限检查已经成功。 比方说,该计划被称为securerun ,并运行它,如下所示:

securerun myfile

攻击者可以来利用这个安全漏洞来运行程序,使用该算法:

  • 写文件xyz其中的用户具有执行权限
  • 启动两个线程, AB
  • 线程A等待几毫秒,并且执行cp norunning xyz更换xyz与攻击者想要运行一个文件,但没有运行权限这么做
  • 螺纹B调用securerun xyz

如果攻击者通过获取他的时间权利得到幸运的话,你的securerun将检查旧的执行权限xyz ,但它会运行新的xyz ,副本norunning ,黑客不应该运行。 由于在检查和执行之间很短的时间窗,攻击者势必会得到幸运在某些时候,如果他试图在一个循环,他的策略很多次。



Answer 2:

这是一个典型的“检查到的使用时间时间”竞争状态。



Answer 3:

典型的错误代码:

  • 使用access ,以检查是否要宣读了用户的文件,在程序中使用提升的权限运行
  • 短间隔在这里
  • 打开文件

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

ln -f secret_file.txt non_secret_file.txt

然后open将打开秘密文件进行读取,即使它失败的access检查必须在检查已完成的时间已经到位的链接。



文章来源: What is wrong with access()? [duplicate]