Praktik terbaik penggunaan MSBuild yang aman

MSBuild sangat dapat disesuaikan dan dapat diperluas (lihat Menyesuaikan build Anda untuk detailnya), jadi perawatan khusus harus dibayarkan ke konfigurasi lingkungan dan build yang tepat.

Membatasi akses Tulis ke lokasi penginstalan

Instal MSBuild (baik dengan Visual Studio, SDK .NET, atau mandiri) ke lokasi di mana hanya pengguna tepercaya yang memiliki akses tulis.

Anda dapat mengubah logika build dengan mengubah atau menambahkan berbagai file biner dan XML yang ditempatkan di samping MSBuild executable, dan ke subfolder MSBuild executable. Oleh karena itu, hanya pengguna tepercaya yang harus diizinkan untuk menulis ke folder.

Jalankan build hanya pada sumber yang Anda kenal dan tinjau

Jalankan MSBuild (untuk membangun dan memulihkan proyek, tetapi juga untuk membuka proyek di Visual Studio) hanya pada sumber yang sepenuhnya Anda percayai.

Logika MSBuild dapat diperluas dalam file skrip build, termasuk file proyek Anda, sehingga logika build yang tidak diketahui harus diasumsikan mampu mengeksekusi kode arbitrer di lingkungan build.

Jalankan build Anda di lokasi khusus yang terverifikasi

MSBuild dapat secara otomatis menyertakan logika dari folder proyek atau solusi Anda dan folder induk apa pun hingga akar drive. Ini termasuk .user file, [before|after].{solution}.targets file, file, Directory.Build.[props|targets|rsp] dan lainnya.

Pastikan hanya pengguna atau akun yang berwenang yang memiliki akses tulis ke lokasi dengan file terkait build Anda dan folder apa pun dalam struktur hierarkis hingga akar drive.

Untuk mencegah penyertaan yang tidak diinginkan dari Directory.Build.[props|targets|rsp], Anda dapat menyertakan file tersebut di akar sumber Anda. File dapat menjadi elemen MSBuild Project kosong.

Mengetahui dan meninjau paket yang direferensikan dan umpan asal

Logika build dapat diperluas secara otomatis oleh paket NuGet. Logika tersebut dijalankan setelah pemulihan, yang mencakup logika ke dalam eksekusi build atau kompilasi Anda. Pastikan Anda terbiasa dengan jenis aset paket NuGet dan perannya selama build, kompilasi, dan runtime. Secara khusus build, , buildTransitivebuildMultitargeting dan analyzers aset secara otomatis dicolokkan ke (dan dieksekusi secara otomatis selama) build, kecuali jika mereka secara eksplisit memilih keluar.

Gunakan ExcludeAssets setiap kali Anda tidak memerlukan logika ekstensi build atau compiler dari paket yang direferensikan (atau bahkan lebih baik, hanya secara IncludeAssets eksplisit logika build jika Anda menginginkannya).

Pastikan Anda terbiasa dengan dokumentasi dan panduan saat ini dari tim NuGet. PackageReference Lihat dokumen dalam file proyek sebagai sumber otoritatif untuk masalah ini.

Mengetahui dan meninjau build memulai skrip/proses

Logika build dapat dipengaruhi oleh argumen baris perintah atau variabel lingkungan, terutama yang dapat mengakibatkan injeksi plugin (misalnya, pencatat kustom) atau logika build (misalnya, skrip build di MSBuildUserExtensionsPath). Pastikan Anda mengetahui argumen baris perintah dan variabel lingkungan apa yang diterapkan ke proses MSBuild. Dengan begitu Anda akan lebih memahami bagaimana logika build terpengaruh.

Menggunakan akun dan sesi pengguna khusus untuk menjalankan build Anda

Jangan jalankan di bawah akun yang dapat digunakan pada sistem yang sama untuk sebelumnya menjalankan proses atau skrip yang tidak diketahui, termasuk build yang berbeda. Terutama jika build yang tidak terkait di bawah akun pengguna yang sama mungkin telah berjalan pada sumber yang tidak sepenuhnya tepercaya dan diketahui.

MSBuild dapat sumber logika dari berbagai lokasi dari profil pengguna (khususnya MSBuild SDK secara otomatis menyertakan logika build yang terletak di lokasi MSBuildUserExtensionsPath ), atau dari lokasi yang dapat disuntikkan oleh variabel lingkungan (Anda dapat menyesuaikan MSBuildUserExtensionsPath dengan properti MSBuild dengan nama yang sama. Properti tersebut tidak memiliki nilai default, sehingga dapat bersumber dari variabel lingkungan dengan nama yang sama).

Nota

Sebagai detail implementasi, MSBuild menemukan dan berkomunikasi dengan proses persistennya melalui pipa dan muteks bernama. Pada Windows, pipa dan mutex bernama ini berbagi namespace layanan di seluruh komputer. Jadi, proses di bawah akun lokal lain dapat menempati nama-nama tersebut dan memblokir build Anda untuk membuatnya. Situasi ini hanya menjadi perhatian ketersediaan (penolakan layanan). Kontrol akses OS masih mencegah akun lain membaca atau mengubah build. Pilih komputer tempat semua akun lokal tepercaya, atau sesi, kontainer, atau VM yang terisolasi.