PowerShell에서 앱 제어가 작동하는 방식
이 문서에서는 비즈니스용 App Control이 PowerShell을 보호하는 방법과 적용하는 제한 사항에 대해 설명합니다. PowerShell의 보안 동작은 사용 중인 Windows 및 PowerShell 버전에 따라 달라집니다.
PowerShell에서 시스템 잠금 정책을 검색하는 방법
PowerShell은 AppLocker 및 비즈니스용 앱 제어 시스템 전체 정책을 모두 검색합니다. AppLocker는 더 이상 사용되지 않습니다. 앱 컨트롤은 Windows에 대한 기본 애플리케이션 제어 시스템입니다.
레거시 앱 제어 정책 적용 검색
PowerShell은 레거시 앱 제어 WldpGetLockdownPolicy
API를 사용하여 다음 두 가지를 검색합니다.
- 시스템 전체 정책 적용:
None
,Audit
Enforce
- 개별 파일 정책:
None
(Audit
정책에서 허용),Enforce
(정책에서 허용되지 않음)
모든 버전의 PowerShell(v5.1 - v7.x)은 이 앱 제어 정책 검색을 지원합니다.
최신 App Control 정책 적용 검색
앱 컨트롤은 최신 버전의 Windows에서 새로운 API를 도입했습니다. 버전 7.3부터 PowerShell은 새 WldpCanExecuteFile
API를 사용하여 파일을 처리하는 방법을 결정합니다. Windows PowerShell 5.1은 이 새로운 API를 지원하지 않습니다. 새 API는 개별 파일에 대한 레거시 API보다 우선합니다.
그러나 PowerShell은 레거시 API를 계속 사용하여 시스템 전체 정책 구성을 가져옵니다. 새 API를 사용할 수 없는 경우 PowerShell은 이전 API 동작으로 돌아갑니다.
새 API는 각 파일에 대해 다음 정보를 제공합니다.
WLDP_CAN_EXECUTE_ALLOWED
WLDP_CAN_EXECUTE_BLOCKED
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
잠금 정책의 PowerShell 동작
PowerShell은 대화형 모드와 비대화형 모드 모두에서 실행할 수 있습니다.
- 대화형 모드에서 PowerShell은 사용자 명령줄 입력을 명령 또는 스크립트로 사용하여 실행하는 명령줄 애플리케이션입니다. 결과가 사용자에게 다시 표시됩니다.
- 비대화형 모드에서 PowerShell은 모듈을 로드하고 사용자 입력 없이 스크립트 파일을 실행합니다. 결과 데이터 스트림은 무시되거나 파일로 리디렉션됩니다.
정책 적용에서 실행되는 대화형 모드
PowerShell은 모드에서 ConstrainedLanguage
명령을 실행합니다. 이 모드는 대화형 사용자가 특정 명령을 실행하거나 임의의 코드를 실행하지 못하도록 합니다. 이 모드의 제한 사항에 대한 자세한 내용은 이 문서의 잠금 정책 섹션에서 PowerShell 제한을 참조하세요.
정책 적용에서 실행되는 비자동 모드
PowerShell은 스크립트를 실행하거나 모듈을 로드할 때 App Control API를 사용하여 파일에 대한 정책 적용을 가져옵니다.
PowerShell 버전 7.3 이상은 사용 가능한 경우 API를 WldpCanExecuteFile
사용합니다. 이 API는 다음 결과 중 하나를 반환합니다.
WLDP_CAN_EXECUTE_ALLOWED
: 파일은 정책에 의해 승인되며 몇 가지 제한 사항이 있는 모드에서FullLanguage
사용됩니다.WLDP_CAN_EXECUTE_BLOCKED
: 파일은 정책에 의해 승인되지 않습니다. PowerShell은 파일이 실행되거나 로드될 때 오류를 throw합니다.WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
: 파일은 정책에 의해 승인되지 않았지만 여전히 실행하거나 모드에서ConstrainedLanguage
로드할 수 있습니다.
Windows PowerShell 5.1 또는 API를 사용할 수 없는 경우 WldpCanExecuteFile
파일당 PowerShell의 동작은 다음과 같습니다.
None
: 몇 가지 제한 사항이 있는 모드에서FullLanguage
파일이 로드됩니다.Audit
: 파일이 실행되거나 제한 없이 모드로FullLanguage
로드됩니다. PowerShell 7.4 이상에서 정책은 Windows 이벤트 로그에 제한 정보를 기록합니다.Enforce
: 파일이 실행되거나 모드에서ConstrainedLanguage
로드됩니다.
잠금 정책의 PowerShell 제한 사항
PowerShell에서 시스템이 App Control 잠금 정책 아래에 있는 것을 감지하면 스크립트가 신뢰할 수 있고 모드에서 FullLanguage
실행되더라도 제한이 적용됩니다. 이러한 제한은 잠긴 시스템에서 임의의 코드 실행을 초래할 수 있는 PowerShell의 알려진 동작을 방지합니다. 잠금 정책은 다음과 같은 제한을 적용합니다.
와일드카드 함수 내보내기 제한을 사용한 모듈 점 소싱
스크립트 점 소싱을 사용하고 와일드카드 이름을 사용하여 함수를 내보내는 모듈은 오류가 발생합니다. 와일드카드 내보내기를 차단하면 신뢰할 수 있는 모듈에 점이 공급되는 신뢰할 수 없는 스크립트를 심을 수 있는 악의적인 사용자의 스크립트 삽입이 방지됩니다. 그러면 악의적인 스크립트가 신뢰할 수 있는 모듈의 프라이빗 함수에 액세스할 수 있습니다.
보안 권장 사항: 모듈에서 스크립트 점 소싱을 사용하지 않고 항상 명시적 이름을 사용하여 모듈 함수를 내보냅니다(와일드카드 문자 없음).
와일드카드 함수 내보내기 제한이 있는 중첩된 모듈
부모 모듈이 함수 이름 와일드카드 문자를 사용하여 함수를 내보내는 경우 PowerShell은 함수 내보내기 목록에서 중첩된 모듈의 함수 이름을 제거합니다. 중첩 모듈에서 와일드카드 내보내기 차단은 와일드카드 이름 일치를 통해 위험한 중첩 함수를 실수로 내보내는 것을 방지합니다.
보안 권장 사항: 항상 명시적 이름을 사용하여 모듈 함수를 내보냅니다(와일드카드 문자 없음).
대화형 셸 매개 변수 형식 변환
시스템이 잠겨 있으면 대화형 PowerShell 세션이 모드에서
ConstrainedLanguage
실행되어 임의의 코드 실행을 방지합니다. 세션에 로드된 신뢰할 수 있는 모듈은 모드에서FullLanguage
실행됩니다. 신뢰할 수 있는 모듈 cmdlet이 매개 변수에 복합 형식을 사용하는 경우 변환이 트러스트 경계를 넘어 허용되지 않으면 매개 변수 바인딩 중 형식 변환이 실패할 수 있습니다. PowerShell이 형식 생성자를 실행하여 값을 변환하려고 할 때 오류가 발생합니다. 형식 생성자는 모드에서ConstrainedLanguage
실행할 수 없습니다.이 예제에서는 매개 변수 바인딩 형식 변환이 일반적으로 허용되지만 모드에서
ConstrainedLanguage
실행하면 실패합니다.ConnectionPort
형식 생성자는 허용되지 않습니다.PS> Create-ConnectionOnPort -Connection 22 Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22" value of type "System.Int32" to type "ConnectionPort".
Enter-PSHostProcess
cmdlet 허용 안 함Enter-PSHostProcess
cmdlet을 사용하지 않도록 설정하면 오류가 발생합니다. 이 명령은 연결 및 디버그 세션에 사용됩니다. 로컬 컴퓨터의 다른 PowerShell 세션에 연결할 수 있습니다. 정보 공개 및 임의 코드 실행을 방지하기 위해 cmdlet을 사용할 수 없습니다.
제한된 언어 모드의 PowerShell 제한 사항
앱 제어 정책에서 승인되지 않은 스크립트 또는 함수는 신뢰할 수 없습니다. 신뢰할 수 없는 명령을 실행할 때 PowerShell은 명령의 실행(새 동작)을 차단하거나 모드에서 ConstrainedLanguage
명령을 실행합니다. 모드에 적용되는 제한 사항은 ConstrainedLanguage
다음과 같습니다.
Add-Type
cmdlet 허용 안 함차단
Add-Type
하면 임의의 .NET 코드가 실행되지 않습니다.Import-LocalizedData
cmdlet이 제한됨SupportedCommand 매개 변수를
Import-LocalizedData
차단하면 임의의 코드가 실행되지 않습니다.Invoke-Expression
cmdlet이 제한됨cmdlet에
Invoke-Expression
전달된 모든 스크립트 블록은 임의의 코드 실행을 방지하기 위해 모드에서ConstrainedLanguage
실행됩니다.New-Object
cmdlet이 제한됨New-Object
cmdlet은 신뢰할 수 없는 형식에 대한 액세스를 방지하기 위해 허용되는 .NET 및 COM 형식만 사용하도록 제한됩니다.ForEach-Object
cmdlet 제한승인된 목록에 없는 모든 .NET 형식에 대해 전달된
ForeEach-Object
변수에 대한 형식 메서드 호출이 허용되지 않습니다. 일반적으로 모드는ConstrainedLanguage
신뢰할 수 없는 .NET 형식에 대한 액세스를 방지하기 위해 승인된 .NET 형식을 제외한 모든 개체 메서드 호출을 허용하지 않습니다.Export-ModuleMember
cmdlet 제한cmdlet을 사용하여
Export-ModuleMember
자식 모듈을 신뢰할 수 없고 부모 모듈을 신뢰할 수 있는 중첩된 모듈 스크립트 파일에서 함수를 내보내면 오류가 발생합니다. 이 시나리오를 차단하면 신뢰할 수 없는 악의적인 모듈이 신뢰할 수 있는 모듈에서 위험한 함수를 내보낼 수 없습니다.New-Module
cmdlet 제한신뢰할 수 있는 스크립트에서 실행하는
New-Module
경우 매개 변수에서ScriptBlock
제공하는 모든 스크립트 블록은 임의의 코드를 신뢰할 수 있는ConstrainedLanguage
실행 컨텍스트에 삽입하지 않도록 모드에서 실행되도록 표시됩니다.Configuration
키워드 허용 안 됨언어 키워드는
Configuration
코드 삽입 공격을 방지하기 위해 모드에서ConstrainedLanguage
허용되지 않습니다.class
키워드 허용 안 됨언어 키워드는
class
임의의 코드가 삽입되지 않도록 모드에서ConstrainedLanguage
허용되지 않습니다.스크립트 블록 처리 범위 제한
스크립트 블록의 신뢰 수준이 서로 다른 경우 자식 스크립트 블록은 부모 스크립트 블록 범위에서 실행할 수 없습니다. 예를 들어 한 스크립트를 다른 스크립트로 도트 소스로 만들 때 자식 관계를 만듭니다. 이 시나리오를 차단하면 신뢰할 수 없는 스크립트가 신뢰할 수 있는 스크립트 범위에서 위험한 함수에 액세스하지 못하게 됩니다.
신뢰할 수 없는 스크립트 함수의 명령 검색 방지
PowerShell 명령 검색은 신뢰할 수 없는 원본(예: 신뢰할 수 없는 스크립트 또는 모듈)의 함수를 신뢰할 수 있는 함수로 반환하지 않습니다. 신뢰할 수 없는 명령의 검색을 차단하면 명령 심기에서 코드 삽입을 방지할 수 있습니다.
해시 테이블을 개체로 변환할 수 없음
ConstrainedLanguage
모드 블록은 잠재적인 코드 삽입 공격을 방지하기 위해 PowerShell 데이터(.psd1
) 파일 섹션에서 개체 변환Data
으로 해시할 수 있습니다.자동 형식 변환이 제한됨
ConstrainedLanguage
모드는 잠재적인 코드 삽입 공격을 방지하기 위해 승인된 안전한 형식의 작은 집합을 제외하고 자동 형식 변환을 차단합니다.암시적 모듈 함수 내보내기 제한
모듈이 함수를 명시적으로 내보내지 않으면 PowerShell은 정의된 모든 모듈 함수를 편의 기능으로 자동으로 암시적으로 내보냅니다. 모드에서는
ConstrainedLanguage
모듈이 트러스트 경계를 넘어 로드될 때 암시적 내보내기가 더 이상 발생하지 않습니다. 암시적 내보내기 차단은 퍼블릭 사용을 위한 것이 아닌 위험한 모듈 함수의 의도하지 않은 노출을 방지합니다.스크립트 파일을 모듈로 가져올 수 없습니다.
PowerShell을 사용하면 스크립트 파일(
.ps1
)을 모듈로 가져올 수 있습니다. 정의된 모든 함수는 공개적으로 액세스할 수 있게 됩니다.ConstrainedLanguage
모드는 위험한 스크립트 함수의 의도하지 않은 노출을 방지하기 위해 스크립트 파일의 가져오기를 차단합니다.변수
AllScope
제한 설정ConstrainedLanguage
모드는 변수에서 설정하는AllScope
기능을 사용하지 않도록 설정합니다. 변수 범위를 제한하면 변수가 신뢰할 수 있는 명령의 세션 상태를 방해하지 않습니다.형식 메서드 호출이 허용되지 않음
ConstrainedLanguage
모드는 승인되지 않은 형식에 대한 메서드 호출을 허용하지 않습니다. 승인되지 않은 형식에서 메서드를 차단하면 위험하거나 코드 삽입을 허용할 수 있는 .NET 형식 메서드를 호출할 수 없습니다.형식 속성 setter가 허용되지 않음
ConstrainedLanguage
모드는 승인되지 않은 형식에서 속성 setter의 호출을 제한합니다. 승인되지 않은 형식에서 속성 setter를 차단하면 코드 삽입 공격을 방지할 수 있습니다.형식 생성이 허용되지 않음
ConstrainedLanguage
모드는 승인되지 않은 형식에 대한 형식 생성을 차단하여 코드 삽입을 허용할 수 있는 신뢰할 수 없는 생성자를 차단합니다.모듈 범위 연산자가 허용되지 않음
ConstrainedLanguage
모드에서는 모듈 범위 연산자를 사용할 수 없습니다. 예:& (Get-Module MyModule) MyFunction
모듈 범위 연산자를 차단하면 모듈 프라이빗 함수 및 변수에 액세스할 수 없습니다.
추가 참고 자료
- PowerShell 언어 모드에 대한 자세한 내용은 about_Language_Modes 참조하세요.
- App Control을 구성하고 사용하는 방법에 대한 자세한 내용은 PowerShell용 App Control을 사용하는 방법을 참조하세요.
PowerShell