
Temukan dan hitung penggunaan unsafe dalam paket GO dan ketergantungannya.
go-geiger -v github.com/jlauinger/go-geiger

Paket GO dapat menghindari pembatasan yang biasanya ditetapkan pada penggunaan pointer dengan menggunakan unsafe.Pointer . Ini bisa berharga untuk meningkatkan efisiensi atau bahkan diperlukan misalnya untuk berinteraksi dengan kode C atau syscall.
Namun, pengembang harus menggunakan kehati-hatian yang ekstrem dengan unsafe.Pointer .
Karena penggunaan yang unsafe.Pointer
go-geiger membantu pengembang untuk dengan cepat mengidentifikasi paket mana di Pohon Impor Paket GO Gunakan unsafe.Pointer , sehingga pengembang dapat memfokuskan upaya audit ke mereka, atau memutuskan untuk mengganti perpustakaan untuk yang tidak menggunakan unsafe.Pointer .
Untuk menginstal go-geiger , gunakan perintah berikut:
go get github.com/jlauinger/go-geiger
Ini akan menginstal go-geiger ke $GOPATH/bin , jadi pastikan itu termasuk dalam variabel lingkungan $PATH Anda.
Jalankan go-geiger pada paket seperti ini:
$ go-geiger example/cmd
Atau menyediakan beberapa paket, dipisahkan oleh spasi:
$ go-geiger example/cmd example/util strings
Untuk memeriksa paket di direktori saat ini, Anda dapat menghubungi go-geiger tanpa parameter:
$ go-geiger
Memasok bendera --help Bendera mencetak informasi penggunaan untuk go-geiger :
$ go-geiger --help
Ada bendera berikut yang tersedia:
--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
Secara default, go-geiger hanya akan menghitung penggunaan unsafe.Pointer . uintptr reflect.SliceHeader argumen --filter-match ke salah satu dari sizeof , offsetof , alignof , sliceheader , stringheader reflect.StringHeader uintptr , atau all , Anda juga dapat menggunakan go-geiger untuk menemukan penggunaan unsafe.Alignof unsafe.Sizeof unsafe.Offsetof
Menggunakan argumen --verbose , Anda dapat menginstruksikan go-geiger untuk menunjukkan jumlah individu untuk berbagai konteks penggunaan yang tidak aman. go-geiger membedakan antara yang berikut:
Variabel
var x unsafe. PointerParameter
func foo ( x unsafe. Pointer ) {}Penugasan
x := unsafe . Pointer ( & y )Panggilan
x := unsafe . Pointer ( & y )
foo ( x )Lainnya, yang mencakup segala sesuatu yang tidak termasuk dalam empat yang pertama.
Gunakan argumen --filter-context untuk memfilter penghitungan ke jenis konteks tertentu. Anda dapat menggunakan variable , parameter , assignment , call , other , atau all .
Jika proyek Anda menggunakan modul GO dan file go.mod , go-geiger akan mengambil semua dependensi secara otomatis sebelum menganalisisnya. Perilaku itu persis seperti go build .
Jika Anda menggunakan bentuk manajemen ketergantungan yang berbeda, misalnya manual go get , go mod vendor atau apa pun, Anda perlu menjalankan manajemen ketergantungan Anda sebelum menjalankan go-geiger agar semua ketergantungan up-to-date sebelum analisis.
go-geiger terinspirasi oleh kargo Geiger, alat serupa untuk menemukan blok kode yang tidak aman dalam program karat dan ketergantungannya.
Jlauinger/go-unsafepointer-poc berisi bukti konsep untuk mengeksploitasi kerentanan yang disebabkan oleh penyalahgunaan yang unsafe.Pointer . Saya juga menulis seri posting blog tentang masalah dan kerentanan spesifik.
Go-Safer adalah alat GO Linter yang dapat membantu mengidentifikasi dua pola penggunaan yang umum dan berbahaya yang unsafe.Pointer .
Untuk mendapatkan kode sumber dan menyusun biner, jalankan ini:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
Jalankan tes dengan go test .
Dilisensikan di bawah lisensi MIT ("lisensi"). Anda tidak boleh menggunakan proyek ini kecuali sesuai dengan lisensi. Anda dapat memperoleh salinan lisensi di sini.
Hak Cipta 2020 Johannes Lauinger
Alat ini telah dikembangkan sebagai bagian dari tesis master saya di Grup Teknologi Perangkat Lunak di TU Darmstadt.