access(2)手册页说,
CAVEAT Access()是一个潜在的安全漏洞,永远不应该使用。
但是什么是安全漏洞以及为什么我不应该使用它?
答案 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)。)
另见: