- Considerar a segurança ao escrever código Go é uma tarefa complexa
- Apresenta algumas práticas concretas que, quando aplicadas continuamente, ajudam a escrever código robusto, seguro e com alto desempenho
Manter a versão do Go atualizada
- É necessário manter atualizada a versão do Go usada no projeto
- Mesmo sem usar os recursos mais recentes da linguagem, ao atualizar a versão do Go você recebe todos os patches de segurança para vulnerabilidades descobertas
- Novas versões do Go também garantem compatibilidade com as dependências mais recentes
- No site de histórico de releases do Go, é possível verificar em qual release foram corrigidos determinados problemas de segurança e CVEs, e atualizar para a versão mais recente no arquivo
go.mod do projeto
- Depois de atualizar a versão do Go, é preciso verificar se não surgiram problemas de compatibilidade e dependência
- É possível usar analisadores estáticos de código para avaliar a qualidade e a segurança do código
vet
- É possível analisar código Go com o comando
go vet, fornecido pelo próprio Go
- Se executado sem argumentos, o comando
go vet roda com todas as opções permitidas por padrão
- Ele faz uma varredura no código-fonte e relata problemas potenciais
- Os problemas mais comuns incluem erros com goroutines, variáveis não utilizadas e trechos de código inacessíveis
staticcheck
- O Staticcheck, um linter de terceiros, encontra bugs, detecta problemas de desempenho e também aplica o estilo da linguagem Go
- Ele explica os problemas encontrados e sugere correções com exemplos
- Além de rodar no pipeline de CI, também pode ser instalado como executável independente para escanear o código localmente
- Verifique a versão instalada e se está tudo pronto para iniciar a varredura
- Se executado sem argumentos, chama todos os analisadores de código por padrão
- Veja um exemplo do que ele pode encontrar no repositório GitHub NGINX Agent
- Os resultados da varredura podem ser classificados em três grupos: pacotes/métodos/funções obsoletos, variáveis/campos não usados e problemas relacionados à qualidade do código
golangci-lint
golangci-lint pode ser instalado com o comando go install
- Verifique a versão para confirmar que a instalação foi concluída com sucesso
- Se chamado sem argumentos, todos os linters serão executados
- Confira quais avisos e sugestões ele mostra no repositório
agent clonado anteriormente
- O linter aponta o arquivo e a linha exatos
- Avalie o código, faça as mudanças necessárias, depois execute o linter novamente e rode todos os testes unitários
- Se os testes passarem, faça commit do código atualizado e envie com push para o remoto
Detecção de condição de corrida
- Pode ocorrer uma condição de corrida quando várias goroutines tentam acessar um recurso ao mesmo tempo
- Ela é detectada quando pelo menos uma das goroutines tenta modificar o recurso
- O Go oferece suporte nativo para testar esses casos usando a ferramenta
test com o argumento -race
- O detector de corrida avalia apenas o código executado e ignora caminhos que não foram executados, por isso é importante rodar antes um analisador estático para garantir que não haja código morto
- Executar testes em paralelo aumenta a chance de detectar problemas de concorrência
Varredura de vulnerabilidades no código-fonte
govulncheck
- Ferramenta que escaneia a base de código em busca de vulnerabilidades conhecidas listadas no banco de dados de CVEs
- É desenvolvida pela equipe do Go, e um banco de dados dedicado a vulnerabilidades em Go fornece as informações ao scanner
- Após instalar a versão mais recente, experimente a funcionalidade básica
- Clone o repositório habit e execute a ferramenta no diretório raiz
- Nenhuma vulnerabilidade é encontrada
- Ao escanear o binário, outras vulnerabilidades podem ser encontradas
- Atualize o Go para a versão mais recente, obtenha as dependências e verifique se o software e suas dependências não possuem CVEs
gosec
- Analisador estático que ajuda a encontrar configurações de código inseguras
- Pode ser executado no sistema local ou no pipeline de CI via GitHub Action
- Há várias opções e regras disponíveis para configurar a varredura
- Depois de clonar um repositório GitHub com código Go para escanear, inicie a varredura no diretório raiz
- No relatório de varredura, é possível ver uma lista de problemas potenciais ordenados por severidade e nível de confiança
- Verifique os CWEs reportados e aprenda mais detalhes sobre as fraquezas listadas
Fuzzing
- Último método para verificar a qualidade do código e encontrar vulnerabilidades
- Trata-se de um teste automatizado especializado que usa cobertura de testes do código para manipular dados de entrada gerados aleatoriamente
- É muito útil para encontrar possíveis falhas de segurança, como buffer overflow, SQL injection, ataques de DoS e ataques XSS
- Como muitas combinações de entrada são geradas automaticamente, o desenvolvedor não precisa pensar manualmente em centenas ou milhares de combinações de dados de entrada
1 comentários
Comentários no Hacker News
govulnchecké uma ferramenta que verifica se código vulnerável é realmente alcançável, sendo mais útil do que apenas inspecionar as dependências do programago vetego test -racegosec