다음을 통해 공유


악용 방지 참고자료

적용 대상:

엔드포인트용 Microsoft Defender를 경험하고 싶으신가요? 무료 평가판을 신청하세요.

Exploit Protection은 개발자가 소프트웨어를 컴파일하고 배포한 후 엔터프라이즈 관리자 및 IT 전문가가 적용할 수 있는 애플리케이션에 대한 고급 보호를 제공합니다.

이 문서는 익스플로잇 보호 정책을 성공적으로 빌드하고 적용하는 데 도움이 되도록 정책 수준과 개별 완화 수준에서 익스플로잇 보호가 작동하는 방식을 이해하는 데 도움이 됩니다.

완화 적용 방법

익스플로잇 보호 완화는 애플리케이션별로 적용됩니다.

완화는 보호를 구성하는 각 프로그램에 대한 레지스트리 항목을 통해 구성됩니다. 이러한 설정은 각 프로그램(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\*ImageFileName*\MitigationOptions)에 대한 MitigationOptions 레지스트리 항목에 저장됩니다. 프로그램을 다시 시작할 때 적용되며, 프로그램을 변경하고 프로그램을 다시 시작할 때까지 유효합니다.

중요

이미지 파일 실행 옵션을 사용하면 버전 번호, 아키텍처 또는 기타 차별화 요소가 아닌 파일 이름이나 경로만 지정할 수 있습니다. 고유한 이름 또는 경로가 있는 앱에 대한 완화를 대상으로 지정하여 해당 버전과 애플리케이션의 아키텍처를 테스트한 디바이스에만 적용합니다.

PowerShell, 그룹 정책 또는 MDM을 사용하여 XML 구성 파일을 사용하여 악용 방지 완화를 구성하는 경우 이 XML 구성 파일을 처리할 때 개별 레지스트리 설정이 구성됩니다.

XML 파일을 배포하는 정책이 더 이상 적용되지 않으면 이 XML 구성 파일에 의해 배포된 설정이 자동으로 제거되지 않습니다. 악용 방지 설정을 제거하려면 클린 Windows 10 또는 Windows 11 디바이스에서 XML 구성을 내보내고 이 새 XML 파일을 배포합니다. 또는 Microsoft는 악용 방지 설정을 다시 설정하기 위한 Windows 보안 기준의 일부로 XML 파일을 제공합니다.

PowerShell을 사용하여 Exploit Protection 설정을 다시 설정하려면 다음 명령을 사용합니다.

Set-ProcessMitigation -PolicyFilePath EP-reset.xml

다음은 Windows 보안 기준선과 함께 배포된 EP-reset.xml입니다.

<?xml version="1.0" encoding="UTF-8"?>
<MitigationPolicy>
  <AppConfig Executable="ONEDRIVE.EXE">
    <DEP OverrideDEP="false" />
    <ASLR OverrideRelocateImages="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
    <ImageLoad OverrideBlockRemoteImages="false" />
  </AppConfig>
  <AppConfig Executable="firefox.exe">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
  </AppConfig>
  <AppConfig Executable="fltldr.exe">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
    <ImageLoad OverrideBlockRemoteImages="false" />
    <ChildProcess OverrideChildProcess="false" />
  </AppConfig>
  <AppConfig Executable="GROOVE.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
    <ImageLoad OverrideBlockRemoteImages="false" />
    <ChildProcess OverrideChildProcess="false" />
  </AppConfig>
  <AppConfig Executable="Acrobat.exe">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="AcroRd32.exe">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="chrome.exe">
    <DEP OverrideDEP="false" />
  </AppConfig>
  <AppConfig Executable="EXCEL.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="iexplore.exe">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="INFOPATH.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="java.exe">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="javaw.exe">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="javaws.exe">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="LYNC.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="MSACCESS.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="MSPUB.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="OIS.EXE">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="OUTLOOK.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="plugin-container.exe">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="POWERPNT.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="PPTVIEW.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="VISIO.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="VPREVIEW.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="WINWORD.EXE">
    <DEP OverrideDEP="false" />
    <ASLR ForceRelocateImages="true" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="wmplayer.exe">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
  <AppConfig Executable="wordpad.exe">
    <DEP OverrideDEP="false" />
    <Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
  </AppConfig>
</MitigationPolicy>

완화 참조

다음 섹션에서는 각 악용 방지 완화에서 제공하는 보호, 완화에 대한 호환성 고려 사항 및 사용 가능한 구성 옵션에 대해 자세히 설명합니다.

ACG(임의 코드 가드)

설명

임의의 코드 보호는 메모리 안전 취약성을 통해 선택한 코드를 메모리에 로드하고 해당 코드를 실행할 수 있는 악의적인 공격자로부터 보호하는 데 도움이 됩니다.

임의 코드 가드는 애플리케이션이 동적으로 생성된 코드(예: exe 자체 또는 dll에서 로드되지 않은 코드)를 실행하지 못하도록 보호합니다. 임의의 코드 가드는 메모리가 실행 파일로 표시되지 않도록 하여 작동합니다. 애플리케이션이 메모리를 할당하려고 하면 보호 플래그를 확인합니다. (메모리는 읽기, 쓰기 및/또는 실행 보호 플래그를 사용하여 할당할 수 있습니다.) 할당이 실행 보호 플래그를 포함하려고 하면 메모리 할당이 실패하고 오류 코드(STATUS_DYNAMIC_CODE_BLOCKED)를 반환합니다. 마찬가지로 애플리케이션이 이미 할당되고 실행 보호 플래그를 포함하는 메모리의 보호 플래그를 변경하려고 하면권한 변경이 실패하고 오류 코드(STATUS_DYNAMIC_CODE_BLOCKED)를 반환합니다.

실행 플래그가 설정되지 않도록 함으로써 Windows 10 및 Windows 11의 데이터 실행 방지 기능은 해당 메모리로 설정되고 해당 코드를 실행하는 명령 포인터로부터 보호할 수 있습니다.

호환성 고려 사항

임의의 코드 가드는 JIT(Just-In-Time) 컴파일러와 같은 접근 방식과의 호환성 문제를 나타내는 모든 메모리를 실행 파일로 할당하지 못하도록 합니다. 예를 들어 대부분의 최신 브라우저는 성능을 최적화하기 위해 JavaScript를 네이티브 코드로 컴파일합니다. 이 완화를 지원하려면 JIT 컴파일을 보호된 프로세스 외부로 이동하려면 다시 구조화해야 합니다. 디자인이 스크립트 또는 기타 중간 언어에서 코드를 동적으로 생성하는 다른 애플리케이션도 이 완화와 유사하게 호환되지 않습니다.

구성 옵션

스레드 옵트아웃 허용 - 개별 스레드가 이 보호를 옵트아웃하도록 완화를 구성할 수 있습니다. 개발자는 이 완화를 인식하고 애플리케이션을 작성해야 하며, 이 스레드에서 동적 코드를 실행할 수 있도록 ThreadInformation 매개 변수를 ThreadDynamicCodePolicy로 설정하여 SetThreadInformation API를 호출해야 합니다.

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Defender에서 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

낮은 무결성 이미지 차단

설명

낮은 무결성 이미지를 차단하면 일반적으로 샌드박스 브라우저에서 인터넷에서 다운로드되었기 때문에 애플리케이션이 신뢰할 수 없는 파일을 로드할 수 없습니다.

이 완화는 이미지에 낮은 IL 프로세스에 대한 액세스 권한을 부여하고 신뢰 레이블 ACE가 없는 ACE(Access Control Entry)가 있는 경우 이미지 로드를 차단합니다. 파일이 메모리에 매핑되지 않도록 차단하는 메모리 관리자에 의해 구현됩니다. 애플리케이션이 낮은 무결성 이미지를 매핑하려고 하면 STATUS_ACCESS_DENIED 오류가 트리거됩니다. 무결성 수준의 작동 방식에 대한 자세한 내용은 MIC(Mandatory Integrity Control)를 참조하세요.

호환성 고려 사항

낮은 무결성 이미지를 차단하면 애플리케이션이 인터넷에서 다운로드한 파일을 로드할 수 없습니다. 애플리케이션 워크플로에서 다운로드한 이미지를 로드해야 하는 경우 더 높은 신뢰 프로세스에서 다운로드되었는지 또는 이 완화를 적용하기 위해 명시적으로 레이블이 다시 지정되었는지 확인해야 합니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

원격 이미지 차단

설명

원격 이미지를 차단하면 애플리케이션이 UNC 공유와 같은 원격 디바이스에서 호스트되는 파일을 로드하지 못하게 할 수 있습니다. 원격 이미지를 차단하면 공격자가 제어하는 외부 디바이스에 있는 메모리에 이진 파일을 로드하지 않도록 보호할 수 있습니다.

이 완화는 이미지가 원격 디바이스에 있는 것으로 확인되면 이미지 로드를 차단합니다. 파일이 메모리에 매핑되지 않도록 차단하는 메모리 관리자에 의해 구현됩니다. 애플리케이션이 원격 파일을 매핑하려고 하면 STATUS_ACCESS_DENIED 오류가 트리거됩니다.

호환성 고려 사항

원격 이미지를 차단하면 애플리케이션이 원격 디바이스에서 이미지를 로드하지 못하게 할 수 있습니다. 애플리케이션이 원격 디바이스에서 파일 또는 플러그 인을 로드하는 경우 이 완화와 호환되지 않습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

신뢰할 수 없는 글꼴 차단

설명

신뢰할 수 없는 글꼴 차단은 글꼴 구문 분석의 결함으로 인해 공격자가 디바이스에서 코드를 실행할 수 있는 위험을 완화합니다. GDI에서 처리하기 위해 windows\fonts 디렉터리에 설치된 글꼴만 로드됩니다.

이 완화는 파일 위치의 유효성을 검사하는 GDI 내에서 구현됩니다. 파일이 시스템 글꼴 디렉터리에 없으면 구문 분석용으로 글꼴이 로드되지 않으며 해당 호출이 실패합니다.

이 완화는 Windows 10 1607 이상에서 제공되는 기본 제공 완화 기능과 커널에서 사용자 모드 앱 컨테이너로 글꼴 구문 분석을 이동하는 Windows 11에 추가됩니다. 따라서 글꼴 구문 분석을 기반으로 하는 모든 익스플로잇은 샌드박스가 적용되고 격리된 컨텍스트에서 발생하므로 위험이 크게 줄어듭니다. 이 완화에 대한 자세한 내용은 제로 데이 악용 완화를 사용한 Windows 10 강화 블로그를 참조하세요.

호환성 고려 사항

시스템 글꼴 디렉터리 외부에서 가장 일반적으로 사용하는 글꼴은 웹 글꼴을 사용하는 것입니다. Microsoft Edge와 같은 최신 브라우저는 GDI 대신 DirectWrite 사용하며 영향을 받지 않습니다. 그러나 Internet Explorer 11(및 새 Microsoft Edge IE 모드)과 같은 레거시 브라우저는 특히 글꼴 문자 모양을 사용하여 UI를 표시하는 Office 365와 같은 응용 프로그램에 영향을 줄 수 있습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

코드 무결성 가드

설명

코드 무결성 보호는 프로세스에 로드된 모든 이진 파일을 Microsoft에서 디지털 서명하도록 합니다. 코드 무결성 보호에는 프로세스 내에서 WHQL 승인 드라이버를 실행할 수 있는 WHQL(Windows 하드웨어 품질 랩) 서명이 포함되어 있습니다.

이 완화는 메모리 관리자 내에서 구현되어 이진 파일이 메모리에 매핑되지 않도록 차단합니다. Microsoft에서 서명하지 않은 이진 파일을 로드하려고 하면 메모리 관리자가 오류 STATUS_INVALID_IMAGE_HASH 반환합니다. 메모리 관리자 수준에서 차단하면 프로세스에 의해 로드된 이진 파일과 프로세스에 삽입된 이진 파일을 모두 방지할 수 있습니다.

호환성 고려 사항

이 완화는 특히 Microsoft에서 서명하지 않은 모든 이진 파일을 차단합니다. 따라서 해당 소프트웨어가 Microsoft Store에 의해 배포되고 디지털 서명되지 않는 한 대부분의 타사 소프트웨어와 호환되지 않으며 Microsoft Store에서 서명한 이미지 로드를 허용하는 옵션이 선택되어 있습니다.

구성 옵션

또한 Microsoft Store에서 서명한 이미지 로드 허용 - Microsoft Store에서 배포하는 애플리케이션은 Microsoft Store에서 디지털 서명되며, 이 구성을 추가하면 스토어 인증 프로세스를 거친 이진 파일을 애플리케이션에서 로드할 수 있습니다.

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

CFG(제어 흐름 가드)

설명

CFG(제어 흐름 보호)는 간접 함수 호출을 보호하여 메모리 손상 취약성을 사용하는 공격자의 위험을 완화합니다. 예를 들어 공격자는 버퍼 오버플로 취약성을 사용하여 함수 포인터가 포함된 메모리를 덮어쓰고 해당 함수 포인터를 선택한 실행 코드에 대한 포인터로 바꿀 수 있습니다(프로그램에 삽입되었을 수도 있음).

이 완화는 컴파일 시간에 다른 검사를 삽입하여 제공됩니다. 각 간접 함수 호출 전에 대상이 호출되기 전에 유효한 호출 대상인지 확인하는 다른 지침이 추가됩니다. 대상이 유효한 호출 대상이 아닌 경우 애플리케이션이 종료됩니다. 따라서 CFG 지원으로 컴파일된 애플리케이션만 이 완화를 활용할 수 있습니다.

유효한 대상에 대한 검사는 Windows 커널에서 제공합니다. 실행 파일이 로드되면 간접 호출 대상에 대한 메타데이터가 로드 시 추출되고 유효한 호출 대상으로 표시됩니다. 또한 메모리가 할당되고 실행 파일(예: 생성된 코드)로 표시되면 이러한 메모리 위치도 JIT 컴파일과 같은 메커니즘을 지원하기 위해 유효한 호출 대상으로 표시됩니다.

호환성 고려 사항

애플리케이션은 CFG를 지원하도록 컴파일되어야 하므로 해당 애플리케이션과의 호환성을 암시적으로 선언합니다. 따라서 대부분의 애플리케이션은 이 완화를 사용하도록 설정하여 작동해야 합니다. 이러한 검사는 이진 파일로 컴파일되므로 적용할 수 있는 구성은 단순히 Windows 커널 내에서 검사를 사용하지 않도록 설정하는 것입니다. 즉, 완화는 기본적으로 켜져 있지만 나중에 애플리케이션 개발자가 테스트에서 검색하지 못한 호환성 문제가 있다고 판단되는 경우 항상 "예"를 반환하도록 Windows 커널을 구성할 수 있습니다. 이는 드물어야 합니다.

구성 옵션

strict CFG 사용 - strict 모드에서는 프로세스에 로드된 모든 이진 파일을 컴파일하여 제어 흐름 보호(또는 리소스 dll과 같은 실행 코드가 없음)를 로드해야 합니다.

참고

제어 흐름 보호에 감사 모드가 없습니다. 이진 파일은 이 완화를 사용하도록 설정하여 컴파일됩니다.

데이터 실행 방지(DEP)

설명

DEP(데이터 실행 방지)는 실행 파일로 명시적으로 할당되지 않은 메모리가 실행되지 않도록 방지합니다. DEP는 버퍼 오버플로를 통해 프로세스에 악성 코드를 삽입한 다음 해당 코드를 실행하는 공격자로부터 보호하는 데 도움이 됩니다.

명령 포인터를 실행 파일로 표시되지 않은 메모리 주소로 설정하려고 하면 프로세서가 예외(일반 보호 위반)를 throw하여 애플리케이션이 충돌합니다.

호환성 고려 사항

모든 x64, ARM 및 ARM-64 실행 파일은 기본적으로 DEP를 사용하도록 설정되어 있으며 사용하지 않도록 설정할 수 없습니다. 애플리케이션이 DEP 없이 실행된 적이 없으므로 호환성이 가정됩니다.

모든 x86(32비트) 이진 파일은 기본적으로 DEP를 사용하도록 설정되어 있지만 프로세스별로 DEP를 사용하지 않도록 설정할 수 있습니다. 일반적으로 Windows XP SP2 이전에 개발된 일부 이전 레거시 애플리케이션은 DEP와 호환되지 않을 수 있습니다. 이러한 애플리케이션은 일반적으로 동적으로 코드를 생성하거나(예: JIT 컴파일) 코드를 동적으로 생성하는 이전 라이브러리(예: 이전 버전의 ATL)에 연결합니다.

구성 옵션

ATL Thunk 에뮬레이션 사용 - 이 구성 옵션은 ATL Thunk 에뮬레이션을 사용하지 않도록 설정합니다. ACTIVEX 템플릿 라이브러리인 ATL은 가능한 한 작고 빠르도록 설계되었습니다. 이진 크기를 줄이기 위해 thunking이라는 기술을 사용합니다. Thunking은 일반적으로 32비트 애플리케이션과 16비트 애플리케이션 간에 상호 작용하는 것으로 생각되지만 여기에 ATL에 대한 16비트 구성 요소는 없습니다. 대신 이진 크기에 최적화하기 위해 ATL은 단어 정렬되지 않은(더 작은 이진 파일 만들기) 메모리에 머신 코드를 저장한 다음 해당 코드를 직접 호출합니다. Visual Studio 7.1 이하(Visual Studio 2003)로 컴파일된 ATL 구성 요소는 이 메모리를 실행 파일로 할당하지 않습니다. thunk 에뮬레이션은 해당 호환성 문제를 해결합니다. 이진 확장 모델(예: Internet Explorer 11)이 있는 애플리케이션은 ATL Thunk 에뮬레이션을 사용하도록 설정해야 하는 경우가 많습니다.

확장 지점 사용 안 함

설명

이 완화는 애플리케이션에 대한 다양한 확장 지점을 사용하지 않도록 설정합니다. 이 확장 지점은 악성 콘텐츠의 지속성을 설정하거나 권한을 상승시키는 데 사용될 수 있습니다.

여기에는 다음이 포함됩니다.

  • AppInit DLL - 프로세스가 시작될 때마다 시스템은 진입점 함수를 호출하기 전에 지정된 DLL을 새로 시작된 프로세스의 컨텍스트로 로드합니다. AppInit DLL에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 이 완화가 적용되면 AppInit DLL이 로드되지 않습니다. Windows 7부터 AppInit DLL은 여기에 설명된 대로 디지털 서명되어야 합니다. 또한 Windows 8 시작해도 여기에서 설명한 대로 SecureBoot를 사용하도록 설정하면 AppInit DLL이 로드되지 않습니다.
  • 레거시 IME - IME(입력 방법 편집기)를 사용하면 사용자가 키보드에서 나타낼 수 있는 것보다 많은 문자가 있는 언어로 텍스트를 입력할 수 있습니다. 타사에서 IME를 만들 수 있습니다. 악의적인 IME는 이 입력 캡처에서 자격 증명 또는 기타 중요한 정보를 가져올 수 있습니다. 레거시 IME라고 하는 일부 IME는 UWP 앱이 아닌 Windows 데스크톱 앱에서만 작동합니다. 또한 이 완화를 통해 이 레거시 IME가 지정된 Windows 데스크톱 앱에 로드되지 않습니다.
  • Windows 이벤트 후크 - 애플리케이션은 SetWinEventHook API를 호출하여 발생하는 이벤트에 대한 관심을 등록할 수 있습니다. DLL이 지정되어 프로세스에 삽입할 수 있습니다. 이 완화는 삽입된 DLL을 통해 in-process를 실행하는 대신 후크를 등록 프로세스에 게시하도록 합니다.

호환성 고려 사항

이러한 확장 지점의 대부분은 비교적 자주 사용되지 않으므로 호환성 영향은 일반적으로 작습니다( 특히 개별 애플리케이션 수준에서). 한 가지 고려 사항은 사용자가 보호된 애플리케이션에서 작동하지 않는 타사 레거시 IME를 사용하는 경우입니다.

구성 옵션

이 완화에 대한 구성 옵션은 없습니다.

참고

확장 지점을 사용하지 않도록 설정해도 감사 모드가 없습니다.

Win32k 시스템 호출 사용 안 함

설명

Win32k.sys는 공격자에게 광범위한 공격 표면을 제공합니다. 커널 모드 구성 요소로서 샌드박스가 있는 애플리케이션의 이스케이프 벡터로 대상 지정되는 경우가 많습니다. 이 완화는 스레드가 자신을 GUI 스레드로 변환하지 못하도록 차단하여 win32k.sys에 대한 호출을 방지합니다. 그러면 Win32k 함수를 호출할 수 있는 액세스 권한이 부여됩니다. 스레드는 만들 때 GUI가 아니지만 win32k.sys에 대한 첫 번째 호출 또는 IsGuiThread에 대한 API 호출을 통해 변환됩니다.

호환성 고려 사항

이 완화는 전용 비 UI 프로세스인 프로세스를 위해 설계되었습니다. 예를 들어 대부분의 최신 브라우저는 프로세스 격리를 사용하고 비 UI 프로세스를 통합합니다. 단일 프로세스를 사용하여 GUI를 표시하는 모든 애플리케이션은 이 완화의 영향을 받습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

자식 프로세스 허용 안 함

설명

이 완화를 사용하면 애플리케이션에서 새 자식 애플리케이션을 만들 수 없습니다. 악의적 사용자가 사용하는 일반적인 기술은 악의적인 입력("거주" 공격)을 사용하여 디바이스에서 신뢰할 수 있는 프로세스를 시작하는 것입니다. 이 경우 디바이스에서 다른 애플리케이션을 시작해야 하는 경우가 많습니다. 애플리케이션이 자식 프로세스를 시작하는 합법적인 이유가 없는 경우 이 완화는 잠재적인 공격 벡터를 완화합니다. 완화는 프로세스 토큰에서 속성을 설정하여 적용되며, 오류 메시지 STATUS_CHILD_PROCESS_BLOCKED 있는 자식 프로세스에 대한 토큰 만들기를 차단합니다.

호환성 고려 사항

브라우저 또는 외부 브라우저를 시작하는 하이퍼링크를 지원하거나 컴퓨터에서 다른 유틸리티를 시작하는 등 어떤 이유로든 애플리케이션이 자식 애플리케이션을 시작하는 경우 이 완화 기능이 적용되어 이 기능이 손상됩니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

EAF(내보내기 주소 필터링)

설명

EAF(내보내기 주소 필터링)는 로드된 모든 모듈의 내보내기 주소 테이블을 보고 공격에 유용한 API가 포함된 모듈을 찾는 악성 코드의 위험을 완화합니다. 이는 셸코드에서 사용되는 일반적인 전술입니다. 이러한 공격의 위험을 완화하기 위해 이 완화는 일반적으로 공격되는 세 가지 모듈을 보호합니다.

  • ntdll.dll
  • kernelbase.dll
  • kernel32.dll

이 완화는 [내보내기 디렉터리에서 내보내기 주소 테이블을 가리키는) 메모리 페이지를 보호합니다. 이 메모리 페이지에는 PAGE_GUARD 보호가 적용됩니다. 누군가가 이 메모리에 액세스하려고 하면 STATUS_GUARD_PAGE_VIOLATION 생성됩니다. 완화는 이 예외를 처리하고 액세스 명령이 유효성 검사를 통과하지 못하면 프로세스가 종료됩니다.

호환성 고려 사항

이 완화는 디버거, 샌드박스가 적용된 애플리케이션, DRM을 사용하는 애플리케이션 또는 디버깅 방지 기술을 구현하는 애플리케이션과 같은 애플리케이션에 주로 문제가 됩니다.

구성 옵션

익스플로잇에 의해 일반적으로 악용되는 모듈에 대한 액세스 유효성 검사, 즉 - EAF+라고도 하는 이 옵션은 일반적으로 공격되는 다른 모듈에 대한 보호를 추가합니다.

  • mshtml.dll
  • flash*.ocx
  • jscript*.ocx
  • vbscript.dll
  • vgx.dll
  • mozjs.dll
  • xul.dll
  • acrord32.dll
  • acrofx32.dll
  • acroform.api

또한 EAF+를 사용하도록 설정하여 이 완화는 PE 파일에 있는 DOS 헤더의 처음 2바이트인 "MZ" 헤더가 포함된 페이지에 PAGE_GUARD 보호를 추가합니다. 이는 셸코드가 메모리에 잠재적으로 관심 있는 모듈을 식별하기 위해 찾을 수 있는 알려진 메모리 콘텐츠의 또 다른 측면입니다.

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

이미지에 대한 강제 임의 지정(필수 ASLR)

설명

ASLR(Address Space Layout Randomization)은 프로세스 메모리에 이미 있고 이미 실행 파일로 표시된 코드를 실행하기 위해 공격자가 시스템의 메모리 레이아웃에 대한 지식을 사용하여 위험을 완화합니다. 이렇게 하면 악의적 사용자가 컨텍스트를 설정한 다음 반환 주소를 수정하여 악의적 사용자의 목적에 맞는 컨텍스트를 사용하여 기존 코드를 실행하는 반환-libc 공격과 같은 기술을 사용하여 공격자의 위험을 완화할 수 있습니다.

필수 ASLR은 프로세스 내의 모든 DLL을 강제로 다시 지정합니다. 개발자는 /DYNAMICBASE 링커 옵션을 사용하여 ASLR을 사용하도록 설정할 수 있으며 이 완화는 동일한 효과를 줍니다.

메모리 관리자가 이미지에서 프로세스에 매핑하는 경우 필수 ASLR은 ASLR에 옵트인하지 않은 DLL 및 EXE를 강제로 다시 지정합니다. 그러나 이 재지정에는 엔트로피가 없으므로 메모리의 예측 가능한 위치에 배치할 수 있습니다. 이진 파일의 기준이 지정되고 임의로 지정된 위치의 경우 이 완화를 임의 메모리 할당(상향식 ASLR)과 쌍으로 연결해야 합니다.

호환성 고려 사항

ASLR의 이러한 호환성 영향은 일반적으로 이진 파일의 기본 주소를 가정하거나 기본 재배치 정보를 제거한 컴파일러를 사용하여 빌드된 이전 애플리케이션으로 제한됩니다. 이로 인해 실행 흐름이 메모리의 실제 위치가 아닌 예상 위치로 이동하려고 할 때 예기치 않은 오류가 발생할 수 있습니다.

구성 옵션

제거된 이미지 허용 안 함 - 이 옵션은 재배치 정보가 제거된 이미지의 로드를 차단합니다. Windows PE 파일 형식에는 절대 주소가 포함되며 컴파일러는 로더가 모든 상대 메모리 참조 및 오프셋을 찾는 데 사용할 수 있는 [기본 재배치 테이블]도 생성하므로 이진 파일이 기본 기본 주소에서 로드되지 않는 경우 업데이트할 수 있습니다. 일부 이전 애플리케이션은 프로덕션 빌드에서 이 정보를 제거하므로 이러한 이진 파일을 다시 지정할 수 없습니다. 이 완화는 기본 기본 주소에서 로드할 수 있도록 허용하는 대신 이러한 이진 파일이 로드되지 않도록 차단합니다.

참고

이미지에 대한 강제 임의화(필수 ASLR)에는 감사 모드가 없습니다.

하드웨어 적용 스택 보호

설명

하드웨어 적용 스택 보호는 프로그램의 의도된 실행 흐름 기록을 유지 관리하므로 ROP 악용에 대한 강력한 보호를 제공합니다. 원활한 에코시스템 채택 및 애플리케이션 호환성을 보장하기 위해 Windows는 이 보호를 옵트인 모델로 제공하므로 개발자는 자신의 속도로 이 보호를 받을 수 있습니다.

호환성 고려 사항

하드웨어 적용 스택 보호는 하드웨어 섀도 스택, Intel의 CET(제어 흐름 적용 기술) 또는 AMD 섀도 스택을 지원하는 칩셋에서만 작동합니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Defender에서 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

호환되는 모듈 대신 모든 모듈에 적용 - 호환 모듈 대신 모든 모듈에 적용하도록 이 완화를 사용하도록 설정할 수 있습니다.

주소 필터링 가져오기(IAF)

설명

IAF(가져오기 주소 필터링) 완화 기능은 해당 함수가 호출될 때 공격자가 선택한 임의의 코드로 리디렉션하도록 IAT(가져오기 주소 테이블)를 수정하여 악의적 사용자가 애플리케이션의 제어 흐름을 변경하는 위험을 완화하는 데 도움이 됩니다. 공격자는 이 방법을 사용하여 제어를 하이재킹하거나 중요한 API에 대한 호출을 가로채고, 검사하고, 차단할 수 있습니다.

보호된 모든 API의 메모리 페이지에는 PAGE_GUARD 보호가 적용됩니다. 누군가가 이 메모리에 액세스하려고 하면 STATUS_GUARD_PAGE_VIOLATION 생성됩니다. 완화는 이 예외를 처리하고 액세스 명령이 유효성 검사를 통과하지 못하면 프로세스가 종료됩니다.

이 완화 기능은 다음 Windows API를 보호합니다.

  • GetProcAddress
  • GetProcAddressForCaller
  • LoadLibraryA
  • LoadLibraryExA
  • LoadLibraryW
  • LoadLibraryExW
  • LdrGetProcedureAddress
  • LdrGetProcedureAddressEx
  • LdrGetProcedureAddressForCaller
  • LdrLoadDll
  • VirtualProtect
  • VirtualProtectEx
  • VirtualAlloc
  • VirtualAllocEx
  • NtAllocateVirtualMemory
  • NtProtectVirtualMemory
  • CreateProcessA
  • CreateProcessW
  • WinExec
  • CreateProcessAsUserA
  • CreateProcessAsUserW
  • GetModuleHandleA
  • GetModuleHandleW
  • RtlDecodePointer
  • DecodePointer

호환성 고려 사항

이 완화에 의해 API 가로채기를 수행하는 합법적인 애플리케이션이 검색되어 일부 애플리케이션이 충돌할 수 있습니다. 예를 들어 보안 소프트웨어 및 애플리케이션 호환성 shim이 있습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

메모리 할당 임의 지정(상향식 ASLR)

설명

임의 메모리 할당(상향식 ASLR)은 재배치에 엔트로피를 추가하므로 위치가 임의로 지정되므로 예측하기 어렵습니다. 이 완화를 적용하려면 필수 ASLR이 적용되어야 합니다.

32비트 주소 공간의 크기는 추가할 수 있는 엔트로피에 실질적인 제약 조건을 두므로 64비트 애플리케이션을 사용하면 공격자가 메모리의 위치를 추측하기가 더 어려워집니다.

호환성 고려 사항

필수 ASLR(재지정)과 호환되는 대부분의 애플리케이션은 상향식 ASLR의 다른 엔트로피와도 호환됩니다. 일부 애플리케이션은 32비트 변수(4GB 미만의 기본 주소 예상)에 로컬 포인터를 저장하는 경우 포인터 잘림 문제가 있을 수 있으므로 높은 엔트로피 옵션(사용하지 않도록 설정할 수 있음)과 호환되지 않습니다.

구성 옵션

높은 엔트로피를 사용하지 마세요. - 이 옵션은 64비트 애플리케이션의 상향식 할당에 24비트 엔트로피(1TB 차이)를 추가하는 높은 엔트로피 ASLR 사용을 사용하지 않도록 설정합니다.

참고

임의 메모리 할당(상향식 ASLR) 에는 감사 모드가 없습니다.

실행 시뮬레이션(SimExec)

설명

시뮬레이트 실행(SimExec)은 32비트 애플리케이션에 대한 완화 기능입니다. 이렇게 하면 중요한 API에 대한 호출이 합법적인 호출자 함수로 반환되는지 확인하는 데 도움이 됩니다. 이렇게 하려면 중요한 API에 대한 호출을 가로채고 호출자에게 반환되어야 하는 RET 명령을 찾는 인코딩된 어셈블리 언어 지침을 탐색하여 해당 API 실행을 시뮬레이션합니다. 그런 다음, 해당 함수를 검사하고 메모리에서 뒤로 이동하여 이전 CALL 명령을 찾아 함수 및 CALL 명령이 일치하는지, 그리고 RET가 가로채지 않았는지 확인합니다.

이 완화에 의해 가로채는 API는 다음과 같습니다.

  • LoadLibraryA
  • LoadLibraryW
  • LoadLibraryExA
  • LoadLibraryExW
  • LdrLoadDll
  • VirtualAlloc
  • VirtualAllocEx
  • NtAllocateVirtualMemory
  • VirtualProtect
  • VirtualProtectEx
  • NtProtectVirtualMemory
  • HeapCreate
  • RtlCreateHeap
  • CreateProcessA
  • CreateProcessW
  • CreateProcessInternalA
  • CreateProcessInternalW
  • NtCreateUserProcess
  • NtCreateProcess
  • NtCreateProcessEx
  • CreateRemoteThread
  • CreateRemoteThreadEx
  • NtCreateThreadEx
  • WriteProcessMemory
  • NtWriteVirtualMemory
  • WinExec
  • CreateFileMappingA
  • CreateFileMappingW
  • CreateFileMappingNumaW
  • NtCreateSection
  • MapViewOfFile
  • MapViewOfFileEx
  • MapViewOfFileFromApp
  • LdrGetProcedureAddressForCaller

ROP 가젯이 검색되면 프로세스가 종료됩니다.

호환성 고려 사항

API 가로채기(특히 보안 소프트웨어)를 수행하는 애플리케이션은 이 완화로 인해 호환성 문제를 일으킬 수 있습니다.

이 완화는 임의 Code Guard 완화와 호환되지 않습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

API 호출 확인(CallerCheck)

설명

API 호출 유효성 검사(CallerCheck)는 유효한 호출자에서 중요한 API가 호출되었는지 확인하는 ROP(반환 지향 프로그래밍) 기술에 대한 완화 기능입니다. 이 완화는 전달된 반환 주소를 검사한 다음 추론적으로 역방향으로 디스어셈블하여 반환 주소 위의 호출을 찾아 호출 대상이 함수에 전달된 매개 변수와 일치하는지 확인합니다.

이 완화에 의해 가로채는 API는 다음과 같습니다.

  • LoadLibraryA
  • LoadLibraryW
  • LoadLibraryExA
  • LoadLibraryExW
  • LdrLoadDll
  • VirtualAlloc
  • VirtualAllocEx
  • NtAllocateVirtualMemory
  • VirtualProtect
  • VirtualProtectEx
  • NtProtectVirtualMemory
  • HeapCreate
  • RtlCreateHeap
  • CreateProcessA
  • CreateProcessW
  • CreateProcessInternalA
  • CreateProcessInternalW
  • NtCreateUserProcess
  • NtCreateProcess
  • NtCreateProcessEx
  • CreateRemoteThread
  • CreateRemoteThreadEx
  • NtCreateThreadEx
  • WriteProcessMemory
  • NtWriteVirtualMemory
  • WinExec
  • CreateFileMappingA
  • CreateFileMappingW
  • CreateFileMappingNumaW
  • NtCreateSection
  • MapViewOfFile
  • MapViewOfFileEx
  • MapViewOfFileFromApp
  • LdrGetProcedureAddressForCaller

ROP 가젯이 검색되면 프로세스가 종료됩니다.

호환성 고려 사항

API 가로채기(특히 보안 소프트웨어)를 수행하는 애플리케이션은 이 완화로 인해 호환성 문제를 일으킬 수 있습니다.

이 완화는 임의 Code Guard 완화와 호환되지 않습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

예외 체인 확인(SEHOP)

설명

SEHOP(예외 체인 유효성 검사)는 SEH(구조적 예외 처리기) 덮어쓰 기 악용 기술에 대한 완화입니다. 구조적 예외 처리는 애플리케이션이 특정 예외를 처리하도록 요청할 수 있는 프로세스입니다. 예외 처리기는 함께 연결되므로 한 예외 처리기가 특정 예외를 처리하지 않도록 선택하는 경우 한 예외 처리기를 처리하기로 결정할 때까지 체인의 다음 예외 처리기에 전달할 수 있습니다. 처리기 목록은 동적이므로 스택에 저장됩니다. 공격자는 스택 오버플로 취약성을 사용하여 예외 처리기를 공격자가 선택한 코드에 대한 포인터로 덮어쓸 수 있습니다.

이 완화는 각 SEH 항목에 예외 처리기에 대한 포인터와 예외 체인의 다음 처리기에 대한 포인터가 모두 포함된 SEH의 디자인에 의존합니다. 이 완화는 예외가 호출될 때 SEH 체인의 유효성을 검사하는 예외 디스패처에 의해 호출됩니다. 다음을 확인합니다.

  • 모든 예외 체인 레코드가 스택 경계 내에 있습니다.
  • 모든 예외 레코드가 정렬됨
  • 스택을 가리키는 예외 처리기 포인터가 없습니다.
  • 뒤로 포인터가 없습니다.
  • 예외 체인은 알려진 최종 예외 처리기에서 끝납니다.

이러한 유효성 검사가 실패하면 예외 처리가 중단되고 예외가 처리되지 않습니다.

호환성 고려 사항

SEHOP와의 호환성 문제는 비교적 드뭅니다. 애플리케이션이 예외 체인 손상에 종속되는 것은 일반적이지 않습니다. 그러나 일부 애플리케이션은 타이밍의 미묘한 변화로 인해 영향을 받으며, 이는 애플리케이션에서 대기 중인 다중 스레딩 버그를 표시하는 경합 조건으로 나타날 수 있습니다.

구성 옵션

참고

SEHOP(예외 체인)에 감사 모드가 없는지 확인합니다.

핸들 사용 확인

설명

핸들 사용 유효성 검사는 기존 핸들을 사용하여 보호된 개체에 액세스하는 공격자로부터 보호하는 완화 기능입니다. 핸들은 보호된 개체에 대한 참조입니다. 애플리케이션 코드가 잘못된 핸들을 참조하는 경우 악의적 사용자가 이전에 기록한 핸들을 사용하려고 시도하지만 애플리케이션 참조 개수를 인식하지 못했음을 나타낼 수 있습니다. 애플리케이션이 단순히 null을 반환하는 대신 잘못된 개체를 사용하려고 하면 애플리케이션이 예외(STATUS_INVALID_HANDLE)를 발생합니다.

이 완화는 Windows 스토어 애플리케이션에 자동으로 적용됩니다.

호환성 고려 사항

핸들 참조를 정확하게 추적하지 않았고 예외 처리기에서 이러한 작업을 래핑하지 않은 애플리케이션은 이 완화의 영향을 받을 수 있습니다.

구성 옵션

참고

핸들 사용의 유효성 검사에 감사 모드가 없습니다.

힙 무결성 확인

설명

유효성 검사 힙 무결성 완화는 힙 손상이 감지되면 애플리케이션이 종료되도록 하여 Windows에서 힙 완화의 보호 수준을 높입니다. 완화 방법은 다음과 같습니다.

  • HEAP 핸들이 해제되지 않도록 방지
  • 힙 할당에 대한 확장 블록 헤더에서 다른 유효성 검사 수행
  • 힙 할당이 아직 사용 중으로 플래그가 지정되지 않았는지 확인
  • 최소 크기보다 큰 할당, 힙 세그먼트 및 하위 집합에 보호 페이지 추가

호환성 고려 사항

이 완화는 Windows Vista 이상을 대상으로 하는 64비트 애플리케이션 및 32비트 애플리케이션에 대해 기본적으로 이미 적용되어 있습니다. 호환성 문제는 드물지만 Windows XP 이하의 레거시 애플리케이션은 가장 위험합니다.

구성 옵션

참고

힙 무결성 유효성 검사에 감사 모드가 없습니다.

이미지 종속성 무결성 확인

설명

이미지 종속성 완화의 유효성을 검사하면 Windows 이진 파일에서 정적으로 연결된 dll의 코드를 대체하려는 공격으로부터 보호할 수 있습니다. DLL 심기 기술은 로더의 검색 메커니즘을 악용하여 악성 코드를 삽입합니다. 이 메커니즘은 관리자 권한 컨텍스트에서 악성 코드를 실행하는 데 사용할 수 있습니다. 로더가 Windows 서명된 이진 파일을 로드한 다음 이진 파일이 의존하는 모든 dll을 로드하는 경우 이러한 이진 파일은 Windows 이진 파일로 디지털 서명되었는지 확인합니다. 서명 검사 실패하면 dll이 로드되지 않고 예외를 throw하여 STATUS_INVALID_IMAGE_HASH 상태 반환합니다.

호환성 고려 사항

호환성 문제는 일반적이지 않습니다. Windows 이진 파일을 로컬 프라이빗 버전으로 교체하는 데 의존하는 애플리케이션은 영향을 받으며 다중 스레드 애플리케이션에서 미묘한 타이밍 버그를 노출할 위험이 적습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

스택 무결성 확인(StackPivot)

설명

StackPivot(스택 무결성 유효성 검사) 완화는 공격자가 힙 메모리에 가짜 스택을 만든 다음 애플리케이션이 실행 흐름을 제어하는 가짜 스택으로 돌아가게 하는 ROP 공격인 스택 피벗 공격으로부터 보호하는 데 도움이 됩니다.

이 완화는 많은 Windows API를 가로채고 스택 포인터의 값을 검사합니다. 스택 포인터의 주소가 스택의 맨 아래와 위쪽 사이에 떨어지지 않으면 이벤트가 기록되고 감사 모드가 아닌 경우 프로세스가 종료됩니다.

이 완화에 의해 가로채는 API는 다음과 같습니다.

  • LoadLibraryA
  • LoadLibraryW
  • LoadLibraryExA
  • LoadLibraryExW
  • LdrLoadDll
  • VirtualAlloc
  • VirtualAllocEx
  • NtAllocateVirtualMemory
  • VirtualProtect
  • VirtualProtectEx
  • NtProtectVirtualMemory
  • HeapCreate
  • RtlCreateHeap
  • CreateProcessA
  • CreateProcessW
  • CreateProcessInternalA
  • CreateProcessInternalW
  • NtCreateUserProcess
  • NtCreateProcess
  • NtCreateProcessEx
  • CreateRemoteThread
  • CreateRemoteThreadEx
  • NtCreateThreadEx
  • WriteProcessMemory
  • NtWriteVirtualMemory
  • WinExec
  • CreateFileMappingA
  • CreateFileMappingW
  • CreateFileMappingNumaW
  • NtCreateSection
  • MapViewOfFile
  • MapViewOfFileEx
  • MapViewOfFileFromApp
  • LdrGetProcedureAddressForCaller

호환성 고려 사항

가짜 스택을 사용하는 애플리케이션은 영향을 받고 다중 스레드 애플리케이션에서 미묘한 타이밍 버그를 노출할 위험이 적습니다. API 가로채기(특히 보안 소프트웨어)를 수행하는 애플리케이션은 이 완화로 인해 호환성 문제를 일으킬 수 있습니다.

이 완화는 임의 Code Guard 완화와 호환되지 않습니다.

구성 옵션

감사 전용 - 애플리케이션에 대한 잠재적인 호환성 영향을 측정하기 위해 감사 모드에서 이 완화를 사용하도록 설정할 수 있습니다. 그런 다음 이벤트 뷰어에서 또는 엔드포인트용 Microsoft Defender의 고급 헌팅을 사용하여 감사 이벤트를 볼 수 있습니다.

더 자세히 알아보고 싶으신가요? 기술 커뮤니티: 엔드포인트용 Microsoft Defender Tech Community의 Microsoft 보안 커뮤니티와 Engage.