Udostępnij przez


Najlepsze rozwiązania dotyczące bezpiecznego użycia programu MSBuild

Program MSBuild jest wysoce dostosowywalny i rozszerzalny (zobacz Dostosowywanie kompilacji aby uzyskać szczegółowe informacje), dlatego szczególną ostrożność należy zwracać uwagę na właściwą konfigurację środowiska i budowania.

Ogranicz dostęp do zapisu w lokalizacji instalacji

Zainstaluj program MSBuild (zarówno z programem Visual Studio, zestawem .NET SDK, jak i autonomicznym) w lokalizacji, w której tylko zaufani użytkownicy mają dostęp do zapisu.

Logikę kompilacji można zmienić, zmieniając lub dodając różne pliki binarne i XML umieszczone obok pliku wykonywalnego MSBuild oraz do podfolderów pliku wykonywalnego MSBuild. W związku z tym tylko zaufani użytkownicy powinni mieć możliwość zapisu w folderze.

Uruchamiaj kompilację tylko dla źródeł, które znasz i przejrzałeś.

Uruchom program MSBuild (na potrzeby kompilowania i przywracania projektów, ale także otwierania projektów w programie Visual Studio) tylko dla źródeł, którym w pełni ufasz.

Logikę MSBuild można rozszerzyć w plikach skryptów kompilacji, w tym w plikach projektu, dlatego należy założyć, że nieznana logika kompilacji może wykonywać dowolny kod w środowisku kompilacji.

Uruchom kompilację w zweryfikowanej, dedykowanej lokalizacji

Program MSBuild może automatycznie dołączać logikę z folderu projektu lub rozwiązania i dowolnego folderu nadrzędnego do katalogu głównego dysku. Obejmuje to .user pliki, [before|after].{solution}.targets pliki, Directory.Build.[props|targets|rsp] pliki i inne.

Upewnij się, że tylko autoryzowani użytkownicy lub konta mają dostęp do zapisu w lokalizacji z plikami powiązanymi z kompilacją i dowolnym folderem w strukturze hierarchicznej aż do katalogu głównego dysku.

Aby zapobiec niezamierzonemu włączeniu Directory.Build.[props|targets|rsp], można umieścić takie pliki w katalogu głównym źródeł. Plik może być pustym elementem MSBuild Project .

Poznaj i przejrzyj przywołane pakiety oraz źródłowe kanały dystrybucji

Logika kompilacji może być automatycznie rozszerzana przez pakiety NuGet. Taka logika jest wykonywana podczas przywracania, co włącza ją do procesu budowania lub kompilacji. Upewnij się, że znasz typy zasobów pakietów NuGet i ich rolę podczas budowania, kompilacji i czasu działania. W szczególności zasoby build, buildTransitive, buildMultitargeting i analyzers są automatycznie podłączane do procesu (a więc automatycznie wykonywane podczas) budowania, chyba że zdecyduje się z nich zrezygnować.

Używaj ExcludeAssets zawsze, gdy nie potrzebujesz logiki rozszerzenia kompilacji lub kompilatora z pakietu, do którego odwołujesz się (lub jeszcze lepiej, tylko jawnie IncludeAssets logiki kompilacji, jeśli chcesz).

Upewnij się, że znasz bieżącą dokumentację i wskazówki od zespołu NuGet. Zapoznaj się z dokumentem PackageReference w plikach projektu jako autorytatywnym źródłem tego problemu.

Znajomość i przeglądanie skryptu/procesu uruchamiania kompilacji

Logika kompilacji może mieć wpływ na argumenty wiersza polecenia lub zmienne środowiskowe, zwłaszcza te, które mogą spowodować wstrzyknięcie wtyczek (na przykład niestandardowych rejestratorów) lub logikę kompilacji (na przykład skrypty kompilacji w programie MSBuildUserExtensionsPath). Upewnij się, że wiesz, jakie argumenty wiersza polecenia i zmienne środowiskowe są stosowane do procesu MSBuild. Dzięki temu lepiej zrozumiesz, jak ma to wpływ na logikę kompilacji.

Uruchamianie kompilacji przy użyciu dedykowanego konta użytkownika i sesji

Nie uruchamiaj konta, które może być używane w tym samym systemie do wcześniejszego uruchamiania nieznanych procesów lub skryptów, w tym innej kompilacji. Zwłaszcza jeśli niepowiązana kompilacja na tym samym koncie użytkownika może być uruchamiana w źródłach, które nie są w pełni zaufane i znane.

Program MSBuild może pobierać logikę z różnych lokalizacji w profilu użytkownika (w szczególności zestaw MSBuild SDK automatycznie zawiera logikę kompilacji znajdującą się w lokalizacji MSBuildUserExtensionsPath), lub z lokalizacji wprowadzanych za pomocą zmiennych środowiskowych (można dostosować, stosując właściwość MSBuild o tej samej nazwie. Taka właściwość nie ma wartości domyślnej, więc można ją pobrać ze zmiennej środowiskowej tej samej nazwy).

  • MSBuildExtensionsPath i MSBuildUserExtensionsPath: możesz ustawić ImportUserLocationsByWildcardBefore{ImportingFileNameWithNoDots} właściwość na false, aby zrezygnować z automatycznego dołączania określonego mechanizmu logiki budowania rozszerzeń.