セキュリティの考慮事項: Microsoft Windows コントロール

このトピックでは、Windows コントロール関連のセキュリティに関する考慮事項について説明します。 このトピックの情報は、セキュリティの問題について知る必要があるすべてを網羅しているわけではありません。このテクノロジ領域の開始点と参照として使用してください。

コンピューター間の相互接続性は一般的です。開発者の主な関心事は、アプリケーションのセキュリティである必要があります。 次のセクションでは、Windows コントロールをプログラミングするときに考慮すべき潜在的なセキュリティの問題について説明します。

Null で終了するコントロール メッセージ

コントロール メッセージとマクロの多くは、文字列パラメーターを持っています。 多くの場合、これらのメッセージは入力文字列を検証しません。特に、'\0' の終了を確認しません。 文字列をパラメーターとして使用するメッセージを呼び出す場合は、文字列が null で終了することを明示的に指定します。

文字列の使用

Windows コントロールをプログラムする場合は、文字列を操作する必要があります。 ほぼすべてのコントロールにテキストを挿入する必要があります。 たとえば、リスト ボックスを設定するには、コントロールに文字列を読み込む必要があります。 文字列を誤って使用するとバッファー オーバーランが発生することが多いため、このセキュリティ リスクを回避するための予防措置を講じます。

バッファー オーバーランについて詳しくは、Microsoft Press 2002 の Michael Howard と David Leblanc による "安全なコードの記述"、およびに "Security API のベスト プラクティス" に関する記事をご覧ください。

入力検証

次の制御メッセージでは、セキュリティの問題が発生する可能性があります。

テキストの長さを取得する呼び出しと、テキストが表示または使用される時間の間でテキストが変更されると、バッファー オーバーランが発生する可能性があります。 これを回避するには、文字列を使用する前に検証する必要があります。 さらに、テキスト、CB_GETLBTEXTTB_GETBUTTONTEXT、および TTM_GETTEXT を取得するメッセージには、バッファー オーバーランの可能性を示すバッファー サイズ パラメーターがありません。

CB_GETLBTEXT または SB_GETTEXT を使用する場合は、最初に CB_GETLBTEXTLEN または SB_GETTEXTLENGTH を呼び出してバッファー サイズを取得する必要があります。 これらのメッセージの一部 (TB_GETBUTTONTEXTLVM_GETISEARCHSTRING、および TVM_GETISEARCHSTRING) を NULL パラメーター値で呼び出して、文字列を取得するメッセージを呼び出す前に文字列の長さを取得できます。

特に注意が必要なメッセージは、ステータス バー SB_GETTIPTEXT メッセージです。 このメッセージは、取得する文字列の長さを照会する方法を提供しません。

パスワードの使用

パスワードで保護された編集コントロール (ES_PASSWORD スタイル) を使用する場合は、ユーザーのパスワードがメモリに公開されないように、取得したテキストを含むバッファーをできるだけ早く 0 に設定する必要があります。

セキュリティのアラート

次の表は、誤って使うとアプリケーションのセキュリティを侵害する可能性がある機能です。 ここに記載されているメッセージには、バッファー サイズを指定するパラメーターは用意されていません。

機能 対応策
DlgDirListComboBox 関数によって使用されるバッファーが書き込み可能で、null で終了していることを確認します。
CB_GETLBTEXT CB_GETLBTEXTLEN を呼び出してバッファー サイズを取得し、CB_GETLBTEXT を呼び出して文字列を取得します。
LVM_GETISEARCHSTRING NULL パラメーター値を指定してメッセージを呼び出してバッファー サイズを取得し、2 回目にメッセージを呼び出して文字列を取得します。
SB_GETTEXT SB_GETTEXTLENGTH を呼び出してバッファー サイズを取得し、SB_GETTEXT を呼び出して文字列を取得します。
TB_GETBUTTONTEXT NULL パラメーター値を指定してメッセージを呼び出してバッファー サイズを取得し、2 回目にメッセージを呼び出して文字列を取得します。
TTM_GETTEXT このメッセージには、バッファーのサイズを知ったり指定したりする方法はありません。
TVM_GETISEARCHSTRING バッファー サイズを取得するには、NULL パラメーター値を渡してメッセージを呼び出し、もう一度メッセージを呼び出して文字列を取得します。

 

その他のリソース

Microsoft Security

Security

Microsoft Security Response Center

Security API のベスト プラクティス