access()有什么问题?

Dod*_*ddy 6 c linux system-calls

可能重复:
access()安全漏洞

我引用man page access(2):

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

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

Dou*_*der 10

这是经典的"使用时间检查"竞赛条件.

  • @Conrad:来自`access`手册页,"检查是使用进程的真实UID和GID完成的,而不是像实际尝试操作时那样使用有效ID.这是为了允许set-user-ID程序轻松确定调用用户的权限".因此,如果您只是"打开(2)",那么您将打开升级后的setuid可以访问的文件,但用户却无法访问.问题是`access`实际上只适用于告知用户他们是否可以访问该文件,而人们错误地使用它来避免错误使用提升的权限. (2认同)

das*_*ght 4

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

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

securerun myfile
Run Code Online (Sandbox Code Playgroud)

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

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

如果攻击者运气好,时机正确,您securerun将检查旧的执行权限xyz,但它会运行新的,这是黑客不应该运行的xyz副本。norunning由于检查和执行之间的时间窗口很短,因此如果攻击者在循环中多次尝试其策略,那么他一定会在某个时候很幸​​运。