可能重复:
access() 安全漏洞
我引用手册页访问(2):
警告:使用access () 来检查用户是否被授权,例如,在实际使用open (2) 之前打开文件会产生安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。因此,应避免使用此系统调用。
这是什么意思,在什么情况下会引起关注?
可能重复:
access() 安全漏洞
我引用手册页访问(2):
警告:使用access () 来检查用户是否被授权,例如,在实际使用open (2) 之前打开文件会产生安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。因此,应避免使用此系统调用。
这是什么意思,在什么情况下会引起关注?
这是一个经典的“检查时间到使用时间”的竞争条件。
这只是 Set-user-ID 和 set-group-ID 应用程序的安全问题。对于以用户本身身份运行的应用程序,没有威胁,因为无论如何操作系统都会拒绝相关操作。
考虑这种情况:您有一个root
通过 set-user-id 运行的 UNIX 程序。该程序用于access
检查另一个用户的文件权限,然后将文件作为 运行root
,但前提是权限检查成功。假设程序被调用securerun
,你运行它如下:
securerun myfile
攻击者可以使用以下算法使利用此安全漏洞的程序运行:
xyz
用户有执行权限的文件A
然后B
A
等待几毫秒,然后执行cp norunning xyz
替换xyz
攻击者想要运行但没有运行权限的文件B
调用securerun xyz
如果攻击者通过正确的时机获得幸运,您securerun
将检查 old 的执行权限xyz
,但它会运行 new ,这是黑客不应该运行xyz
的副本。norunning
由于检查和执行之间的时间窗口很短,如果攻击者在循环中多次尝试他的策略,那么他一定会在某个时候走运。
典型错误代码:
access
检查是否代表用户在以提升权限运行的程序中读取文件在“短间隙”期间,用户可能能够操作文件系统,例如:
ln -f secret_file.txt non_secret_file.txt
然后open
将打开秘密文件进行读取,即使如果在access
检查完成时链接已经到位,检查也会失败。