SV.BRM.HKEY_LOCAL_MACHINE

最小特権の原則に反する HKEY_LOCAL_MACHINE マクロの使用

HKEY_LOCAL_MACHINE マクロは、次の Microsoft Windows 関数の hkey パラメーターに使用しないでください。

  • RegConnectRegistry
  • RegCreateKey
  • RegCreateKeyEx
  • RegLoadKey
  • RegOpenKey
  • RegOpenKeyEx
  • SHRegCreateUSKey
  • SHRegOpenUSKey

同様に、前に HKEY_LOCAL_MACHINE をパラメーターに使用して開いたキーをこれらの関数で操作しないようにしてください。

SV.BRM.HKEY_LOCAL_MACHINE チェッカーは、これらの任意の関数で HKEY_LOCAL_MACHINE を hkey パラメーターとして使用する Windows システム呼び出しにフラグを立てます。HKEY_LOCAL_MACHINE を使用したレジストリの操作には、管理者権限が必要です。 このため、これらの関数呼び出しで使用する場合は、コードは、特定のアプリケーションに必要な最小特権の使用原則に反しています。

コードで HKEY_LOCAL_MACHINE パラメーターを使用する必要がある場合、このチェッカーをオフに切り替えることができます。

脆弱性とリスク

アプリケーションが継続して過剰な権限で動作する場合、攻撃者はプログラムを使用して権限のない他のリソースへのアクセスを得ることができます。バッファオーバーフローなど、別のフローによってアプリケーションへの攻撃が成功した結果、特権昇格の攻撃となる場合があります。

軽減と防止

アプリケーションがユーザー特有のデータを書き込んだり、ユーザーが制御可能なレジストリ操作を実行している場合は、HKEY_LOCAL_USER マクロを使用する方が賢明です。

レジストリ関数への呼び出しのトレースバックは重要です。 コード例からわかるように、ハイブへのハンドルを作成してそれを今後の呼び出しに使用するのが一般的な行為であるためです。

脆弱コード例

コピー
    HKEY hKeyHive; 
    HKEY hRealKey; 
    DWORD dwDisposition; 
    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, "Software", 0, NULL, 
                       REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
                      &hKeyHive, &dwDisposition) != ERROR_SUCCESS) { 
      printf("failed to open hive HKLM.Error %d\n", GetLastError()); 
      return; 
    } 
   printf("Opened hive HKLM\n"); 
   if (RegCreateKeyEx(hKeyHive, "K7_Test", 0, NULL, REG_OPTION_NON_VOLATILE, 
                      KEY_ALL_ACCESS, NULL, &hRealKey, &dwDisposition) != 13   ERROR_SUCCESS) { 
     return; 
   } 
   printf("Created key under HKLM:HKEY_LOCAL_MACHINE\\K9_Test\n");

Klocwork は 4 行目で、関数 RegCreateKeyEx がマクロ HKEY_LOCAL_MACHINE を hkey パラメーターとして使用していることを示す指摘レポートを生成します。HKEY_LOCAL_MACHINE の使用により、通常のユーザーアカウントからアプリケーションを実行することが不可能となります。その代り、マクロは、最小特権の規則に反する管理者権限を必要とし、特権昇格の攻撃の可能性が生じます。

修正コード例

コピー
    HKEY hKeyHive; 
    HKEY hRealKey; 
    DWORD dwDisposition; 
    if (RegCreateKeyEx(HKEY_LOCAL_USER, "Software", 0, NULL, 
                       REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
                      &hKeyHive, &dwDisposition) != ERROR_SUCCESS) { 
      printf("failed to open hive HKLM.Error %d\n", GetLastError()); 
      return; 
    } 
   printf("Opened hive HKLM\n"); 
   if (RegCreateKeyEx(hKeyHive, "K7_Test", 0, NULL, REG_OPTION_NON_VOLATILE, 
                      KEY_ALL_ACCESS, NULL, &hRealKey, &dwDisposition) != 13   ERROR_SUCCESS) { 
     return; 
   } 
   printf("Created key under HKLM:HKEY_LOCAL_USER\\K9_Test\n");

修正されたコード例では、HKEY_LOCAL_MACHINE パラメーターは HKEY_LOCAL_USER と置換されました。この場合、最小権限の原則が採用され、悪意のある攻撃の可能性を排除します。

関連チェッカー

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。