
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 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使用のみをカウントします。 --filter-match reflect.StringHeaderをsizeof 、 offsetof 、 alignof 、 sliceheader 、 stringheader 、 uintptr 、またはallに設定することにより、 go-geigerを使用して、 unsafe.Sizeof 、 unsafe.Offsetof 、 unsafe.Alignof 、 reflect.SliceHeader 、 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の2つの一般的で危険な使用パターンを特定するのに役立つGo Linterツールです。
ソースコードを取得してバイナリをコンパイルするには、これを実行します。
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
go testでテストを実行します。
MITライセンス(「ライセンス」)に基づいてライセンスされています。ライセンスに準拠している場合を除き、このプロジェクトを使用することはできません。ここでライセンスのコピーを入手できます。
著作権2020ヨハネス・ラウィンガー
このツールは、Tu Darmstadtのソフトウェアテクノロジーグループでの私の修士論文の一部として開発されました。