Bagikan melalui


Cara kerja App Control dengan PowerShell

Artikel ini menjelaskan cara App Control for Business mengamankan PowerShell dan pembatasan yang diberlakukannya. Perilaku aman PowerShell bervariasi berdasarkan versi Windows dan PowerShell yang Anda gunakan.

Cara PowerShell mendeteksi kebijakan penguncian sistem

PowerShell mendeteksi kebijakan di seluruh sistem AppLocker dan App Control for Business . AppLocker tidak digunakan lagi. App Control adalah sistem kontrol aplikasi pilihan untuk Windows.

Deteksi penegakan kebijakan Kontrol Aplikasi Warisan

PowerShell menggunakan API Kontrol WldpGetLockdownPolicy Aplikasi warisan untuk menemukan dua hal:

  • Penegakan kebijakan luas sistem: None, , AuditEnforce
  • Kebijakan file individual: None, Audit (diizinkan oleh kebijakan), Enforce (tidak diizinkan oleh kebijakan)

Semua versi PowerShell (v5.1 - v7.x) mendukung deteksi kebijakan Kontrol Aplikasi ini.

Deteksi penegakan kebijakan App Control terbaru

App Control memperkenalkan API baru dalam versi Windows terbaru. Dimulai dengan versi 7.3, PowerShell menggunakan API baru WldpCanExecuteFile untuk memutuskan bagaimana file harus ditangani. Windows PowerShell 5.1 tidak mendukung API baru ini. API baru lebih diutamakan daripada API warisan untuk file individual. Namun, PowerShell terus menggunakan API warisan untuk mendapatkan konfigurasi kebijakan luas sistem. Jika API baru tidak tersedia, PowerShell akan kembali ke perilaku API lama.

API baru menyediakan informasi berikut untuk setiap file:

  • WLDP_CAN_EXECUTE_ALLOWED
  • WLDP_CAN_EXECUTE_BLOCKED
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX

Perilaku PowerShell di bawah kebijakan penguncian

PowerShell dapat berjalan dalam mode interaktif dan non-interaktif.

  • Dalam mode interaktif, PowerShell adalah aplikasi baris perintah yang mengambil input baris perintah pengguna sebagai perintah atau skrip untuk dijalankan. Hasil ditampilkan kembali kepada pengguna.
  • Dalam mode non-interaktif, PowerShell memuat modul dan menjalankan file skrip tanpa input pengguna. Aliran data hasil diabaikan atau dialihkan ke file.

Mode interaktif yang berjalan di bawah penegakan kebijakan

PowerShell menjalankan perintah dalam ConstrainedLanguage mode. Mode ini mencegah pengguna interaktif menjalankan perintah tertentu atau menjalankan kode arbitrer. Untuk informasi selengkapnya tentang pembatasan dalam mode ini, lihat bagian Pembatasan PowerShell di bawah kebijakan penguncian di artikel ini.

Mode noninteraktif yang berjalan di bawah penegakan kebijakan

Saat PowerShell menjalankan skrip atau memuat modul, PowerShell menggunakan API App Control untuk mendapatkan penegakan kebijakan untuk file tersebut.

PowerShell versi 7.3 atau yang lebih tinggi menggunakan WldpCanExecuteFile API jika tersedia. API ini mengembalikan salah satu hasil berikut:

  • WLDP_CAN_EXECUTE_ALLOWED: Kebijakan memungkinkan file untuk digunakan dalam FullLanguage mode dengan beberapa batasan.
  • WLDP_CAN_EXECUTE_BLOCKED: Kebijakan melarang file tersebut. PowerShell melemparkan kesalahan saat file dijalankan atau dimuat.
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: Kebijakan tidak menyetujui file, tetapi dapat dijalankan atau dimuat dalam ConstrainedLanguage mode.

Di Windows PowerShell 5.1 atau jika WldpCanExecuteFile API tidak tersedia, perilaku per file PowerShell adalah:

  • None: File dijalankan dimuat dalam FullLanguage mode dengan beberapa batasan.
  • Audit: File dijalankan atau dimuat dalam FullLanguage mode tanpa batasan. Di PowerShell 7.4 atau yang lebih tinggi, kebijakan mencatat informasi pembatasan ke log peristiwa Windows.
  • Enforce: File dijalankan atau dimuat dalam ConstrainedLanguage mode.

Pembatasan PowerShell di bawah kebijakan penguncian

Ketika PowerShell mendeteksi sistem berada di bawah kebijakan penguncian App Control, powerShell menerapkan pembatasan bahkan jika skrip tepercaya dan berjalan dalam FullLanguage mode. Pembatasan ini mencegah perilaku PowerShell yang diketahui yang dapat mengakibatkan eksekusi kode sewenang-wenang pada sistem terkunci. Kebijakan penguncian memberlakukan pembatasan berikut:

  • Sumber titik modul dengan pembatasan ekspor fungsi kartubebas

    Modul apa pun yang menggunakan script dot-sourcing dan mengekspor fungsi menggunakan nama kartubebas mengakibatkan kesalahan. Memblokir ekspor kartubebas mencegah injeksi skrip dari pengguna berbahaya yang dapat menanam skrip yang tidak tepercaya yang bersumber titik ke dalam modul tepercaya. Skrip berbahaya kemudian dapat memperoleh akses ke fungsi privat modul tepercaya.

    Rekomendasi keamanan: Jangan pernah menggunakan sumber titik skrip dalam modul dan selalu ekspor fungsi modul dengan nama eksplisit (tanpa karakter kartubebas).

  • Modul berlapis dengan pembatasan ekspor fungsi kartubebas

    Jika modul induk mengekspor fungsi menggunakan karakter wildcard nama fungsi, PowerShell menghapus nama fungsi apa pun dalam modul berlapis dari daftar ekspor fungsi. Memblokir ekspor kartubebas dari modul berlapis mencegah ekspor fungsi berlapis berbahaya yang tidak disengaja melalui pencocokan nama kartubebas.

    Rekomendasi keamanan: Selalu ekspor fungsi modul dengan nama eksplisit (tanpa karakter kartubebas).

  • Konversi jenis parameter shell interaktif

    Ketika sistem dikunci, sesi PowerShell interaktif berjalan dalam ConstrainedLanguage mode untuk mencegah eksekusi kode sewenang-wenang. Modul tepercaya yang dimuat ke dalam sesi berjalan dalam FullLanguage mode. Jika cmdlet modul tepercaya menggunakan jenis kompleks untuk parameternya, konversi jenis selama pengikatan parameter dapat gagal jika konversi tidak diizinkan di seluruh batas kepercayaan. Kegagalan terjadi ketika PowerShell mencoba mengonversi nilai dengan menjalankan konstruktor jenis. Konstruktor jenis tidak diizinkan untuk berjalan dalam ConstrainedLanguage mode.

    Dalam contoh ini, konversi jenis pengikatan parameter biasanya diizinkan, tetapi gagal saat dijalankan dalam ConstrainedLanguage mode. ConnectionPort Konstruktor jenis tidak diizinkan:

    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 tidak diizinkan

    Enter-PSHostProcess Cmdlet dinonaktifkan dan melemparkan kesalahan jika digunakan. Perintah ini digunakan untuk sesi attach-and-debug. Ini memungkinkan Anda untuk terhubung ke sesi PowerShell lainnya di komputer lokal. Cmdlet dinonaktifkan untuk mencegah pengungkapan informasi dan eksekusi kode arbitrer.

Pembatasan PowerShell di bawah mode bahasa yang dibatasi

Skrip atau fungsi yang tidak disetujui oleh kebijakan Kontrol Aplikasi tidak tepercaya. Saat Anda menjalankan perintah yang tidak tepercaya, PowerShell memblokir perintah agar tidak berjalan (perilaku baru) atau menjalankan perintah dalam ConstrainedLanguage mode. Pembatasan berikut berlaku untuk ConstrainedLanguage mode:

  • Add-Type cmdlet tidak diizinkan

    Pemblokiran Add-Type mencegah eksekusi kode .NET arbitrer.

  • Import-LocalizedData cmdlet dibatasi

    mencegah eksekusi kode arbitrer.

  • Invoke-Expression cmdlet dibatasi

    Semua blok skrip yang diteruskan ke Invoke-Expression cmdlet dijalankan dalam ConstrainedLanguage mode untuk mencegah eksekusi kode arbitrer.

  • New-Object cmdlet dibatasi

    New-Object Cmdlet dibatasi untuk hanya menggunakan jenis .NET dan COM yang diizinkan, untuk mencegah akses ke jenis yang tidak tepercaya.

  • ForEach-Object pembatasan cmdlet

    Pemanggilan metode jenis untuk variabel yang diteruskan ke ForeEach-Object tidak diizinkan untuk jenis .NET apa pun yang tidak ada dalam daftar yang disetujui. Secara umum, ConstrainedLanguage mode melarang pemanggilan metode objek apa pun kecuali untuk jenis .NET yang disetujui untuk mencegah akses ke jenis .NET yang tidak tepercaya.

  • Export-ModuleMember pembatasan cmdlet

    Menggunakan Export-ModuleMember cmdlet untuk mengekspor fungsi dalam file skrip modul berlapis di mana modul anak tidak tepercaya dan modul induk tepercaya, mengakibatkan kesalahan. Memblokir skenario ini mencegah modul berbahaya yang tidak tepercaya mengekspor fungsi berbahaya dari modul tepercaya.

  • New-Module pembatasan cmdlet

    Saat Anda menjalankan New-Module dalam skrip tepercaya, blok skrip apa pun yang disediakan oleh ScriptBlock parameter ditandai untuk dijalankan dalam ConstrainedLanguage mode untuk mencegah injeksi kode arbitrer ke dalam konteks eksekusi tepercaya.

  • Configuration kata kunci tidak diperbolehkan

    Kata Configuration kunci bahasa tidak diizinkan dalam ConstrainedLanguage mode untuk mencegah serangan injeksi kode.

  • class kata kunci tidak diperbolehkan

    Kata class kunci bahasa tidak diizinkan dalam ConstrainedLanguage mode untuk mencegah injeksi kode arbitrer.

  • Pembatasan cakupan pemrosesan Blok Skrip

    Blok skrip anak tidak diizinkan untuk dijalankan dalam cakupan blok skrip induk jika blok skrip memiliki tingkat kepercayaan yang berbeda. Misalnya, Anda membuat hubungan anak saat Anda membuat satu skrip sumber titik ke skrip lain. Memblokir skenario ini mencegah skrip yang tidak tepercaya mendapatkan akses ke fungsi berbahaya dalam cakupan skrip tepercaya.

  • Mencegah penemuan perintah fungsi skrip yang tidak tepercaya

    Penemuan perintah PowerShell tidak mengembalikan fungsi dari sumber yang tidak tepercaya, seperti skrip atau modul yang tidak tepercaya, ke fungsi tepercaya. Memblokir penemuan perintah yang tidak tepercaya mencegah injeksi kode melalui penanaman perintah.

  • Hashtable ke konversi objek tidak diizinkan

    ConstrainedLanguage mode memblokir hashtable ke konversi objek di Data bagian file data PowerShell (.psd1) untuk mencegah potensi serangan injeksi kode.

  • Konversi jenis otomatis dibatasi

    ConstrainedLanguage mode memblokir konversi jenis otomatis kecuali untuk sekumpulan kecil jenis aman yang disetujui untuk mencegah potensi serangan injeksi kode.

  • Pembatasan ekspor fungsi modul implisit

    Jika modul tidak secara eksplisit mengekspor fungsi, PowerShell secara implisit mengekspor semua fungsi modul yang ditentukan secara otomatis sebagai fitur kenyamanan. Dalam ConstrainedLanguage mode, ekspor implisit tidak lagi terjadi ketika modul dimuat di seluruh batas kepercayaan. Memblokir ekspor implisit mencegah paparan fungsi modul berbahaya yang tidak dimaksudkan untuk penggunaan publik.

  • File skrip tidak dapat diimpor sebagai modul

    PowerShell memungkinkan Anda mengimpor file skrip (.ps1) sebagai modul. Semua fungsi yang ditentukan menjadi dapat diakses publik. ConstrainedLanguage mode memblokir impor file skrip untuk mencegah paparan fungsi skrip berbahaya yang tidak diinginkan.

  • Mengatur pembatasan variabel AllScope

    ConstrainedLanguage mode menonaktifkan kemampuan untuk mengatur AllScope pada variabel. Membatasi cakupan variabel mencegah variabel mengganggu status sesi perintah tepercaya.

  • Pemanggilan metode jenis tidak diizinkan

    ConstrainedLanguage mode tidak mengizinkan pemanggilan metode pada jenis yang tidak disetujui. Metode pemblokiran pada jenis yang tidak disetujui mencegah pemanggilan metode jenis .NET yang mungkin berbahaya atau mengizinkan injeksi kode.

  • Ketik setter properti tidak diperbolehkan

    ConstrainedLanguage mode membatasi pemanggilan setter properti pada jenis yang tidak disetujui. Memblokir setter properti pada jenis yang tidak disetujui mencegah serangan injeksi kode.

  • Pembuatan tipe tidak diperbolehkan

    ConstrainedLanguage mode memblokir pembuatan jenis pada jenis yang tidak disetujui untuk memblokir konstruktor yang tidak tepercaya yang dapat memungkinkan injeksi kode.

  • Operator cakupan modul tidak diizinkan

    ConstrainedLanguage mode tidak mengizinkan penggunaan operator cakupan modul. Misalnya: & (Get-Module MyModule) MyFunction. Memblokir operator cakupan modul mencegah akses ke fungsi dan variabel privat modul.

Bacaan lebih lanjut