CRT의 보안 기능Security Features in the CRT

이전 CRT 함수 중 상당수에 더 안전한 최신 버전이 있습니다.Many old CRT functions have newer, more secure versions. 안전한 함수가 있을 경우 보안 수준이 떨어지는 이전 버전이 사용되지 않는 것으로 표시되고 새 버전에 _s("안전함") 접미사가 붙습니다.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 pragma를 사용하는 것입니다.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. 자세한 내용은 사용되지 않는 CRT 함수를 참조하세요.For more information, see Deprecated CRT Functions.

추가 보안 기능Additional Security Features

다음은 보안 기능 중 일부입니다.Some of the security features include the following:

  • Parameter Validation.Parameter Validation. 안전한 함수와 많은 기존 버전의 함수에서 모두 CRT 함수에 전달되는 매개 변수의 유효성이 검사됩니다.Parameters passed to CRT functions are validated, in both secure functions and in many preexisting versions of functions. 이러한 유효성 검사 시에는 다음이 확인됩니다.These validations include:

    • 함수에 전달된 NULLChecking 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. 잘못된 매개 변수가 발견되면 CRT는 응용 프로그램을 어설션 및 종료하는 대신 _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 Buffers.Sized 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 termination.Null termination. 종료되지 않았을 수 있는 문자열을 남긴 일부 함수에는 문자열이 적절하게 null로 종료되게 만드는 안전한 버전이 있습니다.Some functions that left potentially non-terminated strings have secure versions which ensure that strings are properly null terminated.

  • Enhanced error reporting.Enhanced 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 security.Filesystem security. 안전한 파일 I/O API는 default case에서 안전한 파일 액세스를 지원합니다.Secure file I/O APIs support secure file access in the default case.

  • Windows security.Windows security. 안전한 프로세스 API는 보안 정책을 적용하고 ACL을 지정할 수 있게 허용합니다.Secure process APIs enforce security policies and allow ACLs to be specified.

  • Format string syntax checking.Format 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