
Инструмент статического анализа для обеспечения безопасности Go-кода
GoKart — это инструмент статического анализа для Go, который находит уязвимости, используя SSA (однократное статическое присваивание) исходного кода Go. Он способен отслеживать источник переменных и аргументов функций, чтобы определить, являются ли входные источники безопасными, что снижает количество ложных срабатываний по сравнению с другими сканерами безопасности Go. Например, SQL-запрос, конкатенированный с переменной, традиционно может быть помечен как SQL-инъекция; однако GoKart может выяснить, является ли переменная на самом деле константой или эквивалентом константы, и в этом случае уязвимости нет.
GoKart также помогает поддерживать Chariot, платформу безопасности Praetorian, которая помогает находить, управлять и устранять уязвимости в вашем исходном коде и облачных средах. Chariot упрощает запуск автоматических, непрерывных сканирований GoKart для вашего исходного кода. Если вы хотите попробовать GoKart, вы можете создать бесплатную учетную запись Chariot за несколько минут, нажав здесь.
Статический анализ — это мощный метод поиска уязвимостей в исходном коде. Однако этот подход страдает от зашумленности — то есть многие инструменты статического анализа находят достаточно много «уязвимостей», которые на самом деле не являются реальными. Это приводит к трениям с разработчиками, поскольку пользователи устают от того, что инструменты слишком часто «кричат "волки!"».
Мотивацией для GoKart было решение этой проблемы: сможем ли мы создать сканер со значительно более низким уровнем ложных срабатываний, чем существующие инструменты? Основываясь на наших экспериментах, ответ — да. Используя трассировку от источника к приемнику и SSA, GoKart способен отслеживать заражение переменных между присваиваниями, что значительно повышает точность результатов. Мы фокусируемся на удобстве использования: прагматически это означает, что мы оптимизировали наши подходы для уменьшения числа ложных тревог.
Для получения дополнительной информации прочитайте наш пост в блоге.
Вы можете установить GoKart локально, используя любой из перечисленных ниже вариантов.
go install$ go install github.com/praetorian-inc/gokart@latest
Загрузите бинарный файл для вашей ОС со страницы релизов.
(ОПЦИОНАЛЬНО) Загрузите файл checksums.txt для проверки целостности архива
# Проверка контрольной суммы загруженного архива
$ shasum -a 256 gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ cat gokart_${VERSION}_${ARCH}_checksums.txt | grep gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ tar -xvf gokart_${VERSION}_${ARCH}.tar.gz
gokart в ваш путь:$ mv ./gokart /usr/local/bin/
# клонируйте репозиторий GoKart
$ git clone https://github.com/praetorian-inc/gokart.git
# перейдите в каталог репозитория и соберите
$ cd gokart
$ go build
# Переместите бинарный файл gokart в ваш путь
$ mv ./gokart /usr/local/bin
Соберите образ Docker
docker build -t gokart .
Запуск контейнера с локальным сканированием (каталог локального сканирования должен быть смонтирован в образ контейнера)
docker run -v /path/to/scan-dir:/scan-dir gokart scan /scan-dir
Запуск контейнера с удаленным сканированием (при указании приватного ключа для аутентификации его также необходимо смонтировать в контейнер)
docker run gokart scan -r https://github.com/praetorian-inc/gokart
# указание приватного ключа для аутентификации по SSH в частном репозитории
docker run -v /path/to/key-dir/:/key-dir gokart scan -r [email protected]:praetorian-inc/gokart.git -k /key-dir/ssh_key
# запуск без указания директории по умолчанию использует '.'
gokart scan <flags>
gokart scan <directory> <flags>
gokart help
Вы можете выполнить следующие шаги, чтобы запустить GoKart на Go Test Bench, преднамеренно уязвимом Go-приложении от команды Contrast Security.
# Клонируйте пример уязвимого приложения
git clone https://github.com/Contrast-Security-OSS/go-test-bench.git
gokart scan go-test-bench/
Вывод должен показать некоторые выявленные уязвимости, каждая с указанием Уязвимой функции и Источника пользовательского ввода.
Чтобы протестировать некоторые дополнительные функции GoKart, вы можете выполнить сканирование с флагами CLI, предложенными ниже.
# Используйте флаг подробного вывода, чтобы показать полные трассировки этих уязвимостей
gokart scan go-test-bench/ -v
# Используйте флаг globalsTainted, чтобы игнорировать разрешенные источники
# может увеличить количество ложных срабатываний
gokart scan go-test-bench/ -v -g
# Используйте флаг отладки для отображения внутренней информации анализа
# полезно для разработки и отладки
gokart scan go-test-bench/ -d
# Вывод результатов в формате SARIF
gokart scan go-test-bench/ -s
# Вывод результатов в файл
gokart scan go-test-bench/ -o gokart-go-test-bench.txt
# Вывод результатов в формате SARIF в файл
gokart scan go-test-bench/ -o gokart-go-test-bench.txt -s
# Сканирование удаленного публичного репозитория
# Репозиторий будет клонирован локально, отсканирован и удален после
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -v
# Указание удаленной ветки для сканирования
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -b actions_fix
# Сканирование удаленного приватного репозитория через SSH
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git
# Сканирование удаленного приватного репозитория с опциональным указанием ключа для аутентификации по SSH
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git -k /home/gokart/.ssh/github_rsa_key
# Используйте флаги удаленного сканирования и вывода вместе для бесшовных проверок безопасности
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -v
# Используйте флаги удаленного сканирования, вывода и SARIF для бесшовной интеграции в CI/CD
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -s
Чтобы протестировать расширяемость GoKart, вы можете изменить файл конфигурации, который использует GoKart, чтобы
ввести новый уязвимый приемник в анализ. В файле конфигурации по умолчанию, включенном в комплект, по адресу
util/analyzers.yml определен анализатор Test Sink. Измените util/analyzers.yml, чтобы удалить комментарии
на анализаторе Test Sink, а затем укажите GoKart использовать измененный файл конфигурации с флагом -i.
# Сканирование с использованием измененного файла analyzers.yml и вывод полных трассировок
gokart scan go-test-bench/ -v -i <path-to-gokart>/util/analyzers.yml
Вывод теперь должен содержать дополнительные уязвимости, включая новые уязвимости "Test Sink reachable by user input".
Вы можете запустить включенные тесты с помощью следующей команды, вызванной из корневого каталога GoKart.
go test -v ./...