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.

이 컨텍스트에서 "사용 되지 않음"은 함수를 사용 하지 않는 것을 의미 합니다.In this context, "deprecated" means using the function's isn't recommended. 함수가 CRT에서 제거 되도록 예약 되어 있음을 의미 하지 않습니다.It doesn't mean the function is scheduled to be removed from the CRT.

보안 함수는 보안 오류를 방지 하거나 수정 하지 않습니다.The secure functions don't prevent or correct security errors. 대신 오류가 발생 하는 경우 오류를 catch 합니다.Instead, they catch errors when they occur. 오류 조건에 대 한 추가 검사를 수행 합니다.They do additional checks for error conditions. 오류가 있는 경우 오류 처리기를 호출 합니다 ( 매개 변수 유효성 검사참조).If there is an error, they invoke an error handler (see Parameter Validation).

예를 들어 strcpy 함수는 복사 하는 문자열이 대상 버퍼에 비해 너무 큰지 확인할 수 없습니다.For example, the strcpy function can't tell if the string it's copying is too large for the destination buffer. 이에 상응 하는 보안은 strcpy_s 버퍼의 크기를 매개 변수로 사용 합니다.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 11 characters into a 10 character buffer, that is an error on your part; strcpy_s can't 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 the security issues that caused the warnings still exist. 사용 중단 경고를 사용 하도록 설정 하 고 새로운 CRT 보안 기능을 활용 하는 것이 좋습니다.It's 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. 이렇게 하면 더 이상 사용 되지 않는 함수에 대 한 호출을 해당 함수의 안전한 버전에 대 한 호출로 바꿔서 사용 중단 경고가 제거 됩니다.This will eliminate deprecation warnings, in many cases, by replacing calls to deprecated functions with calls to 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. 자세한 내용은 안전한 템플릿 오버로드를 참조하세요.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:

  • Parameter Validation.Parameter Validation. 안전한 함수 및 안전 하지 않은 해당 하는 대부분의 매개 변수 유효성 검사Secure functions, and many of their unsecure counterparts, validate parameters. 유효성 검사는 다음을 포함할 수 있습니다.Validation may include:

    • NULL 값을 확인 하는 중입니다.Checking for NULL values.
    • 열거형 값의 유효성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 a function encounters an invalid parameter, instead of asserting and exiting the application, the CRT allows you to check these problems via _set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler.

  • Sized Buffers.Sized Buffers. 버퍼에 쓰는 모든 보안 함수에 버퍼 크기를 전달 해야 합니다.You must pass the buffer size to any secure function that writes to a buffer. 안전한 버전은 버퍼에 쓰기 전에 버퍼가 충분히 큰지 확인 합니다.The secure versions validate that the buffer is large enough before writing to it. 악의적인 코드를 실행할 수 있는 위험한 버퍼 오버런 오류를 방지 하는 데 도움이 됩니다.Which helps avoid dangerous buffer overrun errors that could allow malicious code to execute. 이러한 함수는 일반적으로 errno 오류 코드를 반환 하 고 버퍼 크기가 너무 작을 경우 잘못 된 매개 변수 처리기를 호출 합니다.These functions usually return an errno 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. Secure 함수는 기존 함수에서 사용할 수 있었던 것 보다 더 많은 오류 정보와 함께 오류 코드를 반환 합니다.The secure functions return error codes with more error information than was available with the pre-existing functions. 보안 함수 및 기존 함수 대부분은 errno errno 더 나은 오류 보고를 제공 하기 위해 코드 형식을 반환 하 고 자주 반환 됩니다.The secure functions and many of the pre-existing 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