查看: http://www.kernel.org/doc/man-pages/online/pages/man2/access.2.html
警告:使用access()检查用户是否有权使用 例如,打开 使用open(2)实际执行此操作之前的文件会创建一个安全漏洞,因为 用户可能会利用检查和打开之间的短时间间隔 要操纵它的文件。出于这个原因,使用此系统调用 应该避免。 (在刚才描述的例子中,一个更安全的替代方案会 是暂时将进程的有效用户ID切换为真实ID和 然后打开(2)。)
也可以看看:
http://www.csl.sri.com/~ddean/papers/usenix04.pdf
access()有什么问题?
从我系统的手册页:
警告:使用access()来检查用户是否有权使用例如在使用open(2)实际执行此操作之前打开文件创建安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔操纵它。因此,应避免使用此系统调用。 (在刚才描述的示例中,更安全的替代方法是将进程的有效用户ID临时切换为真实ID,然后调用open(2)。)
因此,问题在于它创建了竞争条件,可以被用户利用来获取对其他文件的访问权限。
想象一下以下示例场景。我创建了一个文件 /tmp/file 我被允许写。然后,你的uid-0程序调用 access() 在向我提供写入权限之前,检查是否允许我打开此文件进行写入。
/tmp/file
access()
在呼叫之间的短距离 access() 和 open() ,我可以删除 /tmp/file 并用符号链接替换它 /etc/crontab 。我现在可以让系统运行我喜欢的任何程序,因为应用程序很乐意给我写入权限 /etc/crontab 。
open()
/etc/crontab
Linux Man页面清楚 介绍 它
的 警告 强> :使用 的 access() 强> 检查用户是否有权(例如,打开) 使用open(2)实际执行此操作之前的文件会创建一个安全漏洞,因为 的 用户可能会利用检查和打开之间的短时间间隔 要操纵它的文件 强> 。出于这个原因,使用此系统调用 应该避免。
另请注意。出于安全原因,安全漏洞不容易被公众访问。