
gosec v2.28.0
Сканер безопасности Go
gosec — проверка безопасности Go
Проверяет исходный код на наличие проблем безопасности путём сканирования AST Go и представления кода в виде SSA.
Быстрые ссылки
- GitHub Action
- Локальная установка
- Быстрый старт
- Типичные сценарии использования
- Выбор правил
- Форматы вывода
Возможности
- Правила на основе шаблонов для обнаружения распространённых проблем безопасности в коде Go
- Анализаторы на основе SSA для преобразований типов, границ срезов и проблем с криптографией
- Анализ заражения (taint analysis) для отслеживания потока данных от пользовательского ввода к опасным функциям (SQL-инъекции, инъекции команд, обход путей, SSRF, XSS, инъекции в журналы, SMTP-инъекции, SSTI, небезопасная десериализация, открытые перенаправления)
Лицензия
Лицензировано по лицензии Apache License, Version 2.0 («Лицензия»). Вы не можете использовать этот файл, кроме как в соответствии с Лицензией. Копию Лицензии можно получить здесь.
Статус проекта
Установка
GitHub Action
Вы можете запустить gosec как GitHub action следующим образом:
Используйте версионный тег с @master, который привязан к
последнему стабильному релизу. Это обеспечит стабильное поведение.
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@master
with:
args: ./...
Сканирование проектов с приватными модулями
Если ваш проект импортирует приватные Go-модули, необходимо
настроить аутентификацию, чтобы gosec мог загружать
зависимости. Задайте следующие переменные окружения в
вашем workflow:
GOPRIVATE: список префиксов путей модулей через запятую, которые следует считать приватными (например,github.com/your-org/*).GITHUB_AUTHENTICATION_TOKEN: токен GitHub с доступом на чтение к вашим приватным репозиториям.
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
GOPRIVATE: github.com/your-org/*
GITHUB_AUTHENTICATION_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }}
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@v2
with:
args: ./...
Интеграция со сканированием кода
Вы можете интегрировать сторонние инструменты анализа кода со сканированием кода GitHub, загружая данные в виде файлов SARIF.
В рабочем процессе показан пример запуска gosec в качестве шага
в рабочем процессе GitHub Actions, который выводит файл results.sarif.
Затем рабочий процесс загружает файл results.sarif в
GitHub с помощью действия upload-sarif.
name: "Security Scan"
# Run workflow each time code is pushed to your repository and on a schedule.
# The scheduled workflow runs every at 00:00 on Sunday UTC time.
on:
push:
schedule:
- cron: '0 0 * * 0'
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@v2
with:
# we let the report trigger content trigger a failure using the GitHub Security features.
args: '-no-fail -fmt sarif -out results.sarif ./...'
- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@v2
with:
# Path to SARIF file relative to the root of the repository
sarif_file: results.sarif
Анализ Go
Пакет goanalysis предоставляет
golang.org/x/tools/go/analysis.Analyzer
для интеграции с инструментами, поддерживающими стандартный интерфейс
анализа Go, такими как фреймворк
nogo
от Bazel:
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
Локальная установка
Для gosec требуется Go 1.25 или новее.
go install github.com/securego/gosec/v2/cmd/gosec@latest
Быстрый старт
# Scan all packages in current module
gosec ./...
# Write JSON report
gosec -fmt json -out results.json ./...
# Write SARIF report for code scanning
gosec -fmt sarif -out results.sarif ./...
Коды выхода
0: сканирование завершено без неотфильтрованных находок/ошибок1: как минимум одна неотфильтрованная находка или ошибка обработки- Используйте
-no-fail, чтобы всегда возвращать0
Использование
Gosec можно настроить так, чтобы он запускал только подмножество правил,
исключал определённые пути к файлам и создавал отчёты в разных
форматах. По умолчанию все правила применяются к указанным
входным файлам. Для рекурсивного сканирования из текущего каталога
можно передать ./... в качестве входного аргумента.
Доступные правила
gosec включает правила по следующим категориям:
G1xx: общие проблемы безопасного кодирования (например, жёстко заданные учётные данные, небезопасное использование, усиление безопасности HTTP, безопасность cookie)G2xx: риски инъекций при построении запросов/шаблонов/командG3xx: риски обработки файлов и путей (права доступа, обход каталогов, временные файлы, извлечение архивов)G4xx: слабости криптографии и TLSG5xx: импорты из блок-листаG6xx: специфичные для Go проверки корректности/безопасности (например, алиасинг в range и границы срезов)G7xx: правила анализа заражения данных (taint analysis) (SQL-инъекции, инъекции команд, обход путей, SSRF, XSS, логирование, SMTP-инъекции, SSTI, небезопасная десериализация и открытый редирект)
Полный список, описания правил и конфигурацию для каждого правила см. в RULES.md.