Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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, ,AuditEnforce - 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_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_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 wFullLanguagetrybie 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ć wConstrainedLanguagetrybie.
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 wFullLanguagetrybie z kilkoma ograniczeniami. -
Audit: plik jest uruchamiany lub ładowany wFullLanguagetrybie 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 wConstrainedLanguagetrybie.
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
ConstrainedLanguagetrybie, aby zapobiec dowolnemu wykonaniu kodu. Zaufane moduły załadowane do sesji działają wFullLanguagetrybie. 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ć wConstrainedLanguagetrybie.W tym przykładzie konwersja typu powiązania parametrów jest zwykle dozwolona, ale kończy się niepowodzeniem po uruchomieniu w
ConstrainedLanguagetrybie. KonstruktorConnectionPorttypu 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-PSHostProcesspolecenie cmdlet niedozwolonePolecenie
Enter-PSHostProcesscmdlet 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-Typepolecenie cmdlet niedozwoloneBlokowanie
Add-Typeuniemożliwia wykonywanie dowolnego kodu platformy .NET.Import-LocalizedDatapolecenie cmdlet z ograniczeniamiZablokowanie parametru SupportedCommand polecenia
Import-LocalizedDatauniemożliwia wykonanie dowolnego kodu.Invoke-Expressionpolecenie cmdlet z ograniczeniamiWszystkie bloki skryptu przekazywane do polecenia cmdlet są uruchamiane w
Invoke-Expressiontrybie, aby zapobiec dowolnemu wykonaniuConstrainedLanguagekodu.New-Objectpolecenie cmdlet z ograniczeniamiPolecenie
New-Objectcmdlet jest ograniczone do używania tylko dozwolonych typów .NET i COM, aby uniemożliwić dostęp do niezaufanych typów.ForEach-Objectograniczenie polecenia cmdletWywołanie metody typu dla zmiennych przekazanych do
ForeEach-Objectelementu jest niedozwolone dla dowolnego typu platformy .NET, który nie znajduje się na liście zatwierdzonych. Ogólnie rzecz biorąc,ConstrainedLanguagetryb 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-ModuleMemberograniczenie polecenia cmdletUżycie
Export-ModuleMemberpolecenia 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-Moduleograniczenie polecenia cmdletPo uruchomieniu
New-Modulew zaufanym skrypecie każdy blok skryptu dostarczony przezScriptBlockparametr jest oznaczony do uruchamiania w trybie,ConstrainedLanguageaby zapobiec wstrzyknięciu dowolnego kodu do zaufanego kontekstu wykonywania.Configurationniedozwolone słowo kluczoweSłowo
Configurationkluczowe języka nie jest dozwolone wConstrainedLanguagetrybie, aby zapobiec atakom polegającym na wstrzyknięciu kodu.classniedozwolone słowo kluczoweSłowo
classkluczowe języka nie jest dozwolone wConstrainedLanguagetrybie, 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
ConstrainedLanguagetryb blokuje tabelę skrótów do konwersji obiektów wDatasekcjach plików danych programu PowerShell (.psd1), aby zapobiec potencjalnym atakom polegającym na wstrzyknięciu kodu.Automatyczna konwersja typów ograniczona
ConstrainedLanguagetryb 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
ConstrainedLanguagetrybie 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.ConstrainedLanguagetryb blokuje import pliku skryptu, aby zapobiec niezamierzonemu narażeniu na niebezpieczne funkcje skryptu.Ustawianie ograniczeń zmiennych
AllScopeConstrainedLanguagetryb wyłącza możliwość ustawianiaAllScopezmiennych. Ograniczenie zakresu zmiennych uniemożliwia zakłócanie stanu sesji zaufanych poleceń.Wywołanie metody typu jest niedozwolone
ConstrainedLanguagetryb 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
ConstrainedLanguagetryb 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
ConstrainedLanguagetryb 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
ConstrainedLanguagetryb 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).