セーフ整数関数の使用
セキュリティの問題を最小限に抑える 1 つの方法は、整数のオーバーフローとアンダーフローを防ぐことです。 データ型を受け入れるためにそのデータ型に用意されているメモリ空間に算術演算の結果が収まらないと、整数のオーバーフローが発生します。 その結果、整数が切り詰められて正しくない結果が得られます。 アンダーフローは、演算 (通常は減算) で正しくない結果が得られると発生します。 データ型を別のデータ型にキャストした場合も、新しいメモリ空間に収まらない結果が切り詰められることによって正しくない結果が得られることがあります。
ntintsafe ライブラリには、カーネル モード コードでのオーバーフローやアンダーフローを防ぐために、境界チェックを使用して安全な整数算術演算を実行する C 関数のセットが用意されています。 このような関数は、アプリケーションのコードで使用される、Windows の IntSafe 関数に相当します。 インデックスやバッファのサイズの計算や、別の形態の境界チェックの計算で、これらの関数を使用します。 これらの関数は演算速度で最適化されています。
安全な整数関数には以下の利点があります。
バッファの終端を越える書き込みが発生しないようなサイズの出力先バッファが、関数に必ず用意されます。
意図する結果が演算で切り詰められても、バッファからは NULL で終端した結果が確実に得られます。
すべての関数が、演算の成功を示すコード (STATUS_SUCCESS) またはエラー条件のコード (STATUS_INTEGER_OVERFLOW) のいずれかの値のみとなる NTSTATUS を返します。
ntintsafe ライブラリには次の 2 つの関数カテゴリがあります。
変換関数: 2 つのデータ型を相互に変換します。
算術関数: 各データ型の加算、減算、乗算を実行します。