/guard
(제어 흐름 보호 사용)
제어 흐름 보호 보안 검사의 컴파일러 생성을 사용하도록 설정합니다.
구문
/guard:cf
/guard:cf-
설명
이 /guard:cf
옵션을 사용하면 컴파일러가 컴파일 시간에 간접 호출 대상에 대한 제어 흐름을 분석한 다음 런타임에 대상을 확인하는 코드를 삽입합니다. 기본적으로 /guard:cf
해제되어 있으며 명시적으로 사용하도록 설정해야 합니다. 이 옵션을 명시적으로 사용하지 않도록 설정하려면 .를 사용합니다 /guard:cf-
.
Visual Studio 2017 이상: 이 옵션은 점프 테이블을 생성하는 문에 대한 switch
가드를 추가합니다.
/guard:cf
CFG(Control Flow Guard) 옵션을 지정하면 컴파일러와 링커가 추가 런타임 보안 검사를 삽입하여 코드 손상 시도를 감지합니다. 컴파일 및 연결 중에 코드의 모든 간접 호출이 분석되어 코드를 올바르게 실행할 경우 코드가 도달할 수 있는 모든 위치를 찾습니다. 이 정보는 이진 파일의 헤더에 추가 구조로 저장됩니다. 또한 컴파일러는 코드의 모든 간접 호출 앞에 대상이 검증된 위치 중 하나인지 확인하는 검사를 삽입합니다. CFG 인식 운영 체제에서 런타임에 검사가 실패하면 운영 체제에서 프로그램을 닫습니다.
소프트웨어에 대한 일반적인 공격은 극단적인 입력이나 예기치 않은 입력 처리의 버그를 이용합니다. 정교하게 작성된 애플리케이션 입력은 실행 코드에 대한 포인터를 포함하는 위치를 덮어쓸 수 있습니다. 이 기술을 사용하여 제어 흐름을 공격자가 제어하는 코드로 리디렉션할 수 있습니다. CFG 런타임 검사는 실행 파일의 데이터 손상 버그를 수정하지 않습니다. 대신 공격자가 버그를 사용하여 임의 코드를 실행하기 어렵게 만듭니다. CFG는 코드에서 함수 진입점 이외의 위치에 대한 호출을 방지하는 완화 도구입니다. DEP(데이터 실행 방지), /GS 스택 검사 및 /DYNAMICBASE
/HIGHENTROPYVA ASLR(주소 공간 레이아웃 임의화)이 코드가 악용 벡터가 될 가능성을 낮추는 방법과 비슷합니다.
/guard:cf
CFG 악용 완화 기술을 사용하는 코드를 빌드하려면 이 옵션을 컴파일러와 링커 모두에 전달해야 합니다. 단일 cl
명령을 사용하여 이진 파일이 빌드된 경우 컴파일러는 옵션을 링커에 전달합니다. 컴파일 및 연결을 별도로 수행하는 경우 컴파일러 및 링커 명령 둘 다에 옵션을 설정해야 합니다. /DYNAMICBASE 링커 옵션도 필요합니다. 이진 파일에 CFG 데이터가 있는지 확인하려면 dumpbin /headers /loadconfig
명령을 사용합니다. CFG 사용 이진 파일의 EXE 또는 DLL 특징 목록에 Guard
가 있고 가드 플래그에 CF Instrumented
및 FID table present
를 사용합니다.
이 /guard:cf
옵션은 (디버그 정보 편집 및 계속) 또는 /clr
(공용 언어 런타임 컴파일)과 호환되지 않습니다 /ZI
.
사용하여 컴파일된 코드는 옵션을 사용하여 /guard:cf
컴파일되지 않은 라이브러리 및 개체 파일에 연결할 수 있습니다. 이 코드만 옵션을 사용하여 /guard:cf
연결하고 CFG 인식 운영 체제에서 실행되는 경우 CFG 보호가 있습니다. 옵션 없이 컴파일된 코드는 공격을 중지하지 않으므로 컴파일하는 모든 코드에서 이 옵션을 사용하는 것이 좋습니다. CFG 검사에 대한 런타임 비용은 적지만 컴파일러 분석은 안전한 것으로 입증될 수 있는 간접 점프에 대한 검사를 최적화하려고 시도합니다.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 자세한 내용은 컴파일러 및 빌드 속성 설정을 참조 하세요.
구성 속성>C/C++>코드 생성 속성 페이지를 선택합니다.
제어 흐름 보호 속성을 선택합니다.
드롭다운 컨트롤에서 예 를 선택하여 제어 흐름 보호를 사용하도록 설정하거나, 아니요 를 선택하여 사용하지 않도록 설정합니다.