EN JP CN

SV.PCC.MODIFIED_BEFORE_CREATE

SV.PCC.MODIFIED_BEFORE_CREATE

一時ファイル名の安全でない変更

一時ファイルをセキュアでない方法で作成または使用すると、アプリケーションおよびシステムデータが攻撃にさらされたままになる可能性があります。アプリケーションに危険なデータが挿入されたり、一時ファイルに保存されたデータへのアクセス、改変、または汚染が発生する可能性があります。SV.PCC.MODIFIED_BEFORE_CREATE チェッカーは、一時ファイル名バッファーが変更されてから CreateFile の呼び出しが行われる状況にフラグを立てます。

脆弱性とリスク

一時ファイルの脆弱性は、非常によくあるセキュリティ上の問題です。 Mitre Corp. のセキュリティアラートデータベースは、200 件を超えるこの種のレポートを挙げています。一時ファイルの脆弱性が悪用されて、権限の昇格または重要情報の操作が行われる可能性があります。

軽減と防止

この脆弱性を回避するには、次の操作を実行します。

  • GetTempPath および GetTempFileName を使用して、ランダムな名前を作成するようにしてください。
  • 一時ファイルに最低権限設定があるかどうかをレビューします。

修正コード例

1     //  Gets the temp path env string (no guarantee it's a valid path).
2    dwRetVal = GetTempPath(MAX_PATH,          // length of the buffer
3                           lpTempPathBuffer); // buffer for path 
4    if (dwRetVal > MAX_PATH || (dwRetVal == 0))
5    {
6        PrintError(TEXT("GetTempPath failed"));
7        if (!CloseHandle(hFile))
8        {
9            PrintError(TEXT("CloseHandle(hFile) failed"));
10           return (7);
11       }
12       return (2);
13   }

14   //  Generates a temporary file name. 
15   uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files
16                             TEXT("DEMO"),     // temp file name prefix 
17                             0,                // create unique name 
18                             szTempFileName);  // buffer for name 
19   if (uRetVal == 0)
20   {
21       PrintError(TEXT("GetTempFileName failed"));
22       if (!CloseHandle(hFile))
23       {
24           PrintError(TEXT("CloseHandle(hFile) failed"));
25           return (7);
26       }
27       return (3);
28   }
29   //  Creates the new file to write to for the upper-case version.
30   hTempFile = CreateFile((LPTSTR) szTempFileName, // file name 
31                          GENERIC_WRITE,        // open for write 
32                          0,                    // do not share 
33                          NULL,                 // default security 
34                          CREATE_ALWAYS,        // overwrite existing
35                          FILE_ATTRIBUTE_TEMPORARY, // temporary storage 
36                          NULL);                // no template 
37   if (hTempFile == INVALID_HANDLE_VALUE) 
38   { 
39       PrintError(TEXT("Second CreateFile failed"));
40       if (!CloseHandle(hFile))
41       {
42           PrintError(TEXT("CloseHandle(hFile) failed"));
43           return (7);
44       }
45       return (4);
46   } 

これは、一時ファイル作成での良い慣行に従っているコードの例です。セキュアな一時ファイルの名前を使用すると、アプリケーションまたはシステムデータを攻撃にさらしたままにするという危険を冒すことはありません。