10 pontos por GN⁺ 2024-11-05 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2024-11-05
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 programa
  • Vale lembrar e consultar o projeto capslock do Google
  • Inclui dicas úteis sobre go vet e go test -race
  • Go não é memory-safe, mas é mais fácil escrever código seguro nele do que em outras linguagens
    • Graças à sintaxe clara de Go, é fácil entender o comportamento das funções e as estruturas de dados
    • As ferramentas de IA funcionam bem com Go porque o contexto dentro das funções é claro
  • Semgrep é uma excelente ferramenta que realiza verificações para linguagens e frameworks comuns por meio de análise estática
    • As regras abertas do Semgrep podem ser consultadas no GitHub
  • Levantam-se dúvidas sobre a reputação de segurança do Go
    • Em geral, Go é visto como seguro e estável, em um nível semelhante ao de outras ferramentas como .NET
  • Acabei de conhecer o gosec
  • Mantendo apps em Go por 9 anos, foi possível atualizar facilmente a versão do Go e os módulos
    • O GitHub avisa automaticamente sobre vulnerabilidades e, em 99% dos casos, tudo funciona sem mudanças
  • Go na verdade não é memory-safe
    • A atomicidade só é garantida para valores do tamanho de uma palavra; valores de duas palavras, como ponteiros de interface ou slices, podem comprometer a segurança de memória em cenários de concorrência
  • Go é bom, mas com o aumento recente no uso de genéricos, a legibilidade do código está piorando
    • Ficou mais difícil de ler do que o código Go de antes, que quase não usava genéricos