
Encontre e conte usos unsafe em pacotes Go e suas dependências.
go-geiger -v github.com/jlauinger/go-geiger

Um pacote Go pode evitar que as restrições normalmente sejam definidas no uso do ponteiro usando unsafe.Pointer . Isso pode ser valioso para melhorar a eficiência ou mesmo o necessário, por exemplo, para interagir com o código C ou o SYSCALLS.
No entanto, os desenvolvedores devem ter extrema cautela com unsafe.Pointer .
Como o uso do unsafe.Pointer pode ser introduzido através de dependências (e dependências de dependências), é necessário auditar não apenas o código do projeto, mas também suas dependências, ou pelo menos saber em quem é preciso confiar.
go-geiger ajuda os desenvolvedores a identificar rapidamente quais pacotes na árvore de importação de um pacote go use unsafe.Pointer , para que os desenvolvedores possam focar os esforços de auditoria neles ou decidir trocar de bibliotecas para uma que não use unsafe.Pointer .
Para instalar go-geiger , use o seguinte comando:
go get github.com/jlauinger/go-geiger
Isso instalará go-geiger em $GOPATH/bin , portanto, verifique se ele está incluído na sua variável de ambiente $PATH .
Run Go-Geiger em um pacote como este:
$ go-geiger example/cmd
Ou forneça vários pacotes, separados por espaços:
$ go-geiger example/cmd example/util strings
Para verificar o pacote no diretório atual, você pode chamar go-geiger sem parâmetros:
$ go-geiger
O fornecimento da bandeira --help imprime as informações de uso para go-geiger :
$ go-geiger --help
Existem as seguintes bandeiras disponíveis:
--filter-context string Count only lines of requested context type (all,variable,parameter,assignment,call,other). Default all (default "all")
--filter-match string Count only lines of requested match type (all,pointer,sizeof,offsetof,alignof,sliceheader,stringheader,uintptr). Default pointer (default "pointer")
-h, --help help for geiger
-q, --hide-stats Hide statistics table, print only code. --show-code needs to be set manually
--include-std Show / include Golang stdlib packages
-l, --link Print link to pkg.go.dev instead of package name
-d, --max-depth int Maximum transitive import depth (default 10)
--show-code Print the code lines with unsafe usage
--show-only-once Do not repeat packages, show them only once and abbreviate further imports (default true)
-v, --verbose Show usage counts by different usage types
Por padrão, go-geiger contará apenas unsafe.Pointer . reflect.SliceHeader o argumento --filter-match reflect.StringHeader um dos sizeof uintptr offsetof , alignof , sliceheader , stringheader , uintptr ou all , você unsafe.Alignof pode usar go-geiger para encontrar usos de unsafe.Sizeof unsafe.Offsetof
Usando o argumento --verbose , você pode instruir go-geiger a mostrar contagens individuais para diferentes contextos de uso inseguro. go-geiger distingue entre os seguintes:
Variável
var x unsafe. PointerParâmetro
func foo ( x unsafe. Pointer ) {}Atribuição
x := unsafe . Pointer ( & y )Chamar
x := unsafe . Pointer ( & y )
foo ( x )Outro, que inclui tudo o que não se enquadra nos quatro primeiros.
Use o argumento --filter-context para filtrar a contagem para um tipo de contexto específico. Você pode usar variable , parameter , assignment , call , other ou all .
Se o seu projeto usar módulos Go e um arquivo go.mod , go-geiger buscará todas as dependências automaticamente antes de analisá-las. Ele se comporta exatamente como go build .
Se você usar uma forma diferente de gerenciamento de dependência, por exemplo, manual, go get , go mod vendor ou qualquer outra coisa, precisará executar seu gerenciamento de dependência antes de executar go-geiger para ter todas as dependências atualizadas antes da análise.
go-geiger é inspirado na Cargo Geiger, uma ferramenta semelhante para encontrar blocos de código inseguros nos programas de ferrugem e suas dependências.
Jlauinger/Go-UnsafePointer-POC contém prova de conceitos para explorar vulnerabilidades causadas pelo uso indevido de unsafe.Pointer . Também escrevi uma série de postagens sobre os problemas e vulnerabilidades específicos.
O Go-Safer é uma ferramenta de linhagem que pode ajudar a identificar dois padrões de uso comuns e perigosos de unsafe.Pointer .
Para obter o código -fonte e compilar o binário, execute o seguinte:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
Execute os testes com go test .
Licenciado sob a licença do MIT (a "licença"). Você não pode usar este projeto, exceto em conformidade com a licença. Você pode obter uma cópia da licença aqui.
Copyright 2020 Johannes Lauinger
Essa ferramenta foi desenvolvida como parte da tese de meu mestrado no grupo de tecnologia de software da TU Darmstadt.