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

Tak*_*ato 2 unix

access(2) 手册页说,

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

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

who*_*oot 5

从我的系统手册页:

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

因此,问题在于它创建了一个竞争条件,用户可以利用它来访问其他文件。

想象一下以下示例场景。我创建了一个/tmp/file允许写入的文件。然后,您的 uid-0 程序调用access()以检查是否允许我打开此文件进行写入,然后再为我提供对该文件的写入权限。

在对access()和的调用之间的一小段空间中open(),我可以将/tmp/file其删除并用符号链接替换为/etc/crontab。我现在可以让系统运行我喜欢的任何程序,因为该应用程序很乐意为我提供对/etc/crontab.