access(2) man page说
警告Access()是一个潜在的安全漏洞,不应该使用。
但是安全漏洞是什么,为什么我不应该使用它?
从我的系统手册页:
警告:使用access()检查用户是否被授权,例如,在实际使用open(2)之前打开文件会创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操作它。由于这个原因,应该避免使用这个系统调用。(在刚刚描述的示例中,更安全的替代方法是暂时将进程的有效用户ID切换为真实ID,然后调用open(2)。)
所以,问题是它创建了一个竞争条件,用户可以利用它来访问其他文件。
想象下面的示例场景。我创建了一个允许写入的文件/tmp/file
。然后,你的id-0程序调用access()
来检查我是否被允许打开这个文件进行写入,然后才给我写权限。
在调用access()
和open()
之间的短空间中,我可以删除/tmp/file
并将其替换为指向/etc/crontab
的符号链接。我现在可以让系统运行任何我喜欢的程序,因为应用程序会很高兴地给我对/etc/crontab
的写访问权。
Linux手册页清楚地描述了它
Warning: Using
access()
检查用户是否被授权,例如:打开在使用open(2)执行此操作之前的文件会创建一个安全漏洞,因为用户可能会利用检查和打开之间的短时间间隔操作文件。为此,使用此系统调用应该避免。
也注意。
查看:http://www.kernel.org/doc/man-pages/online/pages/man2/access.2.html
警告:使用access()检查用户是否被授权例,开放在使用open(2)执行此操作之前的文件会创建一个安全漏洞,因为用户可能会利用检查和打开之间的短时间间隔操作它的文件。为此,使用此系统调用应该避免。(在刚刚描述的例子中,一个更安全的替代方案会将进程的有效用户ID暂时切换为真实ID和然后调用open(2)
参见:
http://www.csl.sri.com/ddean/论文/usenix04.pdf
access()有什么问题?