安全でない一時ファイルの作成

安全でない一時ファイルの作成

説明

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) では、コンテキストを正常に終了するとファイルも削除されます。

参考資料