SV.PCC.MISSING_TEMP_FILENAME
一時ファイル名の欠落
一時ファイルをセキュアでない方法で作成または使用すると、アプリケーションおよびシステムデータが攻撃にさらされたままになる可能性があります。アプリケーションに危険なデータが挿入されたり、一時ファイルに保存されたデータへのアクセス、改変、または汚染が発生する可能性があります。一時ファイル名の問題を回避するには、GetTempPath とGetTempFileName の両方を CreateFile 関数呼び出しより優先させる必要があります。SV.PCC.MISSING_TEMP_FILENAME チェッカーは、GetTempPath だけが使用され、かつ一時ファイル名として誤って使用されている状況にフラグを立てます。
脆弱性とリスク
一時ファイルの脆弱性は、非常によく見られるセキュリティに関する指摘です。Mitre Corp. のセキュリティアラートデータベースには、このタイプの 200 件以上のレポートがリストされています。一時ファイルの脆弱性が悪用されて、権限の昇格または重要情報の操作が行われる可能性があります。
軽減と防止
この脆弱性を回避するには、次の操作を実行します。
- GetTempPath および GetTempFileName を使用して、ランダムな名前を作成するようにしてください。
- 一時ファイルに最低権限設定があるかどうかをレビューします。
修正コード例
コピー
// Gets the temp path env string (no guarantee it's a valid path).
dwRetVal = GetTempPath(MAX_PATH, // length of the buffer
lpTempPathBuffer); // buffer for path
if (dwRetVal > MAX_PATH || (dwRetVal == 0))
{
PrintError(TEXT("GetTempPath failed"));
if (!CloseHandle(hFile))
{
PrintError(TEXT("CloseHandle(hFile) failed"));
return (7);
}
return (2);
}
// Generates a temporary file name.
uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files
TEXT("DEMO"), // temp file name prefix
0, // create unique name
szTempFileName); // buffer for name
if (uRetVal == 0)
{
PrintError(TEXT("GetTempFileName failed"));
if (!CloseHandle(hFile))
{
PrintError(TEXT("CloseHandle(hFile) failed"));
return (7);
}
return (3);
}
// Creates the new file to write to for the upper-case version.
hTempFile = CreateFile((LPTSTR) szTempFileName, // file name
GENERIC_WRITE, // open for write
0, // do not share
NULL, // default security
CREATE_ALWAYS, // overwrite existing
FILE_ATTRIBUTE_TEMPORARY, // temporary storage
NULL); // no template
if (hTempFile == INVALID_HANDLE_VALUE)
{
PrintError(TEXT("Second CreateFile failed"));
if (!CloseHandle(hFile))
{
PrintError(TEXT("CloseHandle(hFile) failed"));
return (7);
}
return (4);
}
これは、一時ファイル作成での良い慣行に従っているコードの例です。セキュアな一時ファイルの名前を使用すると、アプリケーションまたはシステムデータを攻撃にさらしたままにするという危険を冒すことはありません。
関連チェッカー
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。