python os 模块文档中的代码示例如何创建安全漏洞?

How does the code example in the python os module documentation create a security hole?

os 模块的 documentation 做出以下断言:


备注

使用 access() 检查用户是否被授权,例如在实际打开文件之前使用 open() 会创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操作它。最好使用 EAFP 技巧。例如:

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
    return fp.read()
return "some default data"`

最好写成:

try:
    fp = open("myfile")
except PermissionError:
    return "some default data"
else:
    with fp:
        return fp.read()

我不明白用户如何 "might exploit" 间隔。如果 open 将引发异常,我不确定 os.access 将如何防止引发该异常。同样,如果用户以某种方式操作文件,为什么不在 EAFP 版本的 open 命令之前执行文件操作?

我知道第二个版本可能更强大,因为 os.access 可能无法正确识别可能引发 PermissionError 的条件,但我不明白 LBYL 版本较少 安全 。有人可以解释一下吗?

虽然使用 access 的代码不安全,但第二个代码片段并未解决安全问题。这些文档应该更改。

os.access的目的是在真实用户id和有效用户id不同的情况下,测试真实用户id是否有访问文件的权限。 os.access 片段的危险在于用户可以将文件 access returns True 放置在被测试的位置,然后将其换出文件 access 会返回 False for,绕过检查。由于 open 使用有效用户 ID,open 调用仍然有效,绕过 access 检查。

第二个片段没有解决这个问题。现在用户甚至不需要通过切换器。第二个片段的任何部分都不会检查真实用户 ID。