access(2)系统调用安全问题

时间:2013-01-15 07:40:51

标签: unix

access(2)手册页说,

  

CAVEAT        Access()是一个潜在的安全漏洞,永远不应该使用。

但是什么是安全漏洞以及为什么我不应该使用它?

3 个答案:

答案 0 :(得分:4)

Linux Man页面明确describes

  

警告:使用 access() 检查用户是否有权(例如,打开)          使用open(2)实际执行此操作之前的文件会创建一个安全漏洞,因为          用户可能会利用检查和打开之间的短时间间隔          要操纵它的文件。出于这个原因,使用此系统调用          应该避免。

另请注意。出于安全原因,安全漏洞无法轻易公开。

答案 1 :(得分:4)

从我系统的手册页:

  

警告:使用access()检查用户是否有权(例如,在使用open(2)实际执行此操作之前打开文件)会产生安全漏洞,因为用户可能会利用检查之间的短时间间隔打开文件来操纵它。因此,应避免使用此系统调用。 (在刚刚描述的示例中,更安全的替代方法是将进程的有效用户ID临时切换为真实ID,然后调用open(2)。)

所以,问题在于它创建了竞争条件,可以被用户利用来获取对其他文件的访问权限。

想象一下以下示例场景。我创建了一个允许我写的文件/tmp/file。然后,你的uid-0程序调用{​​{1}}来检查我是否被允许打开这个文件进行写入,然后再向我提供写入权限。

access()access()来电之间的短距离内,我可以移除open()并将其替换为/tmp/file的符号链接。我现在可以让系统运行我喜欢的任何程序,因为应用程序很乐意给我/etc/crontab的写入权限。

答案 2 :(得分:0)

退房: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/papers/usenix04.pdf

What is wrong with access()?