
Trouvez et comptez les usages unsafe dans les packages GO et leurs dépendances.
go-geiger -v github.com/jlauinger/go-geiger

Un package GO peut éviter que les restrictions soient normalement définies sur l'utilisation du pointeur en utilisant unsafe.Pointer . Cela peut être utile pour améliorer l'efficacité ou même nécessaire, par exemple, interagir avec le code C ou les systèmes.
Cependant, les développeurs doivent faire preuve d'une extrême prudence avec unsafe.Pointer car les erreurs peuvent se produire rapidement et ils peuvent introduire de graves vulnérabilités telles que l'utilisation sans référence à tampon ou les débordements de tampon.
Étant donné que les usages de unsafe.Pointer .
go-geiger aide les développeurs à identifier rapidement les packages de l'arborescence d'importation d'un package GO Utiliser unsafe.Pointer , afin que les développeurs puissent concentrer les efforts d'audit sur ceux-ci, ou décider de changer de bibliothèque pour celui qui n'utilise pas unsafe.Pointer .
Pour installer go-geiger , utilisez la commande suivante:
go get github.com/jlauinger/go-geiger
Cela installera go-geiger à $GOPATH/bin , alors assurez-vous qu'il est inclus dans votre variable d'environnement $PATH .
Exécutez Go-Geiger sur un paquet comme celui-ci:
$ go-geiger example/cmd
Ou fournit plusieurs packages, séparés par des espaces:
$ go-geiger example/cmd example/util strings
Pour vérifier le package dans le répertoire actuel, vous pouvez appeler go-geiger sans paramètres:
$ go-geiger
Fourniture de --help Flag imprime les informations d'utilisation de go-geiger :
$ go-geiger --help
Il y a les drapeaux suivants disponibles:
--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
Par défaut, go-geiger ne comptera que des usages unsafe.Pointer . En définissant l'argument de - reflect.SliceHeader --filter-match sur l'un des sizeof , offsetof , alignof , sliceheader , stringheader , uintptr uintptr ou all , vous pouvez également utiliser go-geiger pour trouver des unsafe.Alignof de unsafe.Sizeof , unsafe.Offsetof , reflect.StringHeader , ou tous
En utilisant l'argument --verbose , vous pouvez demander go-geiger de montrer des dénombrements individuels pour différents contextes d'utilisation de dangereux. go-geiger fait la distinction entre les éléments suivants:
Variable
var x unsafe. PointerParamètre
func foo ( x unsafe. Pointer ) {}Affectation
x := unsafe . Pointer ( & y )Appel
x := unsafe . Pointer ( & y )
foo ( x )Autre, qui comprend tout ce qui ne tombe pas sous les quatre premiers.
Utilisez l'argument --filter-context pour filtrer le comptage vers un type de contexte spécifique. Vous pouvez utiliser variable , parameter , assignment , call , other ou all .
Si votre projet utilise des modules GO et un fichier go.mod , go-geiger rapportera automatiquement toutes les dépendances avant de les analyser. Cela se comporte exactement comme go build .
Si vous utilisez une forme différente de gestion de la dépendance, par exemple, manuel go get , go mod vendor ou autre chose, vous devez exécuter votre gestion de dépendance avant d'exécuter go-geiger afin d'avoir toutes les dépendances à jour avant l'analyse.
go-geiger s'inspire de Cargo Geiger, un outil similaire pour trouver des blocs de code dangereux dans les programmes de rouille et leurs dépendances.
Jlauinger / go-unsafepointer-POC contient des preuves de concepts pour l'exploitation des vulnérabilités causées par une mauvaise utilisation de unsafe.Pointer . J'ai également écrit une série de articles de blog sur les problèmes et les vulnérabilités spécifiques.
GO-Safer est un outil GO Linter qui peut aider à identifier deux modèles d'utilisation communs et dangereux de unsafe.Pointer .
Pour obtenir le code source et compiler le binaire, exécutez ceci:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
Exécutez les tests avec go test .
Licencié en vertu de la licence du MIT (la "licence"). Vous ne pouvez pas utiliser ce projet sauf conforme à la licence. Vous pouvez obtenir une copie de la licence ici.
Copyright 2020 Johannes Lauinger
Cet outil a été développé dans le cadre de ma thèse de maîtrise au Software Technology Group de Tu Darmstadt.