SV.PCC.MODIFIED_BEFORE_CREATE

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

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

脆弱性とリスク

一時ファイルの脆弱性は、非常によく見られるセキュリティに関する指摘です。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 が提供しているアプリケーションセキュリティトレーニング教材。