
Найдите и посчитайте unsafe использования в пакетах GO и их зависимости.
go-geiger -v github.com/jlauinger/go-geiger

Пакет GO может избежать ограничений, которые обычно используются при использовании указателя, используя unsafe.Pointer . Это может быть ценным для повышения эффективности или даже необходимого, например, для взаимодействия с C -кодом или Syscalls.
Тем не менее, разработчики должны использовать чрезвычайную осторожность с 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 , вы uintptr можете использовать Go reflect.StringHeader go-geiger , чтобы reflect.SliceHeader unsafe.Alignof unsafe.Sizeof unsafe.Offsetof
Используя аргумент --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 («Лицензия»). Вы не можете использовать этот проект, кроме как в соответствии с лицензией. Вы можете получить копию лицензии здесь.
Copyright 2020 Johannes Lauinger
Этот инструмент был разработан в рамках диссертации моего мастера в группе программного обеспечения в Tu Darmstadt.