Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule wyjaśniono, jak usługa App Control dla firm zabezpiecza program PowerShell i nakładane ograniczenia. Bezpieczne zachowanie programu PowerShell różni się w zależności od używanej wersji systemu Windows i programu PowerShell.
Jak program PowerShell wykrywa zasady blokady systemu
Program PowerShell wykrywa zarówno zasady dotyczące funkcji AppLocker , jak i kontroli aplikacji dla firm . Funkcja AppLocker jest przestarzała. App Control to preferowany system sterowania aplikacjami dla systemu Windows.
Wykrywanie wymuszania zasad starszej wersji kontroli aplikacji
Program PowerShell używa starszego interfejsu API sterowania WldpGetLockdownPolicy
aplikacjami do odnajdywania dwóch rzeczy:
- Wymuszanie zasad dla całego systemu:
None
, ,Audit
Enforce
- Zasady dotyczące poszczególnych plików:
None
,Audit
(dozwolone przez zasady),Enforce
(niedozwolone przez zasady)
Wszystkie wersje programu PowerShell (wersja 5.1 — wersja 7.x) obsługują wykrywanie zasad kontroli aplikacji.
Najnowsze wykrywanie wymuszania zasad kontroli aplikacji
Usługa App Control wprowadziła nowe interfejsy API w ostatnich wersjach systemu Windows. Począwszy od wersji 7.3, program PowerShell używa nowego WldpCanExecuteFile
interfejsu API do decydowania o tym, jak powinien być obsługiwany plik. Program Windows PowerShell 5.1 nie obsługuje tego nowego interfejsu API. Nowy interfejs API ma pierwszeństwo przed starszym interfejsem API dla poszczególnych plików.
Jednak program PowerShell nadal używa starszego interfejsu API, aby uzyskać konfigurację zasad całego systemu. Jeśli nowy interfejs API nie jest dostępny, program PowerShell powraca do starego zachowania interfejsu API.
Nowy interfejs API zawiera następujące informacje dla każdego pliku:
WLDP_CAN_EXECUTE_ALLOWED
WLDP_CAN_EXECUTE_BLOCKED
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
Zachowanie programu PowerShell w zasadach blokady
Program PowerShell może działać zarówno w trybach interaktywnych, jak i nieinterakcyjnych.
- W trybie interaktywnym program PowerShell to aplikacja wiersza polecenia, która pobiera użytkownikom dane wejściowe wiersza polecenia jako polecenia lub skrypty do uruchomienia. Wyniki są wyświetlane z powrotem do użytkownika.
- W trybie nieinterakcyjnym program PowerShell ładuje moduły i uruchamia pliki skryptów bez danych wejściowych użytkownika. Strumienie danych wynikowych są ignorowane lub przekierowywane do pliku.
Tryb interaktywny działający w ramach wymuszania zasad
Program PowerShell uruchamia polecenia w ConstrainedLanguage
trybie. Ten tryb uniemożliwia interakcyjnym użytkownikom uruchamianie określonych poleceń lub wykonywanie dowolnego kodu. Aby uzyskać więcej informacji na temat ograniczeń w tym trybie, zobacz sekcję Ograniczenia programu PowerShell w sekcji zasad blokady tego artykułu.
Tryb nieinteraktywny uruchomiony w ramach wymuszania zasad
Gdy program PowerShell uruchamia skrypt lub ładuje moduł, używa interfejsu API kontroli aplikacji, aby uzyskać wymuszanie zasad dla pliku.
Program PowerShell w wersji 7.3 lub nowszej używa interfejsu WldpCanExecuteFile
API, jeśli jest dostępny. Ten interfejs API zwraca jeden z następujących wyników:
-
WLDP_CAN_EXECUTE_ALLOWED
: plik jest zatwierdzony przez zasady i jest używany wFullLanguage
trybie z kilkoma ograniczeniami. -
WLDP_CAN_EXECUTE_BLOCKED
: plik nie jest zatwierdzony przez zasady. Program PowerShell zgłasza błąd podczas uruchamiania lub ładowania pliku. -
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
: plik nie jest zatwierdzony przez zasady, ale nadal można go uruchomić lub załadować wConstrainedLanguage
trybie.
W programie Windows PowerShell 5.1 lub jeśli WldpCanExecuteFile
interfejs API jest niedostępny, zachowanie programu PowerShell na plik jest następujące:
-
None
: Plik jest uruchamiany wFullLanguage
trybie z kilkoma ograniczeniami. -
Audit
: plik jest uruchamiany lub ładowany wFullLanguage
trybie bez ograniczeń. W programie PowerShell 7.4 lub nowszym zasady rejestruje informacje o ograniczeniach w dziennikach zdarzeń systemu Windows. -
Enforce
: plik jest uruchamiany lub ładowany wConstrainedLanguage
trybie.
Ograniczenia programu PowerShell w zasadach blokady
Gdy program PowerShell wykryje, że system jest objęty zasadami blokady kontroli aplikacji, stosuje ograniczenia, nawet jeśli skrypt jest zaufany i działa w FullLanguage
trybie. Te ograniczenia uniemożliwiają znane zachowania programu PowerShell, które mogą spowodować dowolne wykonanie kodu w zablokowanym systemie. Zasady blokady wymuszają następujące ograniczenia:
Określanie źródła w module z ograniczeniem eksportu funkcji wieloznacznych
Każdy moduł, który używa funkcji określania źródła i eksportowania skryptów przy użyciu nazw symboli wieloznacznych, powoduje wystąpienie błędu. Blokowanie eksportów symboli wieloznacznych uniemożliwia wstrzyknięcie skryptu przez złośliwego użytkownika, który może umieścić niezaufany skrypt, który pobiera kropkę źródłową do zaufanego modułu. Złośliwy skrypt może następnie uzyskać dostęp do funkcji prywatnych modułu zaufanego.
Zalecenie dotyczące zabezpieczeń: Nigdy nie używaj skryptu dot-source w module i zawsze eksportuj funkcje modułu z jawnymi nazwami (bez symboli wieloznacznych).
Zagnieżdżony moduł z ograniczeniem eksportu funkcji z symbolami wieloznacznymi
Jeśli moduł nadrzędny eksportuje funkcje przy użyciu symboli wieloznacznych nazwy funkcji, program PowerShell usunie dowolną nazwę funkcji w zagnieżdżonym module z listy eksportu funkcji. Blokowanie eksportów symboli wieloznacznych z zagnieżdżonych modułów uniemożliwia przypadkowe eksportowanie niebezpiecznych funkcji zagnieżdżonych za pomocą dopasowywania nazw symboli wieloznacznych.
Zalecenie dotyczące zabezpieczeń: Zawsze eksportuj funkcje modułu z jawnymi nazwami (bez symboli wieloznacznych).
Konwersja typu parametru interakcyjnej powłoki
Gdy system jest zablokowany, interaktywne sesje programu PowerShell działają w
ConstrainedLanguage
trybie, aby zapobiec dowolnemu wykonaniu kodu. Zaufane moduły załadowane do sesji działają wFullLanguage
trybie. Jeśli polecenie cmdlet zaufanego modułu używa typów złożonych dla swoich parametrów, konwersja typów podczas wiązania parametrów może zakończyć się niepowodzeniem, jeśli konwersja nie jest dozwolona przez granice zaufania. Błąd występuje, gdy program PowerShell próbuje przekonwertować wartość, uruchamiając konstruktor typu. Konstruktory typów nie mogą działać wConstrainedLanguage
trybie.W tym przykładzie konwersja typu powiązania parametrów jest zwykle dozwolona, ale kończy się niepowodzeniem po uruchomieniu w
ConstrainedLanguage
trybie. KonstruktorConnectionPort
typu nie jest dozwolony: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
polecenie cmdlet niedozwolonePolecenie
Enter-PSHostProcess
cmdlet jest wyłączone i zgłasza błąd w przypadku użycia. To polecenie jest używane na potrzeby sesji dołączania i debugowania. Umożliwia nawiązywanie połączenia z dowolną inną sesją programu PowerShell na komputerze lokalnym. Polecenie cmdlet jest wyłączone, aby zapobiec ujawnieniu informacji i dowolnemu wykonaniu kodu.
Ograniczenia programu PowerShell w trybie ograniczonego języka
Skrypt lub funkcja, która nie jest zatwierdzona przez zasady kontroli aplikacji, jest niezaufany. Po uruchomieniu niezaufanego polecenia program PowerShell blokuje uruchamianie polecenia (nowe zachowanie) lub uruchomienie polecenia w ConstrainedLanguage
trybie. Następujące ograniczenia dotyczą ConstrainedLanguage
trybu:
Add-Type
polecenie cmdlet niedozwoloneBlokowanie
Add-Type
uniemożliwia wykonywanie dowolnego kodu platformy .NET.Import-LocalizedData
polecenie cmdlet z ograniczeniamiZablokowanie parametru SupportedCommand polecenia
Import-LocalizedData
uniemożliwia wykonanie dowolnego kodu.Invoke-Expression
polecenie cmdlet z ograniczeniamiWszystkie bloki skryptu przekazywane do polecenia cmdlet są uruchamiane w
Invoke-Expression
trybie, aby zapobiec dowolnemu wykonaniuConstrainedLanguage
kodu.New-Object
polecenie cmdlet z ograniczeniamiPolecenie
New-Object
cmdlet jest ograniczone do używania tylko dozwolonych typów .NET i COM, aby uniemożliwić dostęp do niezaufanych typów.ForEach-Object
ograniczenie polecenia cmdletWywołanie metody typu dla zmiennych przekazanych do
ForeEach-Object
elementu jest niedozwolone dla dowolnego typu platformy .NET, który nie znajduje się na liście zatwierdzonych. Ogólnie rzecz biorąc,ConstrainedLanguage
tryb nie zezwala na wywołanie dowolnej metody obiektu z wyjątkiem zatwierdzonych typów platformy .NET, aby zapobiec dostępowi do niezaufanych typów platformy .NET.Export-ModuleMember
ograniczenie polecenia cmdletUżycie
Export-ModuleMember
polecenia cmdlet do eksportowania funkcji w pliku skryptu zagnieżdżonego modułu, w którym moduł podrzędny nie jest zaufany, a moduł nadrzędny jest zaufany, powoduje wystąpienie błędu. Blokowanie tego scenariusza uniemożliwia złośliwemu niezaufanemu modułowi eksportowanie niebezpiecznych funkcji z zaufanego modułu.New-Module
ograniczenie polecenia cmdletPo uruchomieniu
New-Module
w zaufanym skrypecie każdy blok skryptu dostarczony przezScriptBlock
parametr jest oznaczony do uruchamiania w trybie,ConstrainedLanguage
aby zapobiec wstrzyknięciu dowolnego kodu do zaufanego kontekstu wykonywania.Configuration
niedozwolone słowo kluczoweSłowo
Configuration
kluczowe języka nie jest dozwolone wConstrainedLanguage
trybie, aby zapobiec atakom polegającym na wstrzyknięciu kodu.class
niedozwolone słowo kluczoweSłowo
class
kluczowe języka nie jest dozwolone wConstrainedLanguage
trybie, aby zapobiec wstrzyknięciu dowolnego kodu.Ograniczenia zakresu przetwarzania bloków skryptów
Bloki skryptów podrzędnych nie mogą być uruchamiane w zakresach bloków skryptu nadrzędnego, jeśli bloki skryptu mają różne poziomy zaufania. Można na przykład utworzyć relację podrzędną, gdy jeden skrypt jest umieszczany w źródle. Blokowanie tego scenariusza uniemożliwia niezaufanym skryptowi uzyskanie dostępu do niebezpiecznych funkcji w zakresie zaufanego skryptu.
Zapobieganie odnajdowaniu poleceń funkcji niezaufanych skryptów
Odnajdywanie poleceń programu PowerShell nie zwraca funkcji z niezaufanego źródła, takiego jak niezaufany skrypt lub moduł, do zaufanej funkcji. Blokowanie odnajdywania niezaufanych poleceń uniemożliwia wstrzyknięcie kodu za pomocą sadzenia poleceń.
Niedozwolona konwersja skrótu na obiekt
ConstrainedLanguage
tryb blokuje tabelę skrótów do konwersji obiektów wData
sekcjach plików danych programu PowerShell (.psd1
), aby zapobiec potencjalnym atakom polegającym na wstrzyknięciu kodu.Automatyczna konwersja typów ograniczona
ConstrainedLanguage
tryb blokuje automatyczną konwersję typów z wyjątkiem małego zestawu zatwierdzonych typów bezpiecznych, aby zapobiec potencjalnym atakom polegającym na wstrzyknięciu kodu.Niejawne ograniczenie eksportu funkcji modułu
Jeśli moduł nie eksportuje jawnie funkcji, program PowerShell niejawnie eksportuje wszystkie zdefiniowane funkcje modułu automatycznie jako funkcję wygody. W
ConstrainedLanguage
trybie niejawne eksporty nie są już wykonywane, gdy moduł jest ładowany przez granice zaufania. Blokowanie niejawnych eksportów uniemożliwia niezamierzone narażenie niebezpiecznych funkcji modułu, które nie są przeznaczone do użytku publicznego.Nie można zaimportować plików skryptów jako modułów
Program PowerShell umożliwia importowanie plików skryptów (
.ps1
) jako modułu. Wszystkie zdefiniowane funkcje stają się publicznie dostępne.ConstrainedLanguage
tryb blokuje import pliku skryptu, aby zapobiec niezamierzonemu narażeniu na niebezpieczne funkcje skryptu.Ustawianie ograniczeń zmiennych
AllScope
ConstrainedLanguage
tryb wyłącza możliwość ustawianiaAllScope
zmiennych. Ograniczenie zakresu zmiennych uniemożliwia zakłócanie stanu sesji zaufanych poleceń.Wywołanie metody typu jest niedozwolone
ConstrainedLanguage
tryb nie zezwala na wywołanie metody dla niezatwierdzonych typów. Metody blokujące w typach niezatwierdzonych uniemożliwiają wywołanie metod typu .NET, które mogą być niebezpieczne lub zezwalają na iniekcję kodu.Niedozwolone metody ustawiania właściwości typów
ConstrainedLanguage
tryb ogranicza wywoływanie zestawów właściwości dla niezatwierdzonych typów. Blokowanie zestawów właściwości na niezatwierdzonych typach zapobiega atakom polegającym na wstrzyknięciu kodu.Tworzenie typu jest niedozwolone
ConstrainedLanguage
tryb blokuje tworzenie typu dla niezatwierdzonych typów w celu blokowania niezaufanych konstruktorów, które mogą zezwalać na iniekcję kodu.Operator zakresu modułu jest niedozwolony
ConstrainedLanguage
tryb nie zezwala na korzystanie z operatora zakresu modułu. Na przykład:& (Get-Module MyModule) MyFunction
. Blokowanie operatora zakresu modułu uniemożliwia dostęp do prywatnych funkcji i zmiennych modułu.
Dalsze informacje
- Aby uzyskać więcej informacji na temat trybów języka programu PowerShell, zobacz about_Language_Modes.
- Aby uzyskać informacje na temat konfigurowania i używania kontrolki aplikacji, zobacz How to use App Control for PowerShell (Jak używać kontrolki aplikacji dla programu PowerShell).