Use BinSkim para examinar arquivos binários para identificar vulnerabilidades
Use BinSkim para examinar arquivos binários para identificar práticas de codificação e construção que podem potencialmente tornar o binário vulnerável. Ele pode ser usado para verificar binários que estão se preparando para ser enviados, para ajudar a validar que nada deu errado na cadeia de compilação.
BinSkim verifica:
- Uso de conjuntos de ferramentas de compilador desatualizados - Os binários devem ser compilados em relação aos conjuntos de ferramentas de compilador mais recentes sempre que possível para maximizar o uso de mitigações de segurança atuais no nível do compilador e fornecidas pelo sistema operacional.
- Configurações de compilação inseguras - Os binários devem ser compilados com as configurações mais seguras possíveis para permitir mitigações de segurança fornecidas pelo sistema operacional, maximizar erros do compilador e relatórios de avisos acionáveis, entre outras coisas.
- Problemas de assinatura - Os binários assinados devem ser assinados com algoritmos criptograficamente fortes.
BinSkim é uma ferramenta de código aberto e gera arquivos de saída que usam o formato Static Analysis Results Interchange Format (SARIF). BinSkim substitui a antiga ferramenta BinScope.
Para obter mais informações sobre BinSkim, consulte o BinSkim User Guide.
Instalar e executar BinSkim
Siga estas etapas para validar se as opções de compilação de segurança estão configuradas corretamente no código que você está enviando.
Baixe e instale o SDK do .NET Core multiplataforma.
Confirme se o Visual Studio está instalado. Para obter informações sobre como baixar e instalar o Visual Studio, consulte Instalar o Visual Studio.
Há várias opções para baixar BinSkim, como um pacote NuGet. Neste exemplo, usaremos a opção de clone git para baixar a partir daqui: https://github.com/microsoft/binskim e instalá-lo em um PC Windows de 64 bits.
Abra uma janela do Visual Studio Developer Command Prompt e crie um diretório, por exemplo,
C:\binskim-master
.C:\> Md \binskim-master
Mova para o diretório que você acabou de criar.
C:\> Cd \binskim-master
Use o comando git clone para baixar todos os arquivos necessários.
C:\binskim-master> git clone --recurse-submodules https://github.com/microsoft/binskim.git
Mova para o novo diretório
binskim
que o comando clone criou.C:\> Cd \binskim-master\binskim
Execute BuildAndTest.cmd para garantir que a compilação de lançamento seja bem-sucedida e que todos os testes sejam aprovados.
C:\binskim-master\binskim> BuildAndTest.cmd Welcome to .NET Core 3.1! --------------------- SDK Version: 3.1.101 ... C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64\BinSkim.Sdk.dll 1 File(s) copied C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\linux-x64\BinSkim.Sdk.dll 1 File(s) copied ...
O processo de compilação cria um conjunto de diretórios com os executáveis BinSkim. Mova para o diretório de saída de compilação win-x64.
C:\binskim-master\binskim> Cd \binskim-master\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64>
Exiba ajuda para a opção de análise.
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim help analyze
BinSkim PE/MSIL Analysis Driver 1.6.0.0
--sympath Symbols path value, e.g., SRV*http://msdl.microsoft.com/download/symbols or Cache*d:\symbols;Srv*http://symweb. See
https://learn.microsoft.com/windows-hardware/drivers/debugger/advanced-symsrv-use for syntax information. Note that BinSkim will clear the
_NT_SYMBOL_PATH environment variable at runtime. Use this argument for symbol information instead.
--local-symbol-directories A set of semicolon-delimited local directory paths that will be examined when attempting to locate PDBs.
-o, --output File path to which analysis output will be written.
--verbose Emit verbose output. The resulting comprehensive report is designed to provide appropriate evidence for compliance scenarios.
...
Definir o caminho dos símbolos para o BinSkim
Se você estiver criando todo o código que está analisando na mesma máquina em que está executando o BinSkim, normalmente não precisa definir o caminho do símbolo. Isso ocorre porque seus arquivos de símbolo estão disponíveis na caixa local onde você compilou. Se você estiver usando um sistema de compilação mais complexo ou redirecionando seus símbolos para locais diferentes (não ao lado do binário compilado), use --local-symbol-directories
para adicionar esses locais à pesquisa de arquivos de símbolos.
Se o código fizer referência a um binário compilado que não faz parte do código, o sympath do depurador de janela pode ser usado para recuperar símbolos para verificar a segurança dessas dependências de código. Se você encontrar um problema nessas dependências, talvez não seja possível corrigi-los. Mas pode ser útil estar ciente de qualquer possível risco de segurança que você está aceitando ao assumir essas dependências.
Dica
Ao adicionar um caminho de símbolo (que faz referência a um servidor de símbolos em rede), adicione um local de cache local para especificar um caminho local para armazenar em cache os símbolos. Não fazer isso pode comprometer muito o desempenho do BinSkim. O exemplo a seguir especifica um cache local em d:\symbols.
--sympath Cache*d:\symbols;Srv*http://symweb
Para obter mais informações sobre sympath, consulte caminho de símbolos para depuradores do Windows.
Execute o seguinte comando para analisar um binário de driver compilado. Atualize o caminho de destino para apontar para o ficheiro .sys do driver compilado.
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\echo.sys"
Para obter informações adicionais, adicione a opção detalhada como esta.
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys" --verbose
Observação
A opção --verbose produzirá resultados explícitos de sucesso/falha para cada verificação. Se não ativarem o modo detalhado, verão apenas os defeitos que o BinSkim deteta. A opção --verbose normalmente não é recomendada para sistemas de automação reais devido ao aumento do tamanho dos arquivos de log e porque torna mais difícil detetar falhas individuais quando elas ocorrem, pois elas serão incorporadas no meio de um grande número de resultados de "aprovação".
Revise a saída do comando para procurar possíveis problemas. Este exemplo de saída mostra três testes aprovados. Informações adicionais sobre as regras, como BA2002, estão disponíveis no Guia do Usuário BinSkim.
Analyzing... Analyzing 'osrusbfx2.sys'... ... C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys\Debug\osrusbfx2.sys: pass BA2002: 'osrusbfx2.sys' does not incorporate any known vulnerable dependencies, as configured by current policy. C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: pass BA2005: 'osrusbfx2.sys' is not known to be an obsolete binary that is vulnerable to one or more security problems. C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys: pass BA2006: All linked modules of 'osrusbfx2.sys' generated by the Microsoft front-end satisfy configured policy (compiler minimum version 17.0.65501.17013).
Esta saída mostra que o teste BA3001 não é executado, pois a ferramenta indica que o driver não é um binário ELF.
... C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: notapplicable BA3001: 'osrusbfx2.sys' was not evaluated for check 'EnablePositionIndependentExecutable' as the analysis is not relevant based on observed metadata: image is not an ELF binary.
Este resultado mostra um erro para o teste BA2007.
... C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: error BA2007: 'osrusbfx2.sys' disables compiler warning(s) which are required by policy. A compiler warning is typically required if it has a high likelihood of flagging memory corruption, information disclosure, or double-free vulnerabilities. To resolve this issue, enable the indicated warning(s) by removing /Wxxxx switches (where xxxx is a warning id indicated here) from your command line, and resolve any warnings subsequently raised during compilation.
Para habilitar esses avisos no Visual Studio, em C/C++ nas páginas de propriedades do projeto, remova os valores que você não deseja excluir em Desabilitar Avisos Específicos.
As opções de compilação padrão no Visual Studio para projetos de driver podem desabilitar avisos como os seguintes. Estes avisos serão comunicados pela BinSkim.
C4627 - 'descrição': ignorado ao procurar o uso de cabeçalho pré-compilado
C4986 - «declaração»: a especificação da exceção não corresponde à declaração anterior
Para obter mais informações sobre os avisos do compilador, consulte Avisos do Compilador por versão do compilador.