Inspeciona o código -fonte dos problemas de segurança, digitalizando a representação do código AST e SSA.
Licenciado sob a licença Apache, versão 2.0 (a "licença"). Você não pode usar esse arquivo, exceto em conformidade com a licença. Você pode obter uma cópia da licença aqui.
# binary will be $(go env GOPATH)/bin/gosec
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $( go env GOPATH ) /bin vX.Y.Z
# or install it into ./bin/
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# In alpine linux (as it does not come with curl by default)
wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# If you want to use the checksums provided on the "Releases" page
# then you will have to download a tar.gz file for your operating system instead of a binary file
wget https://github.com/securego/gosec/releases/download/vX.Y.Z/gosec_vX.Y.Z_OS.tar.gz
# The file will be in the current folder where you run the command
# and you can check the checksum like this
echo " <check sum from the check sum file> gosec_vX.Y.Z_OS.tar.gz " | sha256sum -c -
gosec --help Você pode executar gosec como uma ação do GitHub da seguinte maneira:
name : Run Gosec
on :
push :
branches :
- master
pull_request :
branches :
- master
jobs :
tests :
runs-on : ubuntu-latest
env :
GO111MODULE : on
steps :
- name : Checkout Source
uses : actions/checkout@v3
- name : Run Gosec Security Scanner
uses : securego/gosec@master
with :
args : ./...Você pode integrar ferramentas de análise de código de terceiros com a digitalização do código do GitHub enviando dados como arquivos SARIF.
O fluxo de trabalho mostra um exemplo de execução do gosec como uma etapa em um fluxo de trabalho de ação do GitHub que gera o arquivo results.sarif . O fluxo de trabalho envia o arquivo results.sarif upload-sarif
name : " Security Scan "
# Run workflow each time code is pushed to your repository and on a schedule.
# The scheduled workflow runs every at 00:00 on Sunday UTC time.
on :
push :
schedule :
- cron : ' 0 0 * * 0 '
jobs :
tests :
runs-on : ubuntu-latest
env :
GO111MODULE : on
steps :
- name : Checkout Source
uses : actions/checkout@v3
- name : Run Gosec Security Scanner
uses : securego/gosec@master
with :
# we let the report trigger content trigger a failure using the GitHub Security features.
args : ' -no-fail -fmt sarif -out results.sarif ./... '
- name : Upload SARIF file
uses : github/codeql-action/upload-sarif@v2
with :
# Path to SARIF file relative to the root of the repository
sarif_file : results.sarifgo install github.com/securego/gosec/v2/cmd/gosec@latest O GOSEC pode ser configurado para executar apenas um subconjunto de regras, para excluir determinados caminhos de arquivo e produzir relatórios em diferentes formatos. Por padrão, todas as regras serão executadas contra os arquivos de entrada fornecidos. Para digitalizar recursivamente a partir do diretório atual, você pode fornecer ./... como o argumento de entrada.
Por padrão, o GOSEC executará todas as regras contra os caminhos de arquivo fornecidos. No entanto, é possível selecionar um subconjunto de regras a serem executadas via -include= sinalizador ou especificar um conjunto de regras para excluir explicitamente usando o sinalizador -exclude= .
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./... Todas as questões detectadas pelo gosec são mapeadas para um CWE (enumeração de fraqueza comum) que descreve em termos mais genéricos a vulnerabilidade. O mapeamento exato pode ser encontrado aqui.
Várias configurações globais podem ser fornecidas em um arquivo de configuração da seguinte forma:
{
"global" : {
"nosec" : " enabled " ,
"audit" : " enabled "
}
}nosec : Esta configuração substituirá todas as diretivas #nosec definidas em toda a base de códigoaudit : é executado no modo de auditoria que permite verificações de adição que, para análise de código normal # Run with a global configuration file
$ gosec -conf config.json . Algumas regras também aceitam sinalizadores de configuração; Esses sinalizadores estão documentados em regras.md.
Algumas regras exigem uma versão GO específica que é recuperada do arquivo do módulo GO presente no projeto. Se esta versão não puder ser encontrada, ele fará uma versão em tempo de execução.
A versão do módulo GO é analisada usando o comando go list que em alguns casos pode levar à degradação do desempenho. Nessa situação, a versão GO do módulo pode ser facilmente fornecida definindo a variável de ambiente GOSECGOVERSION=go1.21.1 .
O GOSEC buscará automaticamente as dependências do código que está sendo analisado quando o módulo GO estiver ligado (por exemplo, GO111MODULE=on ). Se não for esse o caso, as dependências precisam ser baixadas explicitamente executando o comando go get -d antes da digitalização.
O GOSEC ignorará os arquivos de teste em todos os pacotes e quaisquer dependências no diretório do seu fornecedor.
A digitalização dos arquivos de teste pode ser ativada com a seguinte bandeira:
gosec -tests ./...Além disso, pastas adicionais podem ser excluídas da seguinte forma:
gosec -exclude-dir=rules -exclude-dir=cmd ./...O GOSEC pode ignorar os arquivos GO gerados com o comentário de código gerado padrão.
// Code generated by some generator DO NOT EDIT.
gosec -exclude-generated ./...O GOSEC pode sugerir correções com base na recomendação da IA. Ele chamará uma API de IA para receber uma sugestão para uma descoberta de segurança.
Você pode ativar esse recurso, fornecendo os seguintes argumentos da linha de comando:
ai-api-provider : O nome do provedor de API da AI, atualmente apenas gemini é suportado.ai-api-key ou defina a variável de ambiente GOSEC_AI_API_KEY : A chave para acessar a API da AI, para Gemini, você pode criar uma chave da API seguindo estas instruções.ai-endpoint : o terminal do provedor de IA, esse é o argumento opcional. gosec -ai-api-provider= " gemini " -ai-api-key= " your_key " ./... Como em todas as ferramentas de detecção automatizadas, haverá casos de falsos positivos. Nos casos em que a GOSEC relata uma falha que foi verificada manualmente como segura, é possível anotar o código com um comentário que começa com #nosec .
O comentário #nosec deve ter o formato #nosec [RuleList] [-- Justification] .
O comentário #nosec precisa ser colocado na linha onde o aviso é relatado.
func main () {
tr := & http. Transport {
TLSClientConfig : & tls. Config {
InsecureSkipVerify : true , // #nosec G402
},
}
client := & http. Client { Transport : tr }
_ , err := client . Get ( "https://go.dev/" )
if err != nil {
fmt . Println ( err )
}
} Quando um falso positivo específico foi identificado e verificado como seguro, você pode suprimir apenas essa única regra (ou um conjunto específico de regras) dentro de uma seção do código, continuando a digitalizar outros problemas. Para fazer isso, você pode listar a (s) regra (s) a ser suprimida dentro da anotação #nosec , por exemplo: /* #nosec G401 */ ou //#nosec G201 G202 G203
Você pode colocar o texto de descrição ou justificativa para a anotação. A justificativa deve estar após a regra (s) para suprimir e começar com dois ou mais traços, por exemplo: //#nosec G101 G102 -- This is a false positive
Em alguns casos, você também pode revisitar lugares onde as anotações #nosec foram usadas. Para executar o scanner e ignorar quaisquer anotações #nosec , você pode fazer o seguinte:
gosec -nosec=true ./... Conforme descrito acima, poderíamos suprimir violações externamente (usando -include / -exclude ) ou embutido (usando anotações #nosec ) no GOSEC. Essa inflamação de supressão pode ser usada para gerar sinais correspondentes para fins de auditoria.
Poderíamos rastrear supressões pelo sinalizador -track-suppressions da seguinte forma:
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind é external e justification é uma certa frase "suprimida globalmente".kind é inSource e justification é o texto após dois ou mais traços no comentário.Nota: Somente os formatos SARIF e JSON suportam supressões de rastreamento.
O GOSEC é capaz de passar suas tags Go Build para o analisador. Eles podem ser fornecidos como uma lista separada por vírgula da seguinte forma:
gosec -tags debug,ignore ./... Atualmente, a GOSEC suporta text , json , yaml , csv , sonarqube , JUnit XML , html e golint Output Formats. Por padrão, os resultados serão relatados como STDOUT, mas também podem ser gravados em um arquivo de saída. O formato de saída é controlado pelo sinalizador -fmt e o arquivo de saída é controlado pelo sinalizador -out da seguinte forma:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go Os resultados serão relatados para STDOUT, bem como ao arquivo de saída fornecido pelo sinalizador -stdout . O sinalizador -verbose substitui o formato de saída ao acalmar os resultados enquanto os salvam no arquivo de saída
# Write output in json format to results.json as well as stdout
$ gosec -fmt=json -out=results.json -stdout * .go
# Overrides the output format to 'text' when stdout the results, while writing it to results.json
$ gosec -fmt=json -out=results.json -stdout -verbose=text * .go NOTA: O GOSEC gera o formato de importação de problemas genéricos para Sonarqube, e um relatório deve ser importado para Sonarqube usando sonar.externalIssuesReportPaths=path/to/gosec-report.json .
Contribuindo.md contém informações detalhadas sobre a adição de novas regras ao GOSEC.
Você pode construir o binário com:
makeInstale a ferramenta com:
go get -u github.com/a-h/generate/cmd/schema-generateEm seguida, gerar os tipos com:
schema-generate -i sarif-schema-2.1.0.json -o mypath/types.goA maioria dos Marshalljson/UNMARSHALJSON é removida, exceto a do Propertybag, que é útil para incluir as propriedades adicionais. O restante pode ser removido. O URI, ID, UUID, GUID foi renomeado para que se encaixe na Convenção GO definida aqui
Você pode executar todos os testes de unidade usando:
make testVocê pode criar um lançamento marcando a versão da seguinte maneira:
git tag v1.0.0 -m " Release version v1.0.0 "
git push origin v1.0.0O fluxo de trabalho de liberação do Github grie imediatamente após a tag ser pressionada a montante. Esse fluxo lançará os binários usando a ação GoreLeaser e, em seguida, criará e publicará a imagem do Docker no Docker Hub.
Os artefatos lançados são assinados usando o COSIGN. Você pode usar a chave pública do arquivo COSIGN.PUB para verificar a assinatura dos arquivos de imagem e binários do docker.
A assinatura da imagem do Docker pode ser verificada com o seguinte comando:
cosign verify --key cosign.pub securego/gosec:<TAG>
A assinatura dos arquivos binários pode ser verificada com o seguinte comando:
cosign verify-blob --key cosign.pub --signature gosec_<VERSION>_darwin_amd64.tar.gz.sig gosec_<VERSION>_darwin_amd64.tar.gz
Você também pode construir localmente a imagem do Docker usando o comando:
make image Você pode executar a ferramenta gosec em um contêiner no seu projeto GO local. Você só precisa montar o projeto em um volume da seguinte maneira:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... Nota: O diretório de trabalho atual precisa ser definido com a opção -w para ser resolvido com sucesso as dependências do arquivo de módulo Go
A configuração da regra do TLS pode ser gerada a partir da recomendação de Ciphers TLS de Mozilla.
Primeiro você precisa instalar a ferramenta geradora:
go get github.com/securego/gosec/v2/cmd/tlsconfig/... Você pode invocar agora o go generate na raiz do projeto:
go generate ./... Isso gerará o arquivo rules/tls_config.go , que conterá a recomendação atual de cifras da Mozilla.
Esta é uma lista com alguns dos usuários da GOSEC.
Apoie este projeto, tornando -se um patrocinador. Seu logotipo aparecerá aqui com um link para o seu site