访问()有什么问题?

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

我从man page访问引用(2):

警告 :使用access ()检查用户是否被授权在实际上打开文件之前,使用open (2)会创build安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔操纵它。 出于这个原因,应该避免使用这个系统调用

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

这仅仅是Set-user-ID和set-group-ID应用程序的一个安全问题。 对于作为用户本身运行的应用程序,没有任何威胁,因为操作系统会被操作系统拒绝。

考虑这种情况:你有一个UNIX程序作为root通过set-user-id运行。 该程序使用access来检查另一个用户的文件权限,然后以root用户身份运行该文件,但前提是权限检查成功。 比方说这个程序叫做securerun ,你可以这样运行它:

 securerun myfile 

攻击者可以利用这个算法来制作一个利用这个安全漏洞的程序:

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

如果攻击者获得了正确的时间,那么你的securerun会检查旧的xyz上的执行权限,但是它会运行新的xyz ,这个黑客不应该运行的副本。 由于检查和执行之间有一个很短的时间窗口,如果攻击者在一个循环中多次尝试他的策略,他肯定会在某个时候获得幸运。

这是一个经典的“使用时间检查时间”比赛条件。

典型的错误代码:

  • 使用access检查是否以用户的名义读取文件,以高权限运行的程序中
  • 这里差距很小
  • 打开文件

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

 ln -f secret_file.txt non_secret_file.txt 

然后open将打开秘密文件进行阅读,即使在检查完成时access检查失败了。