CRT のセキュリティ機能Security Features in the CRT

多くの古い CRT 関数には、セキュリティが強化された新しいバージョンがあります。Many old CRT functions have newer, more secure versions. セキュリティで保護された関数が存在する場合、低いセキュリティ レベルの古いバージョンは非推奨としてマークされ、新しいバージョンには _s ("secure") のサフィックスが付いています。If a secure function exists, the older, less secure version is marked as deprecated and the new version has the _s ("secure") suffix.

ここでの "非推奨" とは、関数の使用が推奨されないというだけであり、その関数が CRT から削除される予定であるということを示しているわけではありません。In this context, "deprecated" just means that a function's use is not recommended; it does not indicate that the function is scheduled to be removed from the CRT.

また、セキュリティで保護された関数は、セキュリティ エラーを防いだり修正したりするのではなく、エラー発生時にそのエラーをキャッチします。The secure functions do not prevent or correct security errors; rather, they catch errors when they occur. これらの関数はエラー条件に対して追加のチェックを行い、エラーが発生した場合に、エラー ハンドラーを呼び出します (「パラメーターの検証」を参照)。They perform additional checks for error conditions, and in the case of an error, they invoke an error handler (see Parameter Validation).

たとえば、strcpy 関数には、コピーする文字列が大きすぎてコピー先のバッファーに入らない場合、これを通知する方法がありません。For example, the strcpy function has no way of telling if the string that it is copying is too big for its destination buffer. ただし、セキュリティで保護されたバージョンの strcpy_s では、バッファーのサイズをパラメーターとして取り、バッファー オーバーランが発生するかどうかを事前に判断できます。However, its secure counterpart, strcpy_s, takes the size of the buffer as a parameter, so it can determine if a buffer overrun will occur. strcpy_s を使用して、11 文字を 10 文字バッファーにコピーしようとすると、これはエラーになります。strcpy_s でこの間違いを訂正することはできませんが、このエラーを検出して、無効なパラメーター ハンドラーを呼び出すことにより、エラーの発生を通知できます。If you use strcpy_s to copy eleven characters into a ten-character buffer, that is an error on your part; strcpy_s cannot correct your mistake, but it can detect your error and inform you by invoking the invalid parameter handler.

非推奨に関する警告を除去するEliminating deprecation warnings

低いセキュリティ レベルの古い関数に対する非推奨警告を除去するには、いくつかの方法があります。There are several ways to eliminate deprecation warnings for the older, less secure functions. _CRT_SECURE_NO_WARNINGS を定義するか、warning プラグマを使用するのが、最も簡単な方法です。The simplest is simply to define _CRT_SECURE_NO_WARNINGS or use the warning pragma. どちらの方法でも警告は無効になりますが、その警告の原因になったセキュリティの問題はもちろんそのまま存在します。Either will disable deprecation warnings, but of course the security issues that caused the warnings still exist. 非推奨に関する警告を有効にしたまま、新しい CRT セキュリティ機能を利用することを推奨します。It is far better to leave deprecation warnings enabled and take advantage of the new CRT security features.

C++ では、セキュリティ保護されたテンプレート オーバーロードを使用するのが、最も簡単な方法です。多くの場合、この方法では、使用されていない関数の呼び出しが、それらの関数のセキュリティで保護された新しいバージョンの呼び出しに置き換えられるので、非推奨に関する警告は除去されます。In C++, the easiest way to do that is to use Secure Template Overloads, which in many cases will eliminate deprecation warnings by replacing calls to deprecated functions with calls to the new secure versions of those functions. たとえば、この非推奨とされている strcpy の呼び出しについて考えます:For example, consider this deprecated call to strcpy:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES を 1 として定義すると、strcpy の呼び出しが、バッファー オーバーランを防ぐ strcpy_s の呼び出しに変更され、警告は除去されます。Defining _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES as 1 eliminates the warning by changing the strcpy call to strcpy_s, which prevents buffer overruns. 詳細については、「 Secure Template Overloads」を参照してください。For more information, see Secure Template Overloads.

セキュリティで保護されたテンプレート オーバーロードのない、非推奨の関数の場合、セキュリティで保護されたバージョンを使用するように手動でコードを更新することを強くお勧めします。For those deprecated functions without secure template overloads, you should definitely consider manually updating your code to use the secure versions.

セキュリティには関連しませんが、非推奨に関する警告が発生する別の要因として、POSIX 関数があります。Another source of deprecation warnings, unrelated to security, is the POSIX functions. POSIX の関数名を標準に沿った名前に置き換えるか (access_access にするなど)、_CRT_NONSTDC_NO_WARNINGS を定義して、POSIX 関連の非推奨に関する警告を無効にします。Replace POSIX function names with their standard equivalents (for example, change access to _access), or disable POSIX-related deprecation warnings by defining _CRT_NONSTDC_NO_WARNINGS. 詳細については、「 互換性」を参照してください。For more information, see Compatibility.

その他のセキュリティ機能Additional Security Features

一部のセキュリティ機能を次に示します。Some of the security features include the following:

  • Parameter ValidationParameter Validation. セキュリティで保護された関数、および多くの以前から存在するバージョンの関数の両方で、CRT 関数に渡されるパラメーターが検証されます。Parameters passed to CRT functions are validated, in both secure functions and in many preexisting versions of functions. 次のような検証が行われます。These validations include:

    • 関数に渡された NULL 値のチェック。Checking for NULL values passed to the functions.

    • 列挙値が有効であるかどうかのチェック。Checking enumerated values for validity.

    • 整数値が有効な範囲にあるかどうかのチェック。Checking that integral values are in valid ranges.

  • 詳細については、「パラメーターの検証」を参照してください。For more information, see Parameter Validation.

  • 開発者も無効なパラメーターのハンドラーを利用できるようになりました。A handler for invalid parameters is also accessible to the developer. 無効なパラメーターが検出された場合に、アプリケーションをアサートしたり終了したりすることなく、_set_invalid_parameter_handler、_set_thread_local_invalid_parameter_handler 関数でこれらの問題をチェックできます。When an encountering an invalid parameter, instead of asserting and exiting the application, the CRT provides a way to check these problems with the _set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler function.

  • Sized BuffersSized Buffers. セキュリティで保護された関数では、バッファーへの書き込みを行うすべての関数に対してバッファー サイズが渡される必要があります。The secure functions require that the buffer size be passed to any function that writes to a buffer. セキュリティで保護されたバージョンでは、書き込み前にバッファーのサイズを確認するため、悪意のあるコードが実行される余地を与える危険なバッファー オーバーラン エラーを回避するために役立ちます。The secure versions validate that the buffer is large enough before writing to it, helping to avoid dangerous buffer overrun errors that could allow malicious code to execute. 通常、これらの関数は、errno 型のエラー コードを返し、バッファーのサイズが小さすぎる場合、無効なパラメーター ハンドラーを呼び出します。These functions usually return an errno type of error code and invoke the invalid parameter handler if the size of the buffer is too small. gets など、入力バッファーからの読み込みを行う関数のセキュリティで保護されたバージョンでは、最大サイズを指定する必要があります。Functions that read from input buffers, such as gets, have secure versions that require you to specify a maximum size.

  • Null terminationNull termination. 文字列に終端文字を設定しない可能性がある一部の関数には、確実に文字列を null で終わらせる、セキュリティで保護されたバージョンがあります。Some functions that left potentially non-terminated strings have secure versions which ensure that strings are properly null-terminated.

  • Enhanced error reportingEnhanced error reporting. セキュリティで保護された関数では、以前から存在する関数より詳細なエラー情報を含むエラー コードが返されます。The secure functions return error codes with more error information than was available with the preexisting functions. 現在、セキュリティで保護された関数と多くの以前から存在する関数は、errno を設定するため、より詳細なエラー情報を提供する errno コード型も返すことが多いです。The secure functions and many of the preexisting functions now set errno and often return an errno code type as well, to provide better error reporting.

  • Filesystem securityFilesystem security. セキュリティで保護されたファイル I/O API では、既定のケースで安全なファイル アクセスをサポートします。Secure file I/O APIs support secure file access in the default case.

  • Windows securityWindows security. セキュリティで保護されたプロセス API では、セキュリティ ポリシーが適用され、ACL を指定できます。Secure process APIs enforce security policies and allow ACLs to be specified.

  • Format string syntax checkingFormat string syntax checking. 無効な文字列が検出されます。たとえば、printf 書式指定文字列の不正な型フィールド文字を使用した場合です。Invalid strings are detected, for example, using incorrect type field characters in printf format strings.

関連項目See also

パラメーターの検証Parameter Validation
セキュリティ保護されたテンプレート オーバーロードSecure Template Overloads
CRT ライブラリの機能CRT Library Features