不安全的临时文件¶
ID: py/insecure-temporary-file
Kind: problem
Security severity: 7.0
Severity: error
Precision: high
Tags:
- external/cwe/cwe-377
- security
Query suites:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
创建临时文件名(如tempfile.mktemp
和os.tempnam
)的函数从根本上来说是不安全的,因为它们不能确保对具有返回的临时名称的文件的独占访问。这些函数返回的文件名保证在创建时是唯一的,但必须在单独的操作中打开文件。无法保证创建和打开操作会原子地发生。这为攻击者在打开文件之前干扰文件提供了机会。
请注意,自 Python 2.3 以来mktemp
已被弃用。
建议¶
将mktemp
的使用替换为tempfile
模块中一些更安全的函数,例如TemporaryFile
。如果文件旨在从其他进程访问,请考虑使用NamedTemporaryFile
函数。
示例¶
以下代码片段打开一个临时文件并向其中写入一组结果。由于文件名是使用mktemp
创建的,因此另一个进程可能在使用open
打开文件之前访问此文件。
from tempfile import mktemp
def write_results(results):
filename = mktemp()
with open(filename, "w+") as f:
f.write(results)
print("Results written to", filename)
通过将代码更改为使用NamedTemporaryFile
,文件将立即打开。
from tempfile import NamedTemporaryFile
def write_results(results):
with NamedTemporaryFile(mode="w+", delete=False) as f:
f.write(results)
print("Results written to", f.name)
参考¶
Python 标准库:tempfile.mktemp.
通用弱点枚举:CWE-377.