Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_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 dalamFullLanguagemode 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 dalamConstrainedLanguagemode.
Di Windows PowerShell 5.1 atau jika WldpCanExecuteFile API tidak tersedia, perilaku per file PowerShell adalah:
-
None: File dijalankan dimuat dalamFullLanguagemode dengan beberapa batasan. -
Audit: File dijalankan atau dimuat dalamFullLanguagemode tanpa batasan. Di PowerShell 7.4 atau yang lebih tinggi, kebijakan mencatat informasi pembatasan ke log peristiwa Windows. -
Enforce: File dijalankan atau dimuat dalamConstrainedLanguagemode.
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
ConstrainedLanguagemode untuk mencegah eksekusi kode sewenang-wenang. Modul tepercaya yang dimuat ke dalam sesi berjalan dalamFullLanguagemode. 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 dalamConstrainedLanguagemode.Dalam contoh ini, konversi jenis pengikatan parameter biasanya diizinkan, tetapi gagal saat dijalankan dalam
ConstrainedLanguagemode.ConnectionPortKonstruktor 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-PSHostProcesscmdlet tidak diizinkanEnter-PSHostProcessCmdlet 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-Typecmdlet tidak diizinkanPemblokiran
Add-Typemencegah eksekusi kode .NET arbitrer.Import-LocalizedDatacmdlet dibatasimencegah eksekusi kode arbitrer.
Invoke-Expressioncmdlet dibatasiSemua blok skrip yang diteruskan ke
Invoke-Expressioncmdlet dijalankan dalamConstrainedLanguagemode untuk mencegah eksekusi kode arbitrer.New-Objectcmdlet dibatasiNew-ObjectCmdlet dibatasi untuk hanya menggunakan jenis .NET dan COM yang diizinkan, untuk mencegah akses ke jenis yang tidak tepercaya.ForEach-Objectpembatasan cmdletPemanggilan metode jenis untuk variabel yang diteruskan ke
ForeEach-Objecttidak diizinkan untuk jenis .NET apa pun yang tidak ada dalam daftar yang disetujui. Secara umum,ConstrainedLanguagemode melarang pemanggilan metode objek apa pun kecuali untuk jenis .NET yang disetujui untuk mencegah akses ke jenis .NET yang tidak tepercaya.Export-ModuleMemberpembatasan cmdletMenggunakan
Export-ModuleMembercmdlet 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-Modulepembatasan cmdletSaat Anda menjalankan
New-Moduledalam skrip tepercaya, blok skrip apa pun yang disediakan olehScriptBlockparameter ditandai untuk dijalankan dalamConstrainedLanguagemode untuk mencegah injeksi kode arbitrer ke dalam konteks eksekusi tepercaya.Configurationkata kunci tidak diperbolehkanKata
Configurationkunci bahasa tidak diizinkan dalamConstrainedLanguagemode untuk mencegah serangan injeksi kode.classkata kunci tidak diperbolehkanKata
classkunci bahasa tidak diizinkan dalamConstrainedLanguagemode 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
ConstrainedLanguagemode memblokir hashtable ke konversi objek diDatabagian file data PowerShell (.psd1) untuk mencegah potensi serangan injeksi kode.Konversi jenis otomatis dibatasi
ConstrainedLanguagemode 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
ConstrainedLanguagemode, 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.ConstrainedLanguagemode memblokir impor file skrip untuk mencegah paparan fungsi skrip berbahaya yang tidak diinginkan.Mengatur pembatasan variabel
AllScopeConstrainedLanguagemode menonaktifkan kemampuan untuk mengaturAllScopepada variabel. Membatasi cakupan variabel mencegah variabel mengganggu status sesi perintah tepercaya.Pemanggilan metode jenis tidak diizinkan
ConstrainedLanguagemode 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
ConstrainedLanguagemode 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
ConstrainedLanguagemode memblokir pembuatan jenis pada jenis yang tidak disetujui untuk memblokir konstruktor yang tidak tepercaya yang dapat memungkinkan injeksi kode.Operator cakupan modul tidak diizinkan
ConstrainedLanguagemode 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
- Untuk informasi selengkapnya tentang mode bahasa PowerShell, lihat about_Language_Modes.
- Untuk informasi tentang cara mengonfigurasi dan menggunakan Kontrol Aplikasi, lihat Cara menggunakan Kontrol Aplikasi untuk PowerShell.