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。
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。