/guard(제어 흐름 보호 사용)/guard (Enable Control Flow Guard)

제어 흐름 보호 보안 검사의 컴파일러 생성을 사용하도록 설정합니다.Enable compiler generation of Control Flow Guard security checks.

구문Syntax

/guard:cf[-]

설명Remarks

/guard:cf 옵션은 컴파일러가 컴파일 시간에 간접 호출 대상에 대한 제어 흐름을 분석한 다음 런타임에 대상을 확인하는 코드를 삽입하게 합니다.The /guard:cf option causes the compiler to analyze control flow for indirect call targets at compile time, and then to insert code to verify the targets at runtime. 기본적으로, /guard:cf 는 해제되어 있으며, 명시적으로 설정해야 합니다.By default, /guard:cf is off and must be explicitly enabled. 이 옵션을 명시적으로 사용하지 않도록 설정하려면 /guard:cf- 를 사용합니다.To explicitly disable this option, use /guard:cf-.

Visual Studio 2017 이상: 이 옵션에 대 한 보호를 추가 전환 문을 생성 하는 테이블을 이동 합니다.Visual Studio 2017 and later: This option adds guards for switch statements that generate jump tables.

/guard:cf CFG(제어 흐름 보호) 옵션이 지정된 경우 컴파일러 및 링커는 추가 런타임 보안 검사를 삽입하여 코드를 손상시키려는 시도를 감지합니다.When the /guard:cf Control Flow Guard (CFG) option is specified, the compiler and linker insert extra runtime security checks to detect attempts to compromise your code. 컴파일 및 연결 중에 코드의 모든 간접 호출이 분석되어 코드를 올바르게 실행할 경우 코드가 도달할 수 있는 모든 위치를 찾습니다.During compiling and linking, all indirect calls in your code are analyzed to find every location that the code can reach when it runs correctly. 이 정보는 이진 파일의 헤더에 추가 구조로 저장됩니다.This information is stored in extra structures in the headers of your binaries. 또한 컴파일러는 코드의 모든 간접 호출 앞에 대상이 검증된 위치 중 하나인지 확인하는 검사를 삽입합니다.The compiler also injects a check before every indirect call in your code that ensures the target is one of the verified locations. CFG 인식 운영 체제에서 런타임에 검사가 실패하면 운영 체제에서 프로그램을 닫습니다.If the check fails at runtime on a CFG-aware operating system, the operating system closes the program.

소프트웨어에 대한 일반적인 공격은 극단적인 입력이나 예기치 않은 입력 처리의 버그를 이용합니다.A common attack on software takes advantage of bugs in handling extreme or unexpected inputs. 정교하게 작성된 애플리케이션 입력은 실행 코드에 대한 포인터를 포함하는 위치를 덮어쓸 수 있습니다.Carefully crafted input to the application may overwrite a location that contains a pointer to executable code. 이 입력을 사용하여 제어 흐름을 공격자가 제어하는 코드로 리디렉션할 수 있습니다.This can be used to redirect control flow to code controlled by the attacker. CFG 런타임 검사는 실행 파일의 데이터 손상 버그를 수정하지 않습니다.The CFG runtime checks do not fix the data corruption bugs in your executable. 대신 공격자가 버그를 사용하여 임의 코드를 실행하기 어렵게 만듭니다.They instead make it more difficult for an attacker to use them to execute arbitrary code. CFG는 코드에서 함수 진입점 이외의 위치에 대한 호출을 방지하는 완화 도구입니다.CFG is a mitigation tool that prevents calls to locations other than function entry points in your code. DEP(데이터 실행 방지), /GS 스택 검사, /DYNAMICBASE/HIGHENTROPYVA ASLR(주소 공간 레이아웃 불규칙화)에서 코드가 익스플로잇 벡터가 될 가능성을 줄이는 방법과 유사합니다.It's similar to how Data Execution Prevention (DEP), /GS stack checks, and /DYNAMICBASE and /HIGHENTROPYVA address space layout randomization (ASLR) lower the chances that your code becomes an exploit vector.

CFG 익스플로잇 완화 방법을 사용하는 코드를 빌드하려면 /guard:cf 옵션을 컴파일러와 링커 둘 다에 전달해야 합니다.The /guard:cf option must be passed to both the compiler and linker to build code that uses the CFG exploit mitigation technique. 단일 cl 명령을 사용하여 이진 파일이 빌드된 경우 컴파일러는 옵션을 링커에 전달합니다.If your binary is built by using a single cl command, the compiler passes the option to the linker. 컴파일 및 연결을 별도로 수행하는 경우 컴파일러 및 링커 명령 둘 다에 옵션을 설정해야 합니다.If you compile and link separately, the option must be set on both the compiler and linker commands. /DYNAMICBASE 링커 옵션도 필요합니다.The /DYNAMICBASE linker option is also required. 이진 파일에 CFG 데이터가 있는지 확인하려면 dumpbin /headers /loadconfig 명령을 사용합니다.To verify that your binary has CFG data, use the dumpbin /headers /loadconfig command. CFG 사용 이진 파일의 EXE 또는 DLL 특징 목록에 Guard 가 있고 가드 플래그에 CF InstrumentedFID table present를 사용합니다.CFG-enabled binaries have Guard in the list of EXE or DLL characteristics, and Guard Flags include CF Instrumented and FID table present.

/guard:cf 옵션은 /ZI (편집하며 계속하기 디버그 정보) 또는 /clr (공용 언어 런타임 컴파일)과 호환되지 않습니다.The /guard:cf option is incompatible with /ZI (Edit and Continue debug information) or /clr (Common Language Runtime Compilation).

/guard:cf 를 사용하여 컴파일된 코드를 해당 옵션으로 컴파일되지 않은 라이브러리 및 개체 파일에 연결할 수 있습니다.Code compiled by using /guard:cf can be linked to libraries and object files that are not compiled by using the option. /guard:cf 옵션을 사용하여 연결하고 CFG 인식 운영 체제에서 실행할 경우 이 코드만 CFG로 보호됩니다.Only this code, when also linked by using the /guard:cf option and run on a CFG-aware operating system, has CFG protection. 옵션 없이 컴파일된 코드는 공격을 중지하지 않으므로 컴파일하는 모든 코드에서 옵션을 사용하는 것이 좋습니다.Because code compiled without the option will not stop an attack, we recommend that you use the option on all the code you compile. CFG 검사를 위한 작은 런타임 비용이 있지만 컴파일러 분석에서 안전한 것으로 입증할 수 있는 간접 점프에 대한 검사를 최적화하려고 합니다.There is a small runtime cost for CFG checks, but the compiler analysis attempts to optimize away the checks on indirect jumps that can be proven to be safe.

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면To set this compiler option in the Visual Studio development environment

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다.Open the project's Property Pages dialog box. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조합니다.For details, see Set C++ compiler and build properties in Visual Studio.

  2. 구성 속성, C/C++, 코드 생성을 차례로 선택합니다.Select Configuration Properties, C/C++, Code Generation.

  3. 제어 흐름 보호 속성을 선택합니다.Select the Control Flow Guard property.

  4. 드롭다운 컨트롤에서 를 선택하여 제어 흐름 보호를 사용하도록 설정하거나, 아니요 를 선택하여 사용하지 않도록 설정합니다.In the dropdown control, choose Yes to enable Control Flow Guard, or No to disable it.

참고자료See also

MSVC 컴파일러 옵션MSVC Compiler Options
MSVC 컴파일러 명령줄 구문MSVC Compiler Command-Line Syntax