セーフ文字列関数の使用
多くのシステム セキュリティの問題は、バッファー処理が不十分で、結果として生じるバッファー オーバーランが原因で発生します。 バッファー処理が不適切なのは、多くの場合、文字列操作に関連しています。 C/C++ 言語ランタイム ライブラリ (strcat、strcpy、sprintf など) によって提供される標準の文字列操作関数は、バッファーの末尾を超えて書き込むことを防ぐものではありません。
セーフ文字列関数と呼ばれる 2 つの新しい文字列操作関数セットは、コード内で適切なバッファー処理のための追加処理を提供します。 これらのセーフ文字列関数は、Windows Driver Kit (WDK) および Microsoft Windows XP SP1 以降のバージョンのドライバー開発キット (DDK) および Windows SDK で使用できます。 これらは、Windows によって提供される組み込みの C/C++ に対応するルーチンや、同様のルーチンを置き換えることを目的としています。
セーフ文字列関数の 1 セットは、カーネル モード コードで使用されます。 これらの関数は、Ntstrsafe.h という名前のヘッダー ファイルでプロトタイプ化されています。 このヘッダー ファイルと関連するライブラリは、WDK で使用できます。
他のセーフ文字列関数のセットは、ユーザー モード アプリケーションで使用されます。 対応するヘッダー ファイル Strsafe.h には、これらの関数のプロトタイプが含まれています。 そのファイルと関連するライブラリは、Windows SDK で使用できます。 Strsafe.h の詳細については、「Strsafe.h 関数の使用」を参照してください。
カーネル モード セーフ文字列関数のセットは、次の 2 つのサブセットで構成されます。
-
これらの各関数は、2 バイト Unicode 文字をサポートする W サフィックス付きバージョンと、1 バイト ANSI 文字をサポートする A サフィックス付きバージョンで使用できます。 たとえば、2 つの文字列を連結し、追加された文字列の長さを制限する RtlStringCbCatN は、RtlStringCbCatNW と RtlStringCbCatNA として使用できます。
-
これらの各関数は、UNICODE_STRING 構造体を入力パラメーターまたは出力パラメーターまたはその両方として受け入れます。 たとえば、RtlStringCbCopyUnicodeString は入力パラメーターとして構造体を受け入れ、RtlUnicodeStringCopyString は構造体を出力パラメーターとして受け入れ、RtlUnicodeStringCopy は入力パラメーターと出力パラメーターの両方として構造体を受け入れます。
カーネル モードのセーフ文字列関数には、次の機能があります。
それぞれの安全な文字列関数は、入力として宛先バッファーのサイズを受け取ります。 そのため、この関数はバッファーの末尾を超えて書き込まないようにすることができます。
Unicode および ANSI 文字列関数は、操作によって目的の結果が切り捨てられた場合でも、すべての出力文字列を NULL 文字で終了します。
すべてのセーフ文字列関数は NTSTATUS 値を返します。成功コードは 1 つだけです (STATUS_SUCCESS)。
ほとんどのセーフ文字列関数は、バイトカウントバージョンと文字カウントバージョンの両方で使用できます。 たとえば、 RtlStringCbCata は 2 つのバイトカウント文字列を連結し、 RtlStringCchCata は 2 つの文字カウント文字列を連結します。
ほとんどのセーフ文字列関数は、追加の機能を提供する拡張のサフィックス付きバージョンで使用できます。 たとえば、RtlStringCbCatExa は RtlStringCbCata の機能を拡張します。
ここでは、次のトピックについて説明します。