説明
tempfile.mktemp() はファイルを作成せず、利用可能な名前だけを返します。アプリケーションが開く前に別のプロセスがそのパスを占有できるため、この競合によってデータが露出したり、意図しないファイルを上書きしたりするおそれがあります。
想定される影響
- 情報漏えい: 一時ファイルの機密データに攻撃者がアクセスする可能性があります。
- データ改ざん: 一時ファイルの内容が変更されるおそれがあります。
- 権限昇格: パスの操作によって、アプリケーションの実行アカウントがアクセスできるリソースに影響する可能性があります。
対処方法
tempfile.mkstemp()またはtempfile.NamedTemporaryFile()で一時ファイルを安全に作成してください。- 一時ファイルへのアクセス権限を制限してください。
- 使用後は速やかに削除してください。
例
変更前
python
# 安全でない一時ファイルの作成
import tempfile
filename = tempfile.mktemp() # 競合の危険がある方法
tmp_file = open(filename, "w+")
変更後
tempfile.mkstempを使う例
python
# mkstempによる一時ファイルの作成
import tempfile
import os
fd, filename = tempfile.mkstemp()
try:
with os.fdopen(fd, "w+") as tmp_file:
tmp_file.write("Sensitive information")
finally:
# 使用後にファイルを削除します。
os.remove(filename)
tempfile.NamedTemporaryFileを使う例
python
# NamedTemporaryFileによる一時ファイルの作成
import tempfile
with tempfile.NamedTemporaryFile(delete=True) as tmp_file:
tmp_file.write(b"Sensitive information")
tmp_file.flush()
print(f"Temporary file created at {tmp_file.name}")
# 一時ファイルを使用
tmp_file.seek(0)
data = tmp_file.read()
# delete=Trueにより、一時ファイルは自動で削除されます。
説明:
- 変更前:
mktemp()が名前を返してからopen()でファイルを作成するまでに、別のプロセスがファイルやリンクを先に作成できます。 - 変更後:
mkstemp()とNamedTemporaryFile()は名前を返すだけでなく、安全にファイルを作成します。tempfile.NamedTemporaryFile(delete=True)では、コンテキストを正常に終了するとファイルも削除されます。