可能重复:
access() Security Hole
我引用了man page access(2):
警告:使用访问()检查用户是否有权使用打开(2)创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。 因此,应避免使用此系统调用。
这是什么意思,在什么情况下会引起关注?
答案 0 :(得分:10)
这是一种典型的"Time of check to time of use"种族条件。
答案 1 :(得分:3)
这仅适用于Set-user-ID和set-group-ID应用程序。对于以用户身份运行的应用程序,没有威胁,因为操作系统会拒绝相关操作。
请考虑以下情况:您通过set-user-id运行的UNIX程序为root
。该程序使用access
检查另一个用户的文件权限,然后将文件作为root
运行,但前提是权限检查已成功。假设该程序名为securerun
,您可以按如下方式运行:
securerun myfile
攻击者可以使用此算法制作利用此安全漏洞的程序:
xyz
A
和B
A
等待几毫秒,并执行cp norunning xyz
以使用攻击者想要运行的文件替换xyz
,但没有运行权限来执行此操作B
调用securerun xyz
如果攻击者通过正确的时机获胜,您的securerun
会检查旧xyz
的执行权限,但会运行新的xyz
,norunning
的副本{1}}黑客不应该运行。由于在检查和执行之间有一个很短的时间窗口,如果他在一个循环中多次尝试他的策略,攻击者肯定会在某些时候变得幸运。
答案 2 :(得分:3)
典型的错误代码:
access
检查是否代表用户在使用提升权限运行的程序中读取文件在“短距离”期间,用户可能能够操纵文件系统,例如:
ln -f secret_file.txt non_secret_file.txt
然后open
将打开秘密文件进行阅读,即使检查完成时链接已经到位access
检查也会失败。