セーフ文字列関数の使用

多くのシステム セキュリティの問題は、バッファー処理が不十分で、結果として生じるバッファー オーバーランが原因で発生します。 バッファー処理が不適切なのは、多くの場合、文字列操作に関連しています。 C/C++ 言語ランタイム ライブラリ (strcatstrcpysprintf など) によって提供される標準の文字列操作関数は、バッファーの末尾を超えて書き込むことを防ぐものではありません。

セーフ文字列関数と呼ばれる 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 つのサブセットで構成されます。

カーネル モードのセーフ文字列関数には、次の機能があります。

  • それぞれの安全な文字列関数は、入力として宛先バッファーのサイズを受け取ります。 そのため、この関数はバッファーの末尾を超えて書き込まないようにすることができます。

  • Unicode および ANSI 文字列関数は、操作によって目的の結果が切り捨てられた場合でも、すべての出力文字列を NULL 文字で終了します。

  • すべてのセーフ文字列関数は NTSTATUS 値を返します。成功コードは 1 つだけです (STATUS_SUCCESS)。

  • ほとんどのセーフ文字列関数は、バイトカウントバージョンと文字カウントバージョンの両方で使用できます。 たとえば、 RtlStringCbCata は 2 つのバイトカウント文字列を連結し、 RtlStringCchCata は 2 つの文字カウント文字列を連結します。

  • ほとんどのセーフ文字列関数は、追加の機能を提供する拡張のサフィックス付きバージョンで使用できます。 たとえば、RtlStringCbCatExaRtlStringCbCata の機能を拡張します。

ここでは、次のトピックについて説明します。

カーネルモード セーフ文字列関数の概要

カーネルモード セーフ文字列関数のインポート