/Qspectre

특정 스펙터 변형 1 보안 취약성을 완화하기 위한 컴파일러 생성 지침을 지정합니다.

구문

/Qspectre

설명

/Qspectre 옵션을 사용하면 컴파일러가 특정 Spectre 보안 취약성을 완화하기 위한 지침을 삽입합니다. 이러한 취약성을 투기적 실행 측면 채널 공격이라고 합니다. Intel, AMD 및 ARM의 프로세서를 포함하여 많은 운영 체제 및 최신 프로세서에 영향을 줍니다.

/Qspectre 옵션은 Visual Studio 2017 버전 15.5.5 이상 버전부터 사용할 수 있습니다. Visual Studio 2015 업데이트 3에서 KB 4338871 사용할 수 있습니다.

옵션은 /Qspectre 기본적으로 꺼져 있습니다.

초기 릴리스에서 이 /Qspectre 옵션은 최적화된 코드에서만 작동했습니다. Visual Studio 2017 버전 15.7 /Qspectre 부터 이 옵션은 모든 최적화 수준에서 지원됩니다.

Spectre 완화를 사용하는 버전에서도 여러 Microsoft C++ 라이브러리를 사용할 수 있습니다. Visual Studio용 Spectre 완화 라이브러리는 Visual Studio 설치 관리자 다운로드할 수 있습니다. 컴파일러, 빌드 도구 및 런타임 아래개별 구성 요소 탭에 있으며 이름에 "Spectre용 Libs"가 있습니다. 완화를 사용하도록 설정된 DLL 및 정적 런타임 라이브러리는 VC++ 시작 코드, vcruntime140, msvcp140, concrt140 및 vcamp140과 같은 Visual C++ 런타임의 하위 집합에 사용할 수 있습니다. DLL은 애플리케이션-로컬 배포에만 지원됩니다. Visual C++ 런타임 라이브러리 재배포 가능 콘텐츠는 수정되지 않습니다.

MFC 및 ATL용 Spectre 완화 라이브러리를 설치할 수도 있습니다. SDK, 라이브러리 및 프레임워크 아래의 개별 구성 요소 탭에 있습니다.

참고 항목

UWP(유니버설 Windows) 앱 또는 구성 요소에 대한 Spectre 완화 라이브러리 버전은 없습니다. 이러한 라이브러리의 앱 로컬 배포는 불가능합니다.

적용

코드가 트러스트 경계를 초과하는 데이터에 대해 작동하는 경우 가능한 한 빨리 코드를 다시 빌드하고 다시 배포하여 이 문제를 완화하는 옵션을 사용하는 /Qspectre 것이 좋습니다. 이러한 코드의 예로 실행에 영향을 줄 수 있는 신뢰할 수 없는 입력을 로드하는 코드가 있습니다. 예를 들어 원격 프로시저 호출을 수행하거나 신뢰할 수 없는 입력 또는 파일을 구문 분석하거나 다른 IPC(로컬 프로세스 간 통신) 인터페이스를 사용하는 코드입니다. 표준 샌드박싱 기술로 충분하지 않을 수 있습니다. 코드가 트러스트 경계를 넘지 않는다고 결정하기 전에 샌드박스를 신중하게 조사합니다.

가용성

/Qspectre 옵션은 Visual Studio 2017 버전 15.5.5부터 사용할 수 있으며, 2018년 1월 23일 이후의 Microsoft C/C++ 컴파일러(MSVC)에 대한 모든 업데이트에서 사용할 수 있습니다. Visual Studio 설치 관리자를 사용하여 컴파일러를 업데이트하고, 스펙터 완화 라이브러리를 개별 구성 요소로 설치하세요. 이 /Qspectre 옵션은 패치를 통해 Visual Studio 2015 업데이트 3에서도 사용할 수 있습니다. 자세한 내용은 KB 4338871을 참조하세요.

모든 버전의 Visual Studio 2017 버전 15.5 및 Visual Studio 2017 버전 15.6의 모든 미리 보기 문서화되지 않은 옵션을 /d2guardspecload포함합니다. 이는 .의 초기 동작 /Qspectre과 동일합니다. 이러한 버전의 컴파일러에서 코드에 동일한 완화를 적용하는 데 사용할 /d2guardspecload 수 있습니다. 이 옵션을 지원하는 컴파일러에서 사용하도록 /Qspectre 빌드를 업데이트하는 것이 좋습니다. 이 /Qspectre 옵션은 이후 버전의 컴파일러에서 새 완화를 지원할 수도 있습니다.

효과

/Qspectre 옵션은 사양 변형 1, 경계 검사 바이패스, CVE-2017-5753을 완화하는 코드를 출력합니다. 이 코드는 추측 코드 실행의 장벽 역할을 하는 지침을 삽입하는 방식으로 작동합니다. 프로세서 추측을 완화하기 위해 사용되는 지침은 프로세서 및 해당 마이크로 아키텍처에 따라 결정되며, 향후 컴파일러 버전에서 변경될 수 있습니다.

이 옵션을 사용하도록 설정 /Qspectre 하면 컴파일러는 투기적 실행이 경계 검사 우회할 수 있는 인스턴스를 식별하려고 시도합니다. 장벽 명령을 삽입하는 위치입니다. 컴파일러가 variant 1의 인스턴스를 식별하기 위해 수행할 수 있는 분석에 대한 제한을 알고 있어야 합니다. 따라서 변형 1의 가능한 모든 인스턴스가 계 /Qspectre측된다는 보장은 없습니다.

성능에 미치는 영향

성능에 미치는 영향은 /Qspectre 몇 가지 크기가 큰 코드 베이스에서 무시할 수 있는 것처럼 보였습니다. 그러나 코드의 /Qspectre 성능이 영향을 받지 않는 기본 보장은 없습니다. 코드를 벤치마크하여 이 옵션이 성능에 미치는 영향을 확인해야 합니다. 성능에 중요한 블록 또는 루프에서 완화가 필요하지 않다는 것을 알고 있는 경우 지시문을 사용하여 __declspec(spectre(nomitigation)) 완화를 선택적으로 사용하지 않도록 설정할 수 있습니다. 이 지시문은 옵션만 지원하는 /d2guardspecload 컴파일러에서 사용할 수 없습니다.

필요한 라이브러리

/Qspectre 컴파일러 옵션은 사용자 고유의 코드에서 문제를 완화합니다. 더 큰 보호를 위해 스펙터 완화를 제공하기 위해 빌드된 라이브러리를 사용하는 것이 좋습니다. Spectre 완화를 통해 몇 가지 Microsoft 런타임 라이브러리를 사용할 수 있습니다.

다음 라이브러리는 Visual Studio 설치 관리자를 사용하여 설치해야 하는 선택적 구성 요소입니다.

  • Spectre용 MSVC 버전 version_numbers Libs [(x86 및 x64) | (ARM) | (ARM64)]
  • Visual C++ ATL for [(x86/x64) | ARM | ARM64] 스펙터 완화
  • Visual C++ MFC for [x86/x64 | ARM | ARM64] 스펙터 완화

Visual Studio IDE의 기본 MSBuild 기반 프로젝트 시스템을 사용하면 프로젝트에 대한 Spectre 완화 속성을 지정할 수 있습니다. 이 속성은 /Qspectre 컴파일러 옵션을 설정하고 Spectre 완화 런타임 라이브러리를 연결하도록 라이브러리 경로를 변경합니다. 코드를 빌드할 때 이러한 라이브러리가 설치되지 않은 경우 빌드 시스템에서 경고 MSB8040 보고합니다. MFC 또는 ATL 코드를 빌드하지 못하고 링커가 "심각한 오류 LNK1104: 'oldnames.lib' 파일을 열 수 없습니다"와 같은 오류를 보고하는 경우 이러한 누락된 라이브러리가 원인일 수 있습니다.

Visual Studio IDE의 기본 MSBuild 기반 프로젝트 시스템을 사용하면 프로젝트에 대한 Spectre 완화 속성을 지정할 수 있습니다. 이 속성은 /Qspectre 컴파일러 옵션을 설정하고 Spectre 완화 런타임 라이브러리를 연결하도록 라이브러리 경로를 변경합니다. 코드를 빌드할 때 이러한 라이브러리가 설치되지 않은 경우 빌드 시스템은 경고 MSB8038 보고합니다. MFC 또는 ATL 코드를 빌드하지 못하고 링커가 "심각한 오류 LNK1104: 'oldnames.lib' 파일을 열 수 없습니다"와 같은 오류를 보고하는 경우 이러한 누락된 라이브러리가 원인일 수 있습니다.

스펙터 완화 라이브러리를 빌드 명령줄에 지정하는 방법에는 여러 가지가 있습니다. 링커 옵션을 사용하여 스펙터 완화 라이브러리의 /LIBPATH 경로를 지정하여 기본 라이브러리로 만들 수 있습니다. 링커 옵션을 사용하고 /NODEFAULTLIB Spectre 완화 라이브러리를 명시적으로 연결할 수 있습니다. 또는 대상 플랫폼에 LIBPATH 대한 Spectre 완화 라이브러리의 경로를 포함하도록 환경 변수를 설정할 수 있습니다. 환경에서 이 경로를 설정하는 한 가지 방법은 옵션을 사용하여 설정된 개발자 명령 프롬프트를 사용하는 것입니다 spectre_mode . 자세한 내용은 기존 명령 창에서 개발자 도구 사용을 참조 하세요.

x86, x64 및 ARM 플랫폼용 스펙터 완화 런타임 라이브러리는 KB 4338871 통해 제공되는 패치의 일부로 사용할 수 있습니다. 기본적으로 이러한 라이브러리는 다음 디렉터리에 설치됩니다.

  • x86: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre
  • x64: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\amd64
  • 팔: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm

스펙터 완화 라이브러리를 빌드 명령줄에 지정하는 방법에는 여러 가지가 있습니다. 링커 옵션을 사용하여 스펙터 완화 라이브러리의 /LIBPATH 경로를 지정하여 기본 라이브러리로 만들 수 있습니다. 링커 옵션을 사용하고 /NODEFAULTLIB Spectre 완화 라이브러리를 명시적으로 연결할 수 있습니다. 또는 대상 아키텍처에 LIBPATH 대한 Spectre 완화 라이브러리의 경로를 포함하도록 환경 변수를 설정할 수 있습니다. 자세한 내용은 명령줄에서 Microsoft C++ 도구 집합 사용을 참조하세요.

추가 정보

자세한 내용은 공식 Microsoft 보안 권고 ADV180002, 투기적 실행 사이드 채널 취약성을 완화하기 위한 지침을 참조하세요. 지침은 Intel의 예측 실행 부채널 완화 및 ARM의 캐시 예측 부채널에서도 확인할 수 있습니다.

Spectre 및 멜트다운 완화에 대한 Windows 관련 개요는 Spectre 및 멜트다운 완화가 Windows 시스템에 미치는 성능 영향 이해를 참조 하세요.

MSVC 완화에서 해결된 Spectre 취약성에 대한 개요는 C++ 팀 블로그의 MSVC에서 Spectre 완화를 참조하세요.

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>코드 생성 속성 페이지를 선택합니다.

  3. Spectre 완화 속성에 대한 새 값을 선택합니다. 확인을 선택하여 변경 내용을 적용합니다.

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  3. /Qspectre 추가 옵션 상자에 컴파일러 옵션을 입력합니다. 적용을 선택하여 변경 사항을 적용합니다.

  4. 구성 속성>링커>일반 속성 페이지를 선택합니다.

  5. 프로젝트 속성의 각 플랫폼에 대해 추가 라이브러리 디렉터리 속성을 편집 합니다 . 대상 플랫폼에 대한 Spectre 완화 런타임 라이브러리 디렉터리의 경로를 설정한 다음 적용을 선택하여 변경 사항을 적용합니다. 완료되면 확인을 선택합니다.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면

참고 항목

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q options(하위 수준 작업)
MSVC 컴파일러 옵션
MSVC 컴파일러 명령줄 구문