【问题标题】:What is wrong with access()? [duplicate]访问()有什么问题? [复制]
【发布时间】:2012-07-16 12:45:44
【问题描述】:

可能重复:
access() Security Hole

我引用手册页访问(2):

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

这是什么意思,在什么情况下会引起关注?

【问题讨论】:

    标签: c linux system-calls


    【解决方案1】:

    这只是 Set-user-ID 和 set-group-ID 应用程序的安全问题。对于以用户自身身份运行的应用程序,没有任何威胁,因为无论如何,相关操作都会被操作系统拒绝。

    考虑这种情况:您有一个通过 set-user-id 以 root 身份运行的 UNIX 程序。程序使用access检查另一个用户的文件权限,然后以root运行文件,但前提是权限检查成功。假设程序名为securerun,您按如下方式运行它:

    securerun myfile
    

    攻击者可以使用此算法使利用此安全漏洞的程序运行:

    • 写一个用户有执行权限的文件xyz
    • 启动两个线程,AB
    • 线程A 等待几毫秒,然后执行cp norunning xyzxyz 替换为攻击者想要运行但没有运行权限的文件
    • 线程B 调用securerun xyz

    如果攻击者幸运地把握了时机,您的securerun 将检查旧xyz 的执行权限,但它会运行新的xyz,即黑客所在的norunning 的副本不应该跑。由于检查和执行之间的时间窗口很短,如果攻击者在循环中多次尝试他的策略,那么他一定会在某个时候走运。

    【讨论】:

      【解决方案2】:

      典型错误代码:

      • 使用access 在以提升权限运行的程序中检查是否代表用户读取文件
      • 此处差距不大
      • 打开文件

      在“短间隙”期间,用户可能能够操作文件系统,例如:

      ln -f secret_file.txt non_secret_file.txt
      

      然后open 将打开秘密文件进行读取,即使在检查完成时链接已到位,access 检查也会失败。

      【讨论】:

        【解决方案3】:

        这是一个经典的"Time of check to time of use" 比赛条件。

        【讨论】:

        • 在什么情况下会引起关注?在open(2)ing 之前不要使用它来检查用户对文件的读/写权限......直接open(2) 文件。
        • @Conrad:来自access 手册页,“检查是使用进程的真实 UID 和 GID 完成的,而不是像实际尝试操作时那样使用有效 ID。这是为了允许 set-user-ID 程序轻松确定调用用户的权限”。因此,如果您只是open(2),那么您将打开您提升的 setuid 可以访问但用户不能访问的文件。问题是access实际上只适合通知用户他们是否可以访问该文件,而希望避免误用提升权限的人们错误地使用它。
        • 换句话说,手册页中的注释应该是这样的:“这是为了让 set-user-ID 程序在其预期超出access 提供的值时轻松创建可利用的缺陷”;- )
        • @SteveJessop,哦,谢谢。我错过了这种差异。仍然:只需使用open(2)。并酌情放弃您的特权... =)
        猜你喜欢
        • 2019-04-11
        • 2016-04-15
        • 2016-03-20
        • 2020-06-17
        • 1970-01-01
        • 2019-12-16
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多