access(2) 手册页说,
CAVEAT Access() 是一个潜在的安全漏洞,不应使用。
但是什么是安全漏洞,为什么我不应该使用它?
从我系统的手册页:
警告:使用 access() 来检查用户是否被授权,例如,在使用 open(2) 实际打开文件之前打开文件会造成安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。因此,应避免使用此系统调用。(在刚刚描述的示例中,更安全的替代方法是暂时将进程的有效用户 ID 切换为真实 ID,然后调用 open(2)。)
因此,问题在于它创建了一个竞争条件,用户可以利用它来访问其他文件。
想象以下示例场景。我创建了一个/tmp/file
允许我编写的文件。然后,您的 uid-0 程序调用access()
检查是否允许我打开此文件进行写入,然后再向我提供对它的写入权限。
access()
在对and的调用之间的短暂空间中open()
,我可以将其删除/tmp/file
并用符号链接替换为/etc/crontab
. 我现在可以让系统运行我喜欢的任何程序,因为应用程序很乐意为我提供对/etc/crontab
.
Linux 手册页清楚地描述了它
警告:
access()
用于检查用户是否被授权,例如,在实际使用 open(2) 打开文件之前打开文件会造成安全漏洞,因为 用户可能会利用检查和打开文件之间的短时间间隔来操作它. 因此,应避免使用此系统调用。
还要注意。出于安全原因,公众不容易接触到安全漏洞。
查看:http ://www.kernel.org/doc/man-pages/online/pages/man2/access.2.html
警告:使用 access() 来检查用户是否被授权,例如,在使用 open(2) 实际打开文件之前打开文件会造成安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。因此,应避免使用此系统调用。(在刚刚描述的示例中,更安全的替代方法是暂时将进程的有效用户 ID 切换为真实 ID,然后调用 open(2)。)
也可以看看: