从我的系统手册页:
警告:使用 access() 来检查用户是否被授权,例如,在实际使用 open(2) 之前打开文件会创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔操纵它。因此,应避免使用此系统调用。(在刚刚描述的示例中,更安全的替代方法是将进程的有效用户 ID 临时切换为真实 ID,然后调用 open(2)。)
因此,问题在于它创建了一个竞争条件,用户可以利用它来访问其他文件。
想象一下以下示例场景。我创建了一个/tmp/file
允许写入的文件。然后,您的 uid-0 程序调用access()
以检查是否允许我打开此文件进行写入,然后再为我提供对该文件的写入权限。
在对access()
和的调用之间的一小段空间中open()
,我可以将/tmp/file
其删除并用符号链接替换为/etc/crontab
。我现在可以让系统运行我喜欢的任何程序,因为该应用程序很乐意为我提供对/etc/crontab
.