
Finden und zählen Sie unsafe Verwendung in Go -Paketen und deren Abhängigkeiten.
go-geiger -v github.com/jlauinger/go-geiger

Ein GO -Paket kann die Einschränkungen vermeiden, die normalerweise auf Zeiger verwendet werden, indem Sie unsafe.Pointer verwenden. Dies kann wertvoll sein, um die Effizienz oder sogar die erforderliche z.
Entwickler müssen jedoch mit unsafe.Pointer äußerste Vorsicht walten lassen, da Fehler schnell auftreten können und schwerwiegende Schwachstellen wie nutzungsfreie, Puffer-Wiederverwendungen oder Pufferüberläufe einführen können.
Da Verwendungen von unsafe.Pointer durch Abhängigkeiten (und Abhängigkeiten von Abhängigkeiten) eingeführt werden können, ist es erforderlich, nicht nur den Projektcode, sondern auch die Abhängigkeiten zu prüfen oder zumindest zu wissen, wem man vertrauen muss.
go-geiger hilft Entwicklern, schnell zu ermitteln, welche Pakete im Importbaum eines GO-Pakets unsafe.Pointer verwenden, damit Entwickler die Prüfungsbemühungen auf diese konzentrieren oder sich entscheiden können, Bibliotheken für einen zu wechseln, der nicht unsafe.Pointer verwendet.
Verwenden Sie zum Installieren von go-geiger den folgenden Befehl:
go get github.com/jlauinger/go-geiger
Dadurch wird go-geiger in $GOPATH/bin installiert. Stellen Sie daher sicher, dass es in Ihrer $PATH Umgebungsvariablen enthalten ist.
Rennen Sie Go-Geiger auf einem solchen Paket:
$ go-geiger example/cmd
Oder liefern mehrere Pakete, getrennt durch Räume:
$ go-geiger example/cmd example/util strings
Um das Paket im aktuellen Verzeichnis zu überprüfen, können Sie go-geiger ohne Parameter aufrufen:
$ go-geiger
Durch die Versorgung des Flags --help Flagge werden die Nutzungsinformationen für go-geiger gedruckt:
$ go-geiger --help
Es sind die folgenden Flaggen verfügbar:
--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
Standardmäßig zählt go-geiger nur unsafe.Pointer -Verwendungen. Durch Einstellen des Arguments --filter-match in einer der sizeof , offsetof , alignof , sliceheader , stringheader , uintptr oder all , können Sie auch go-geiger reflect.SliceHeader , um Nutzungen uintptr unsafe.Sizeof reflect.StringHeader , unsafe.Offsetof unsafe.Alignof
Mit dem Argument --verbose können Sie go-geiger anweisen, einzelne Zählungen für unterschiedliche Verwendungskontexte von Unsicher zu zeigen. go-geiger unterscheidet zwischen den folgenden:
Variable
var x unsafe. PointerParameter
func foo ( x unsafe. Pointer ) {}Abtretung
x := unsafe . Pointer ( & y )Anruf
x := unsafe . Pointer ( & y )
foo ( x )Andere, einschließlich alles, was nicht unter die ersten vier fällt.
Verwenden Sie das Argument --filter-context , um die Zählung zu einem bestimmten Kontexttyp zu filtern. Sie können variable , parameter , assignment , call , other oder all verwenden.
Wenn Ihr Projekt Go-Module und eine go.mod Datei verwendet, holt go-geiger alle Abhängigkeiten automatisch, bevor sie analysiert. Es verhält sich genauso wie go build .
Wenn Sie eine andere Form des Abhängigkeitsmanagements, z. B. Handbuch go get , go mod vendor oder irgendetwas anderes verwenden, müssen Sie Ihr Abhängigkeitsmanagement ausführen, bevor Sie go-geiger ausführen, um alle Abhängigkeiten vor der Analyse auf dem neuesten Stand zu haben.
go-geiger ist von Cargo Geiger inspiriert, einem ähnlichen Instrument, um unsichere Codeblöcke in Rust-Programmen und deren Abhängigkeiten zu finden.
Jlauinger/go-unSafepointer-poc enthält einen Nachweis von Konzepten für die Ausnutzung von Schwachstellen, die durch Missbrauch von unsafe.Pointer verursacht werden. Ich habe auch eine Blog -Postserie über die spezifischen Probleme und Schwachstellen geschrieben.
Go-Safer ist ein Go-Linter-Tool, mit dem zwei häufige und gefährliche Verwendungsmuster von unsafe.Pointer .
Führen Sie dies aus:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
Führen Sie die Tests mit go test aus.
Lizenziert unter der MIT -Lizenz (der "Lizenz"). Sie dürfen dieses Projekt nur in Übereinstimmung mit der Lizenz verwenden. Sie können hier eine Kopie der Lizenz erhalten.
Copyright 2020 Johannes Lauinger
Dieses Tool wurde im Rahmen meiner Masterarbeit in der Softwaretechnologiegruppe bei Tu Darmstadt entwickelt.