【问题标题】:access(2) system call security issueaccess(2) 系统调用安全问题
【发布时间】:2013-01-15 07:40:50
【问题描述】:

access(2) 手册页说,

注意事项 Access() 是一个潜在的安全漏洞,不应使用。

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

【问题讨论】:

  • 另一个问题:如果是这么大的安全问题,为什么还会存在?如果它永远不应该被使用,那么最好立即删除它并让任何确实使用它的程序崩溃,因为否则会存在安全漏洞?

标签: unix


【解决方案1】:

来自我系统的手册页:

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

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

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

在调用access()open() 之间的短暂空间中,我可以删除/tmp/file 并将其替换为指向/etc/crontab 的符号链接。我现在可以让系统运行我喜欢的任何程序,因为该应用程序很乐意为我提供对 /etc/crontab 的写访问权限。

【讨论】:

  • > 应用程序将很乐意为我提供对/etc/crontab 的写入权限如何?为什么open 不返回EACCES
  • > 应用程序会很乐意为我提供对/etc/crontab 的写访问权限如何?为什么open 不返回EACCES
【解决方案2】:

Linux 手册页清晰 describesit

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

还要注意。出于安全原因,公众不容易接触到安全漏洞。

【讨论】:

  • 查看我的答案以获取示例可利用场景。
【解决方案3】:

查看: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()?

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多