
GO 패키지 및 종속성에서 unsafe 사용을 찾아 계산합니다.
go-geiger -v github.com/jlauinger/go-geiger

Go 패키지는 unsafe.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 플래그 공급은 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 사용 만 계산합니다. --filter-match 인수를 sizeof , offsetof , alignof , sliceheader , stringheader , uintptr 또는 all 로 설정함으로써 go-geiger 사용하여 unsafe.Sizeof , unsafe.Offsetof , unsafe.Alignof , reflect.SliceHeader , reflect.StringHeader , uintptr , 모두 동일합니다.
--verbose 인수를 사용하여 go-geiger 안전하지 않은 다양한 사용 컨텍스트에 대한 개별 수를 보여줄 수 있습니다. go-geiger 다음을 구별합니다.
변하기 쉬운
var x unsafe. Pointer매개 변수
func foo ( x unsafe. Pointer ) {}과제
x := unsafe . Pointer ( & y )부르다
x := unsafe . Pointer ( & y )
foo ( x )다른 4 개에 속하지 않는 모든 것이 포함됩니다.
--filter-context 인수를 사용하여 특정 컨텍스트 유형으로 필터 계산을 필터링하십시오. variable , parameter , assignment , call , other 또는 all 사용할 수 있습니다.
프로젝트에서 GO 모듈 및 go.mod 파일을 사용하는 경우 go-geiger 분석하기 전에 모든 종속성을 자동으로 가져옵니다. 그것은 go build 와 똑같이 행동합니다.
다른 형태의 종속성 관리를 사용하는 경우, 예를 들어, 수동으로 go get , go mod vendor 또는 기타 기타 항목을 사용하는 경우 go-geiger 실행하기 전에 종속성 관리를 실행하여 모든 종속성을 분석하기 전에 최신 상태로 유지해야합니다.
go-geiger Rust 프로그램과 그 종속성에서 안전하지 않은 코드 블록을 찾는 유사한 도구 인 Cargo Geiger에서 영감을 얻었습니다.
Jlauinger/Go-UnsafePointer-POC에는 unsafe.Pointer 오용으로 인한 취약점을 악용하기위한 개념 증명이 포함되어 있습니다. 또한 특정 문제와 취약점에 대한 블로그 게시물 시리즈를 썼습니다.
Go-Safer는 unsafe.Pointer 두 가지 일반적이고 위험한 사용 패턴을 식별하는 데 도움이되는 Go Linter 도구입니다.
소스 코드를 가져 와서 바이너리를 컴파일하려면 다음을 실행하십시오.
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
go test 로 테스트를 실행하십시오.
MIT 라이센스 ( "라이센스")에 따라 라이센스. 라이센스 준수를 제외 하고이 프로젝트를 사용할 수 없습니다. 여기에서 라이센스 사본을 얻을 수 있습니다.
Copyright 2020 Johannes Lauinger
이 도구는 TU Darmstadt의 Software Technology Group에서 마스터 논문의 일부로 개발되었습니다.