【发布时间】:2012-07-16 12:45:44
【问题描述】:
我引用手册页访问(2):
警告:使用 access() 检查用户是否有权,例如,在实际使用 open 打开文件之前打开文件>(2) 创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操作它。 因此,应避免使用此系统调用。
这是什么意思,在什么情况下会引起关注?
【问题讨论】:
标签: c linux system-calls
我引用手册页访问(2):
警告:使用 access() 检查用户是否有权,例如,在实际使用 open 打开文件之前打开文件>(2) 创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操作它。 因此,应避免使用此系统调用。
这是什么意思,在什么情况下会引起关注?
【问题讨论】:
标签: c linux system-calls
这只是 Set-user-ID 和 set-group-ID 应用程序的安全问题。对于以用户自身身份运行的应用程序,没有任何威胁,因为无论如何,相关操作都会被操作系统拒绝。
考虑这种情况:您有一个通过 set-user-id 以 root 身份运行的 UNIX 程序。程序使用access检查另一个用户的文件权限,然后以root运行文件,但前提是权限检查成功。假设程序名为securerun,您按如下方式运行它:
securerun myfile
攻击者可以使用此算法使利用此安全漏洞的程序运行:
xyz
A 和 B
A 等待几毫秒,然后执行cp norunning xyz 将xyz 替换为攻击者想要运行但没有运行权限的文件B 调用securerun xyz
如果攻击者幸运地把握了时机,您的securerun 将检查旧xyz 的执行权限,但它会运行新的xyz,即黑客所在的norunning 的副本不应该跑。由于检查和执行之间的时间窗口很短,如果攻击者在循环中多次尝试他的策略,那么他一定会在某个时候走运。
【讨论】:
典型错误代码:
access 在以提升权限运行的程序中检查是否代表用户读取文件在“短间隙”期间,用户可能能够操作文件系统,例如:
ln -f secret_file.txt non_secret_file.txt
然后open 将打开秘密文件进行读取,即使在检查完成时链接已到位,access 检查也会失败。
【讨论】:
这是一个经典的"Time of check to time of use" 比赛条件。
【讨论】:
open(2)ing 之前不要使用它来检查用户对文件的读/写权限......直接open(2) 文件。
access 手册页,“检查是使用进程的真实 UID 和 GID 完成的,而不是像实际尝试操作时那样使用有效 ID。这是为了允许 set-user-ID 程序轻松确定调用用户的权限”。因此,如果您只是open(2),那么您将打开您提升的 setuid 可以访问但用户不能访问的文件。问题是access实际上只适合通知用户他们是否可以访问该文件,而希望避免误用提升权限的人们错误地使用它。
access 提供的值时轻松创建可利用的缺陷”;- )
open(2)。并酌情放弃您的特权... =)