access()安全漏洞

时间:2011-10-28 04:32:29

标签: c security exploit

我一直在做一些shell编写,并且遇到了一个建议访问()来检查文件是否存在,可以读取等等。看起来超级易于实现并且比stat()更快。当我开始查看它的手册页时,我注意到它不建议使用,因为它可能导致安全漏洞。手册页说明了这一点:

  

使用access()检查用户是否有权获得例如打开一个文件   在实际使用open之前(2)创建一个安全漏洞,   因为用户可能利用之间的短时间间隔   检查并打开文件来操纵它。

有谁知道如何利用它,或者它是否只与检查文件后使用open()有关?我知道有很多人说使用stat()代替,但是access()很容易实现,特别是对于我用它的shell。

由于

3 个答案:

答案 0 :(得分:5)

这是TOCTOU比赛(更新时间检查时间)。恶意用户可以将他有权访问的文件替换为符号链接,使其无法访问access()open()之间无权访问的内容。使用faccessat()fstat()。一般情况下,打开一个文件,并在其上使用f*()函数(例如:fchown(),...)。

答案 1 :(得分:0)

我能想到的一件事,虽然看起来很弱 - access()使用真实的而不是有效的uid和gid。这应该允许setuid程序(常规用户执行但获得所有者权限的程序)检查调用用户是否可以读取文件,以防止无意中让该用户访问他们应该无法读取的文件,也许通过使用一些符号链接或硬链接技巧。我找不到任何证据证明这是可能的,或者使用stat()这是不可能的,但想象一下这种情况:

user executes program
program is setuid, immediately gets all privs of root
program checks file1 to ensure that user has access
file1 is a hardlink to file2, which user has access to
user changes file1 to hardlink to file3 (/etc/shadow or something like that)
program reads file1 and does something to it (print, convert, whatever)
user now has access to a file they shouldn't

答案 2 :(得分:0)

该模式似乎是调用access()stat()来确定您是否可以打开文件,然后在获得许可后再打开它。

相反,通常更好的方法是继续尝试打开它,然后检查尝试是否成功(如果没有,为什么)。这样可以避免检查和尝试打开文件之间的时间间隔。