
Uma ferramenta de análise estática para proteger código Go
O GoKart é uma ferramenta de análise estática para Go que encontra vulnerabilidades usando a forma SSA (atribuição estática única) do código fonte Go. Ela é capaz de rastrear a origem de variáveis e argumentos de funções para determinar se as fontes de entrada são seguras, o que reduz o número de falsos positivos em comparação com outros scanners de segurança Go. Por exemplo, uma consulta SQL que é concatenada com uma variável pode tradicionalmente ser sinalizada como injeção de SQL; no entanto, o GoKart pode descobrir se a variável é realmente uma constante ou equivalente a constante, caso em que não há vulnerabilidade.
O GoKart também ajuda a potencializar o Chariot, a plataforma de segurança da Praetorian que ajuda você a encontrar, gerenciar e corrigir vulnerabilidades em seu código fonte e ambientes em nuvem. O Chariot simplifica a execução de varreduras automatizadas e contínuas do GoKart em seu código fonte. Se você quiser experimentar o GoKart, pode configurar uma conta gratuita do Chariot em minutos clicando aqui.
A análise estática é uma técnica poderosa para encontrar vulnerabilidades no código fonte. No entanto, a abordagem tem sofrido com excesso de ruído - ou seja, muitas ferramentas de análise estática encontram várias "vulnerabilidades" que não são realmente reais. Isso gerou atrito entre desenvolvedores, pois os usuários se cansam das ferramentas "gritando lobo" uma vez demais.
A motivação por trás do GoKart foi abordar isso: poderíamos criar um scanner com taxas de falsos positivos significativamente menores do que as ferramentas existentes? Com base em nossa experimentação, a resposta é sim. Ao aproveitar o rastreamento fonte-a-dreno e SSA, o GoKart é capaz de rastrear a contaminação de variáveis entre atribuições de variáveis, melhorando significativamente a precisão dos achados. Nosso foco é na usabilidade: pragmaticamente, isso significa que otimizamos nossas abordagens para reduzir alarmes falsos.
Para mais informações, leia nosso post no blog.
Você pode instalar o GoKart localmente usando qualquer uma das opções listadas abaixo.
go install$ go install github.com/praetorian-inc/gokart@latest
Baixe o binário para seu sistema operacional na página de lançamentos.
(OPCIONAL) Baixe o arquivo checksums.txt para verificar a integridade do arquivo
# Check the checksum of the downloaded archive
$ shasum -a 256 gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ cat gokart_${VERSION}_${ARCH}_checksums.txt | grep gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ tar -xvf gokart_${VERSION}_${ARCH}.tar.gz
gokart para o seu PATH:$ mv ./gokart /usr/local/bin/
# clone the GoKart repo
$ git clone https://github.com/praetorian-inc/gokart.git
# navigate into the repo directory and build
$ cd gokart
$ go build
# Move the gokart binary into your path
$ mv ./gokart /usr/local/bin
Construa a imagem docker
docker build -t gokart .
Executando o container com uma varredura local (o diretório de varredura local precisa ser montado na imagem do container)
docker run -v /path/to/scan-dir:/scan-dir gokart scan /scan-dir
Executando o container com uma varredura remota (ao especificar uma chave privada para autenticação, ela também precisará ser montada no container)
docker run gokart scan -r https://github.com/praetorian-inc/gokart
# specifying a private key for private repository ssh authentication
docker run -v /path/to/key-dir/:/key-dir gokart scan -r [email protected]:praetorian-inc/gokart.git -k /key-dir/ssh_key
# running without a directory specified defaults to '.'
gokart scan <flags>
gokart scan <directory> <flags>
gokart help
Você pode seguir os passos abaixo para executar o GoKart no Go Test Bench, uma aplicação Go intencionalmente vulnerável da equipe Contrast Security.
# Clone sample vulnerable application
git clone https://github.com/Contrast-Security-OSS/go-test-bench.git
gokart scan go-test-bench/
A saída deve mostrar algumas vulnerabilidades identificadas, cada uma com uma Função Vulnerável e a Fonte de Entrada do Usuário identificada.
Para testar alguns recursos adicionais do GoKart, você pode escanear com as flags de CLI sugeridas abaixo.
# Use verbose flag to show full traces of these vulnerabilities
gokart scan go-test-bench/ -v
# Use globalsTainted flag to ignore whitelisted Sources
# may increase false positive results
gokart scan go-test-bench/ -v -g
# Use debug flag to display internal analysis information
# which is useful for development and debugging
gokart scan go-test-bench/ -d
# Output results in sarif format
gokart scan go-test-bench/ -s
# Output results to file
gokart scan go-test-bench/ -o gokart-go-test-bench.txt
# Output scarif results to file
gokart scan go-test-bench/ -o gokart-go-test-bench.txt -s
# Scan remote public repository
# Repository will be cloned locally, scanned and deleted afterwards
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -v
# Specify the remote branch to scan
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -b actions_fix
# Scan remote private repository via ssh
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git
# Scan remote private repository and optionally specify a key for ssh authentication
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git -k /home/gokart/.ssh/github_rsa_key
# Use remote scan and output flags together for seamless security reviews
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -v
# Use remote scan, output and sarif flags for frictionless integration into CI/CD
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -s
Para testar a extensibilidade do GoKart, você pode modificar o arquivo de configuração que o GoKart usa para introduzir um novo dreno vulnerável na análise. Há um analisador de Test Sink definido no arquivo de configuração padrão incluído em util/analyzers.yml. Modifique o util/analyzers.yml para remover os comentários do analisador Test Sink e, em seguida, direcione o GoKart para usar o arquivo de configuração modificado com a flag -i.
# Scan using modified analyzers.yml file and output full traces
gokart scan go-test-bench/ -v -i <path-to-gokart>/util/analyzers.yml
A saída agora deve conter vulnerabilidades adicionais, incluindo novas vulnerabilidades "Test Sink acessível por entrada do usuário".
Você pode executar os testes incluídos com o seguinte comando, invocado a partir do diretório raiz do GoKart.
go test -v ./...