Boas práticas de utilização segura do MSBuild

O MSBuild é altamente personalizável e extensível (veja Personalizar a sua build para detalhes), por isso deve haver especial atenção à configuração correta do ambiente e da build.

Restringa o acesso de escrita ao local de instalação

Instale o MSBuild (seja com Visual Studio, o SDK .NET ou independente) num local onde apenas utilizadores de confiança tenham acesso à escrita.

Pode alterar a lógica de compilação alterando ou adicionando vários ficheiros binários e XML colocados ao lado do executável MSBuild e das subpastas do executável MSBuild. Portanto, apenas utilizadores de confiança devem poder escrever na pasta.

Executa builds apenas com fontes que conheces e que analisas

Executa o MSBuild (para construir e restaurar projetos, mas também para abrir projetos no Visual Studio) apenas em fontes em que confies totalmente.

A lógica do MSBuild pode ser estendida dentro dos ficheiros de script de compilação, incluindo os ficheiros do projeto, pelo que a lógica de compilação desconhecida deve assumir-se capaz de executar código arbitrário no ambiente de compilação.

Realize a sua montagem num local verificado e dedicado

O MSBuild pode incluir automaticamente lógica de uma pasta do seu projeto ou solução e de qualquer pasta pai até à raiz do disco. Isto inclui .user ficheiros, [before|after].{solution}.targets ficheiros, Directory.Build.[props|targets|rsp] ficheiros e outros.

Certifique-se de que apenas os utilizadores autorizados ou contas têm acesso de escrita à localização com os ficheiros relacionados com a construção e qualquer pasta numa estrutura hierárquica até à raiz do disco.

Para evitar a inclusão não intencional de Directory.Build.[props|targets|rsp], pode incluir tais ficheiros na raiz das suas fontes. O ficheiro pode ser um elemento MSBuild Project vazio.

Conhecer e rever pacotes referenciados e feeds de origem

A lógica de construção pode ser automaticamente estendida por pacotes NuGet. Essa lógica é executada após a restauração, o que inclui a lógica na tua build ou execução da compilação. Certifique-se de que está familiarizado com os tipos de ativos do pacote NuGet e o seu papel durante a compilação, compilação e execução. Especificamente, o build, buildTransitive, buildMultitargeting e analyzers os assets estão a ser automaticamente ligados (e portanto executados automaticamente durante) a build, a menos que estejam a ser explicitamente excluídos.

Usa ExcludeAssets sempre que não precisares da lógica de compilação ou extensão do compilador de um pacote referenciado (ou melhor ainda, só explicitamente IncludeAssets da lógica de compilação se quiseres).

Certifique-se de que está familiarizado com a documentação e orientações atuais da equipa NuGet. Consulte o PackageReference documento in project files como fonte autorizada para este problema.

Conhecer e rever o script/processo inicial da build

A lógica de compilação pode ser afetada por argumentos de linha de comandos ou variáveis de ambiente, especialmente aquelas que podem resultar na injeção de plugins (por exemplo, loggers personalizados) ou lógica de construção (por exemplo, scripts de compilação em MSBuildUserExtensionsPath). Certifique-se de que sabe que argumentos de linha de comandos e variáveis de ambiente são aplicados ao processo do MSBuild. Assim vais perceber melhor como a lógica de construção é afetada.

Use a conta de utilizador dedicada e a sessão para executar a sua build

Não corra com uma conta que pudesse ser usada no mesmo sistema para executar processos ou scripts desconhecidos anteriormente, incluindo uma versão diferente. Especialmente se a build não relacionada com a mesma conta de utilizador pudesse ter corrido em fontes que não são totalmente confiáveis e conhecidas.

O MSBuild pode obter lógica de vários locais a partir do perfil de utilizador (especificamente, o MSBuild SDK inclui automaticamente a lógica de construção localizada na localização MSBuildUserExtensionsPath ), ou de locais injetáveis por variáveis de ambiente (pode personalizar MSBuildUserExtensionsPath com uma propriedade MSBuild com o mesmo nome). Tal propriedade não tem valor predefinido, por isso pode ser obtida da variável de ambiente com o mesmo nome).

Observação

Como detalhe de implementação, o MSBuild localiza e comunica com os seus processos persistentes através de pipes nomeados e mutexes. No Windows, estes pipes nomeados e mutexes partilham um espaço de nomes a nível de máquina. Assim, um processo sob outra conta local pode ocupar esses nomes e impedir que a tua build os crie. Esta situação é apenas uma questão de disponibilidade (negação de serviço). Os controlos de acesso ao sistema operativo continuam a impedir que outra conta leia ou altere a compilação. Prefira uma máquina onde todas as contas locais sejam confiáveis, ou uma sessão isolada, contentor ou VM.

  • MSBuildExtensionsPath e MSBuildUserExtensionsPath: pode definir a ImportUserLocationsByWildcardBefore{ImportingFileNameWithNoDots} propriedade para false optar por não participar na auto-inclusão da lógica de construção específica da extensão.