
在GO软件包及其依赖项中查找并计算unsafe用法。
go-geiger -v github.com/jlauinger/go-geiger

GO软件包可以避免通过使用unsafe.Pointer来限制Pointer使用的限制。这对于提高效率甚至是必要的,即与C代码或SYSCALL相互作用可能是有价值的。
但是,开发人员必须在unsafe.Pointer下使用极端的谨慎,因为错误可能会很快发生,并且可以引入严重的漏洞,例如无用后,缓冲液重复使用或缓冲区溢出。
由于可以通过依赖项(和依赖关系的依赖项)引入unsafe.Pointer的用法,因此不仅有必要审核项目代码,而且还必须审核其依赖项,或者至少知道谁需要信任。
go-geiger可帮助开发人员快速确定GO包装的导入树中的哪些软件包使用unsafe.Pointer ,以便开发人员可以将审计工作集中在这些方案上,或决定为不使用unsafe.Pointer库切换库。
要安装go-geiger ,请使用以下命令:
go get github.com/jlauinger/go-geiger
这将安装go-geiger到$GOPATH/bin ,因此请确保它包含在您的$PATH环境变量中。
在这样的包装上运行Go-Geiger:
$ go-geiger example/cmd
或提供多个包裹,由空间隔开:
$ go-geiger example/cmd example/util strings
要检查当前目录中的软件包,您可以在没有参数的情况下调用go-geiger :
$ go-geiger
提供--help Flag打印了go-geiger的使用信息:
$ go-geiger --help
有以下标志可用:
--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
默认情况下, go-geiger仅计数unsafe.Pointer用法。 By setting the --filter-match argument to one of sizeof , offsetof , alignof , sliceheader , stringheader , uintptr , or all , you can also use go-geiger to find usages of unsafe.Sizeof , unsafe.Offsetof , unsafe.Alignof , reflect.SliceHeader , reflect.StringHeader , uintptr , or all of them at the same time.
使用--verbose参数,您可以指示go-geiger显示不安全使用情况上下文的个人计数。 go-geiger区分以下几点:
多变的
var x unsafe. Pointer范围
func foo ( x unsafe. Pointer ) {}任务
x := unsafe . Pointer ( & y )称呼
x := unsafe . Pointer ( & y )
foo ( x )其他,其中包括所有不属于前四个的东西。
使用--filter-context参数将计数过滤为特定上下文类型。您可以使用variable , parameter , assignment , call , other或all 。
如果您的项目使用go模块和go.mod文件,则go-geiger将在分析它们之前自动获取所有依赖项。它的行为与go build一样。
如果您使用不同形式的依赖项管理,例如手动go get , go mod vendor或其他任何东西,则需要在运行go-geiger之前运行依赖项管理,以便在分析之前对所有依赖关系保持最新。
go-geiger的灵感来自Cargo Geiger,这是一种类似的工具,可以在Rust程序及其依赖项中找到不安全的代码块。
jlauinger/go-unsafepointer-poc包含用于利用滥用unsafe.Pointer引起的漏洞的概念证明。我还写了一个有关特定问题和漏洞的博客文章系列。
Go-Safer是一个GO Linter工具,可以帮助识别两个常见和危险的使用模式unsafe.Pointer 。
要获取源代码并编译二进制代码,请运行以下操作:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
使用go test进行测试。
根据MIT许可(“许可”)许可。除了符合许可外,您不得使用此项目。您可以在此处获得许可证的副本。
版权所有2020 Johannes Lauinger
该工具是在我在TU Darmstadt的软件技术集团上的硕士论文中开发的。