Udostępnij za pośrednictwem


Jak działa kontrolka aplikacji za pomocą programu PowerShell

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_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 w FullLanguage 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ć w ConstrainedLanguage 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 w FullLanguage trybie z kilkoma ograniczeniami.
  • Audit: plik jest uruchamiany lub ładowany w FullLanguage 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 w ConstrainedLanguage 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ą w FullLanguage 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ć w ConstrainedLanguage trybie.

    W tym przykładzie konwersja typu powiązania parametrów jest zwykle dozwolona, ale kończy się niepowodzeniem po uruchomieniu w ConstrainedLanguage trybie. Konstruktor ConnectionPort 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 niedozwolone

    Polecenie 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 niedozwolone

    Blokowanie Add-Type uniemożliwia wykonywanie dowolnego kodu platformy .NET.

  • Import-LocalizedData polecenie cmdlet z ograniczeniami

    Zablokowanie parametru SupportedCommand polecenia Import-LocalizedData uniemożliwia wykonanie dowolnego kodu.

  • Invoke-Expression polecenie cmdlet z ograniczeniami

    Wszystkie bloki skryptu przekazywane do polecenia cmdlet są uruchamiane w Invoke-Expression trybie, aby zapobiec dowolnemu wykonaniu ConstrainedLanguage kodu.

  • New-Object polecenie cmdlet z ograniczeniami

    Polecenie 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 cmdlet

    Wywoł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 cmdlet

    Uż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 cmdlet

    Po uruchomieniu New-Module w zaufanym skrypecie każdy blok skryptu dostarczony przez ScriptBlock parametr jest oznaczony do uruchamiania w trybie, ConstrainedLanguage aby zapobiec wstrzyknięciu dowolnego kodu do zaufanego kontekstu wykonywania.

  • Configuration niedozwolone słowo kluczowe

    Słowo Configuration kluczowe języka nie jest dozwolone w ConstrainedLanguage trybie, aby zapobiec atakom polegającym na wstrzyknięciu kodu.

  • class niedozwolone słowo kluczowe

    Słowo class kluczowe języka nie jest dozwolone w ConstrainedLanguage 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 w Data 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ść ustawiania AllScope 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