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



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()有什么问题?

最新更新