Share via


Windows Defender WDAC(애플리케이션 제어) 및 .NET

.NET 앱(C#과 같은 상위 수준 언어로 작성됨)은 IL(중간 언어)로 컴파일됩니다. IL은 모든 운영 체제 또는 아키텍처에서 지원될 수 있는 압축 코드 형식입니다. 대부분의 .NET 앱은 여러 환경에서 지원되는 API를 사용하므로 .NET 런타임만 실행하면 됩니다. CPU(예: Arm64 또는 x64)에서 실행하려면 네이티브 코드로 IL을 컴파일해야 합니다. .NET은 WDAC 사용자 모드 정책을 사용하여 디바이스에서 IL을 NI(네이티브 이미지)로 컴파일하는 경우 먼저 원래 IL 파일이 현재 WDAC 정책을 통과하는지 여부를 확인합니다. 이 경우 .NET은 WDAC도 신뢰할 수 있도록 생성된 NI 파일에 NTFS EA(확장 특성)를 설정합니다. .NET 앱이 실행되면 WDAC는 NI 파일에서 EA를 보고 허용합니다.

NI 파일의 EA 집합은 현재 활성 WDAC 정책에만 적용됩니다. 활성 WDAC 정책 중 하나가 업데이트되거나 새 정책이 적용되면 NI 파일의 EA가 무효화됩니다. 다음에 앱이 실행될 때 WDAC는 NI 파일을 차단합니다. .NET은 블록을 정상적으로 처리하고 원래 IL 코드로 대체합니다. IL이 여전히 최신 WDAC 정책을 통과하는 경우 앱은 기능적 영향 없이 실행됩니다. 이제 런타임에 IL이 컴파일되므로 앱 성능에 약간의 영향을 미칠 수 있습니다. .NET이 IL로 대체되어야 하는 경우 .NET은 모든 NI 파일을 다시 생성하기 위해 다음 유지 관리 기간에 실행되도록 프로세스를 예약하므로 최신 WDAC 정책을 전달하는 모든 코드에 대해 WDAC EA를 다시 설정합니다.

경우에 따라 NI 파일이 차단되면 WDAC 관리 팁 & 알려진 문제에 설명된 대로 CodeIntegrity - 운영 이벤트 로그에 "가양성" 블록 이벤트가 표시될 수 있습니다.

WDAC EA가 유효하지 않거나 누락될 때 발생하는 성능 영향을 완화하려면 다음을 수행합니다.

  • WDAC 정책을 자주 업데이트하지 않습니다.
  • (모든 컴퓨터 아키텍처에서) 를 실행 ngen update 하여 WDAC 정책에 변경 내용을 적용한 직후 .NET에서 모든 NI 파일을 강제로 다시 생성합니다.
  • 애플리케이션을 .NET Core(.NET 6 이상)로 마이그레이션합니다.

WDAC 및 .NET 강화

보안 연구원은 앱이 외부 원본에서 라이브러리를 로드하거나 런타임에 새 코드를 생성할 수 있는 일부 .NET 기능을 사용하여 WDAC 컨트롤을 우회할 수 있음을 발견했습니다. 이 잠재적 취약성을 해결하기 위해 WDAC에는 .NET과 함께 작동하여 런타임에 로드된 코드를 확인하는 동적 코드 보안 이라는 옵션이 포함되어 있습니다.

동적 코드 보안 옵션을 사용하도록 설정하면 .NET이 외부 원본에서 로드하는 라이브러리에 애플리케이션 제어 정책이 적용됩니다. 예를 들어 인터넷 또는 네트워크 공유와 같은 모든 원격 원본입니다.

중요

UMCI를 사용하도록 설정된 WDAC 정책이 옵션 19 사용:동적 코드 보안을 설정한 경우 .Net 동적 코드 보안 강화가 켜지고 적용됩니다. 이 기능에 대한 감사 모드가 없습니다. 많은 수의 디바이스에서 앱을 켜기 전에 이 옵션을 설정하여 앱을 테스트해야 합니다.

또한 .NET에 의해 디스크에 생성된 코드의 변조를 감지하고 변조된 코드 로드를 차단합니다.

기존 정책이 외부에서 로드된 라이브러리를 고려하지 않을 수 있으므로 동적 코드 보안은 기본적으로 사용하도록 설정되지 않습니다. 또한 System.Reflection.Emit을 사용하여 빌드된 서명되지 않은 어셈블리 로드를 포함하여 몇 가지 .NET 로딩 기능은 현재 동적 코드 보안을 사용하도록 설정하여 지원되지 않습니다. 새 라이브러리가 정책에 포함되어야 하는지 여부를 검색하도록 적용하기 전에 감사 모드에서 동적 코드 보안을 테스트하는 것이 좋습니다.

또한 고객은 서명되지 않은 동적으로 생성된 코드를 로드하려고 하기 때문에 허용된 실행 파일이 종료되지 않도록 배포를 미리 컴파일할 수 있습니다. 이 문제를 해결하는 방법은 ASP.NET 미리 컴파일 개요 문서의 "배포 전용 미리 컴파일" 섹션을 참조하세요.

동적 코드 보안을 사용하도록 설정하려면 WDAC 정책의 섹션에 <Rules> 다음 옵션을 추가합니다.

<Rule> 
    <Option>Enabled:Dynamic Code Security</Option> 
</Rule>