セキュリティに関する考慮事項: Microsoft Windows シェル
このトピックでは、Windows シェルに関連するセキュリティに関する考慮事項について説明します。 このドキュメントでは、セキュリティの問題について知る必要があるすべてを提供することはできません。代わりに、この特定のテクノロジ領域の開始点とリファレンスとして使用してください。
シェルは、適切に処理されない場合に潜在的なセキュリティ リスクを提示するいくつかの要素を含む、システムのさまざまな重要な側面を制御します。 このトピックでは、より一般的な問題の一部と、アプリケーションでそれらに対処する方法について説明します。 セキュリティはインターネットベースの悪用に限定されないことに注意してください。 ターミナル サービスを介してアクセスできるシステムを含む共有システムでは、システムを共有する他のユーザーに損害を与える可能性のある操作をユーザーが実行できないようにする必要もあります。
- アプリケーションを適切にインストールする
- shlwapi を する
- オートコンプリート の
- ShellExecute、ShellExecuteEx、および関連する関数
- ファイルの移動とコピー
- セキュリティで保護された名前空間拡張機能の を記述する
- セキュリティ アラートの
- 関連トピック
アプリケーションを正しくインストールする
シェルのセキュリティに関する潜在的な問題の大部分は、アプリケーションを正しくインストールすることで軽減できます。
Program Files フォルダーの下にアプリケーションをインストールします。
オペレーティング システム 場所 Windows XP、Windows Server 2003 以前 CSIDL_PROGRAM_FILES Windows Vista 以降 FOLDERID_ProgramFiles、FOLDERID_ProgramFilesX86、FOLDERID_ProgramFilesX64、FOLDERID_ProgramFilesCommon、FOLDERID_ProgramFilesCommonX86、またはFOLDERID_ProgramFilesCommonX64。 詳細については KNOWNFOLDERID を参照してください。 プログラム ファイル フォルダーの下にユーザー データを格納しないでください。
すべてのユーザーに共通するデータには、適切なデータ フォルダーを使用します。
オペレーティング システム 場所 Windows XP、Windows Server 2003 以前 CSIDL_COMMON_APPDATA Windows Vista 以降 FOLDERID_ProgramData 特定のユーザーに属するデータには、適切なユーザー データ フォルダーを使用します。
オペレーティング システム 場所 Windows XP、Windows Server 2003 以前 CSIDL_APPDATA、CSIDL_PERSONALなど。 Windows Vista 以降 FOLDERID_RoamingAppData、FOLDERID_Documentsなど。 Program Files フォルダー以外の場所にインストールする必要がある場合は、ユーザーがファイル システムの不適切な部分にアクセスできないように、アクセス制御リスト (ACL) を適切に設定してください。 特定のユーザーに固有のデータには、他のユーザーがアクセスできないようにする ACL が必要です。
ファイルの関連付けを設定するときは、必ずコマンド ラインを正しく指定してください。 完全修飾パスを使用し、空白を含む要素を引用符で囲みます。 コマンド パラメーターを別々の引用符で囲みます。 そうしないと、文字列が正しく解析されず、アプリケーションが正しく起動しない可能性があります。 適切に形成されたコマンド ラインの 2 つの例を次に示します。
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
手記
標準インストール フォルダーの場所は、システムによって異なる場合があります。 特定の Windows Vista 以降のシステム上の標準フォルダーの場所を取得するには、適切な KNOWNFOLDERID 値 SHGetKnownFolderPath を呼び出します。 Windows XP、Windows Server 2003 以前のシステムでは、適切な CSIDL 値 SHGetFolderLocation または SHGetFolderPath を呼び出します。
Shlwapi
シェル ライトウェイト API (Shlwapi) には、多数の文字列操作関数が含まれています。 これらの関数を誤って使用すると、予期せず文字列が切り捨てられ、切り捨てが返される通知が返されない可能性があります。 次の場合は、Shlwapi 関数を使用しないでください。 リスクの少ない代替関数を代わりに使用する必要があります。
Shlwapi 関数 | 代替関数 |
---|---|
StrCat、StrNCat | StringCchCat、StringCbCat、および関連する関数 |
StrCpy、StrCpyN | StringCchCopy、StringCbCopy、および関連する関数 |
wnsprintf、wvnsprintf | StringCchPrintf、StringCbPrintf および関連する関数 |
ファイル パス 返す PathRelativePathTo などの関数では、常にバッファーのサイズをMAX_PATH文字に設定します。 そうすることで、バッファーが最大のファイル パスと終端の null 文字を保持するのに十分な大きさになります。
代替文字列関数の詳細については、「Strsafe.hについて」を参照してください。
オートコンプリート
パスワードにはオートコンプリート機能を使用しないでください。
ShellExecute、ShellExecuteEx、および関連関数
アプリケーションの起動に使用できるシェル関数には、ShellExecute、ShellExecuteEx、WinExec、SHCreateProcessAsUserWがあります。 実行するアプリケーションの明確な定義を指定してください。
- 実行可能ファイルのパスを指定するときは、完全修飾パスを指定します。 シェルに依存してファイルを見つけないでください。
- 空白を含むコマンド ライン文字列を指定する場合は、文字列を引用符で囲みます。 それ以外の場合、パーサーは、スペースを含む単一の要素を複数の要素として解釈する可能性があります。
ファイルの移動とコピー
システム セキュリティの 1 つのキーは、ACL を適切に割り当てることです。 暗号化されたファイルを使用することもできます。 ファイルを移動またはコピーするときに、正しい ACL が割り当てられ、誤って暗号化が解除されていないことを確認します。 これには、ファイル システム内だけでなく、のごみ箱へのファイルの移動も含まれます。 IFileOperation(Windows Vista 以降) または SHFileOperation(Windows XP 以前)使用します。 MoveFile使用しないでください。この場合、宛先ファイルに必要な ACL が設定されない可能性があります。
セキュリティで保護された名前空間拡張機能の記述
シェル名前空間拡張機能は、ユーザーにデータを表示するための強力で柔軟な方法です。 ただし、正しく書き込まれていない場合は、システム障害が発生する可能性があります。 留意すべきいくつかの重要なポイント:
- 画像などのデータが正しく書式設定されていると想定しないでください。
- MAX_PATHが文字列内の バイト数と等しいとは想定しないでください。 文字数です。
セキュリティ アラート
次の表に、誤って使用すると、アプリケーションのセキュリティを侵害する可能性のあるいくつかの機能を示します。
特徴 | 緩和 |
---|---|
ShellExecute、ShellExecuteEx | 一連の既定の場所をチェックして特定のファイルを見つけることに依存する検索は、スプーフィング攻撃で使用できます。 完全修飾パスを使用して、目的のファイルに確実にアクセスします。 |
StrCat | psz1 最初の引数は、psz2 と終了 '\0' 保持するのに十分な大きさである必要があります。そうしないと、バッファー オーバーランが発生する可能性があります。 代わりに、次のいずれかの代替手段を使用してください。 StringCbCatCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatEx, StringCchCatEx, StringCchCatN, または StringCchCatNEx. |
StrCatBuffの | 最後の文字列が null で終わるとは限りません。 代わりに、次のいずれかの代替手段を使用してください。 StringCbCatCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatEx, StringCchCatEx, StringCchCatN, または StringCchCatNEx. |
StrCatChainWの | 最後の文字列が null で終わるとは限りません。 代わりに、次のいずれかの代替手段を使用してください。 StringCbCatEx、StringCbCatNEx、StringCchCatEx、または stringCchCatNExをします。 |
StrCpy | psz1 最初の引数は、psz2 と終了 '\0' 保持するのに十分な大きさである必要があります。そうしないと、バッファー オーバーランが発生する可能性があります。 代わりに、次のいずれかの代替手段を使用してください。 StringCbCopy、 StringCbCopyEx、 StringCbCopyN、 StringCbCopyNEx、 StringCchCopyEx、 StringCchCopyEx、 StringCchCopyN、または StringCchCopyNExをします。 |
StrCpyN | コピーされた文字列が null で終わるとは限りません。 代わりに、次のいずれかの代替手段を使用してください。 StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopyEx, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx. |
StrDup | StrDup は、lpsz が null で終わる文字列であると想定しています。 さらに、返される文字列が null で終わるとは限りません。 代わりに、次のいずれかの代替手段を使用してください。 StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopyEx, StringCchCopyEx, StringCchCopyN, または StringCchCopyNEx. |
StrNCat | pszFront 最初の引数は、pszBack と終了 '\0' 保持するのに十分な大きさである必要があります。そうしないと、バッファー オーバーランが発生する可能性があります。 最後の引数 cchMax は、pszFront コピーする文字数であり、必ずしも pszFront のサイズ (バイト単位) ではないことに注意してください。 代わりに、次のいずれかの代替手段を使用してください。 StringCbCatCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatEx, StringCchCatEx, StringCchCatN, または StringCchCatNEx. |
wnsprintf | コピーされた文字列が null で終わるとは限りません。 代わりに、次のいずれかの代替手段を使用してください。 StringCbPrintf、 stringCbPrintfEx、 StringCbVPrintf、 StringCbVPrintfEx、 StringCchPrintf、StringCchPrintfEx、StringCchVPrintf、または StringCchVPrintfExをします。 |
wvnsprintfの | コピーされた文字列が null で終わるとは限りません。 代わりに、次のいずれかの代替手段を使用してください。 StringCbPrintf、 stringCbPrintfEx、 StringCbVPrintf、 StringCbVPrintfEx、 StringCchPrintf、StringCchPrintfEx、StringCchVPrintf、または StringCchVPrintfExをします。 |
関連トピック