
Encuentre y cuente los usos unsafe en los paquetes GO y sus dependencias.
go-geiger -v github.com/jlauinger/go-geiger

Un paquete GO puede evitar las restricciones que se establecen normalmente en el uso del puntero utilizando unsafe.Pointer . Esto puede ser valioso para mejorar la eficiencia o incluso necesaria, por ejemplo, interactuar con el código C o las syscalls.
Sin embargo, los desarrolladores deben usar extrema precaución con unsafe.Pointer porque los errores pueden ocurrir rápidamente y pueden introducir vulnerabilidades graves, como reutilizaciones sin uso, búfer o desbordamientos de búfer.
Dado que los usos de unsafe.Pointer se pueden introducir a través de dependencias (y dependencias de dependencias), es necesario auditar no solo el código del proyecto sino también sus dependencias, o al menos saber en quién se necesita confiar.
go-geiger ayuda a los desarrolladores a identificar rápidamente qué paquetes en el árbol de importación de un paquete GO unsafe.Pointer unsafe.Pointer .
Para instalar go-geiger , use el siguiente comando:
go get github.com/jlauinger/go-geiger
Esto instalará go-geiger a $GOPATH/bin , así que asegúrese de que esté incluido en su variable de entorno $PATH .
Ejecute Go-Geiger en un paquete como este:
$ go-geiger example/cmd
O suministrar múltiples paquetes, separados por espacios:
$ go-geiger example/cmd example/util strings
Para verificar el paquete en el directorio actual, puede llamar go-geiger sin parámetros:
$ go-geiger
Suministro de la bandera --help imprime la información de uso para go-geiger :
$ go-geiger --help
Hay las siguientes banderas 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
Por defecto, go-geiger contará solo unsafe.Pointer . Al establecer el argumento --filter-match en uno de sizeof , offsetof , alignof , sliceheader , stringheader , uintptr , o en all , también puede usar go-geiger para encontrar usos de unsafe.Sizeof , unsafe.Offsetof , unsafe.Alignof , reflect.SliceHeader . reflect.StringHeader , uintptr .
Usando el argumento --verbose , puede instruir go-geiger que muestre recuentos individuales para diferentes contextos de uso de inseguros. go-geiger distingue entre lo siguiente:
Variable
var x unsafe. PointerParámetro
func foo ( x unsafe. Pointer ) {}Asignación
x := unsafe . Pointer ( & y )Llamar
x := unsafe . Pointer ( & y )
foo ( x )Otro, que incluye todo lo que no cae en los primeros cuatro.
Use el argumento --filter-context para filtrar el conteo a un tipo de contexto específico. Puede usar variable , parameter , assignment , call , other o all .
Si su proyecto usa módulos GO y un archivo go.mod , go-geiger obtendrá todas las dependencias automáticamente antes de que los analice. Se comporta exactamente como lo haría go build .
Si usa una forma diferente de gestión de dependencias, por ejemplo, el proveedor de go get , go mod vendor o cualquier otra cosa, debe ejecutar su gestión de dependencias antes de ejecutar go-geiger para tener todas las dependencias actualizadas antes del análisis.
go-geiger está inspirado en Cargo Geiger, una herramienta similar para encontrar bloques de código inseguros en los programas de óxido y sus dependencias.
JLAUINGER/GO-UNSAFEPOINTER-POC contiene una prueba de conceptos para explotar vulnerabilidades causadas por el mal uso de unsafe.Pointer . También escribí una serie de publicaciones de blog sobre los problemas y vulnerabilidades específicos.
Go-Safer es una herramienta de enlace GO que puede ayudar a identificar dos patrones de uso comunes y peligrosos de unsafe.Pointer .
Para obtener el código fuente y compilar el binario, ejecute esto:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
Ejecute las pruebas con go test .
Licenciado bajo la licencia MIT (la "licencia"). No puede usar este proyecto, excepto de conformidad con la licencia. Puede obtener una copia de la licencia aquí.
Copyright 2020 Johannes Lauinger
Esta herramienta se ha desarrollado como parte de mi tesis de maestría en el grupo de tecnología de software en TU Darmstadt.