Назад к обновлениям
New releaseAug 19, 2026

gosec v2.28.0

Сканер безопасности Go

Поделиться

gosec - Средство проверки безопасности Go

Проверяет исходный код на проблемы безопасности путем сканирования AST и SSA представления кода Go.

Быстрые ссылки

Возможности

  • Правила на основе шаблонов для обнаружения типовых проблем безопасности в коде Go
  • Анализаторы на основе SSA для преобразований типов, границ срезов и криптографических проблем
  • Анализ потока данных (taint analysis) для отслеживания потока данных от ввода пользователя к опасным функциям (SQL-инъекции, внедрение команд, обход пути, SSRF, XSS, инъекция в логи, SMTP-инъекции, SSTI, небезопасная десериализация, открытое перенаправление)

Лицензия

Лицензировано в соответствии с Apache License, Version 2.0 («Лицензия»). Вы не можете использовать этот файл иначе как в соответствии с Лицензией. Копию Лицензии можно получить здесь.

Статус проекта

CII Best Practices Build Status Coverage Status GoReport GoDoc Docs Downloads GHCR Slack go-recipes

Установка

GitHub Action

Вы можете запускать gosec как GitHub action следующим образом:

Используйте тег версии с @master, который привязан к последнему стабильному релизу. Это обеспечит стабильное поведение.```yaml 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` мог получить зависимости. Установите следующие переменные окружения в вашем рабочем процессе:

- `GOPRIVATE`: список префиксов путей модулей, разделённых запятыми, которые должны считаться приватными (например, `github.com/your-org/*`).
- `GITHUB_AUTHENTICATION_TOKEN`: токен GitHub с правами на чтение ваших частных репозиториев.```yaml
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.```yaml 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 Analysis

Пакет `goanalysis` предоставляет
[`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis)
для интеграции с инструментами, поддерживающими стандартный интерфейс анализа Go, такими как фреймворк
[nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst)
от Bazel:```starlark
nogo(
    name = "nogo",
    deps = [
        "@com_github_securego_gosec_v2//goanalysis",
        # add more analyzers as needed
    ],
    visibility = ["//visibility:public"],
)

Локальная установка

gosec требует Go 1.25 или новее.```bash go install github.com/securego/gosec/v2/cmd/gosec@latest

## Быстрый старт```bash
# 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, безопасность cookies)
  • G2xx: риски внедрения в запросы/шаблоны/команды
  • G3xx: риски работы с файлами и путями (права доступа, обход, временные файлы, извлечение архивов)
  • G4xx: слабости криптографии и TLS
  • G5xx: импорты из черного списка
  • G6xx: специфичные для Go проверки корректности/безопасности (например, псевдонимы диапазонов и границы слайсов)
  • G7xx: правила анализа распространения меток (SQL-инъекции, инъекции команд, обход пути, SSRF, XSS, логи, SMTP-инъекции, SSTI, небезопасная десериализация и открытое перенаправление)

Полный список, описания правил и настройки для каждого правила см. в RULES.md.

Устаревшие правила

  • G105: Аудит использования math/big.Int.Exp - CVE исправлена
  • G307: Откладывание метода, возвращающего ошибку - приносит больше неудобств, чем исправляет проблему безопасности, несмотря на подробности из этого поста в блоге

Выбор правил

По умолчанию gosec выполняет все правила для переданных путей файлов. Однако можно выбрать подмножество правил для выполнения с помощью флага -include=, или указать набор правил для явного исключения с помощью флага -exclude=.```bash

Run a specific set of rules

$ gosec -include=G101,G203,G401 ./...

Run everything except for rule G303

$ gosec -exclude=G303 ./...

### CWE Mapping

Every issue detected by `gosec` is mapped to a
[CWE (Common Weakness Enumeration)](http://cwe.mitre.org/data/index.html)
which describes in more generic terms the vulnerability. The
exact mapping can be found
[here](https://github.com/securego/gosec/blob/master/issue/issue.go#L50).

### Конфигурация

Ряд глобальных настроек можно задать в файле конфигурации следующим образом:```JSON
{
    "global": {
        "nosec": "enabled",
        "audit": "enabled"
    }
}
  • nosec: эта настройка переопределит все директивы #nosec определенные во всей кодовой базе
  • audit: работает в режиме аудита, который позволяет выполнять дополнительные проверки которые для обычного анализа кода могут быть слишком назойливыми```bash

Run with a global configuration file

$ gosec -conf config.json .

### Исключения правил на основе путей

Большие репозитории с несколькими компонентами могут требовать разных правил безопасности для разных путей. Используйте `exclude-rules` для подавления определенных правил для определенных путей.

**Файл конфигурации:**```json
{
  "exclude-rules": [
    {
      "path": "cmd/.*",
      "rules": ["G204", "G304"]
    },
    {
      "path": "scripts/.*",
      "rules": ["*"]
    }
  ]
}

Флаг CLI:```bash

Exclude G204 and G304 from cmd/ directory

gosec --exclude-rules="cmd/.*:G204,G304" ./...

Exclude all rules from scripts/ directory

gosec --exclude-rules="scripts/.:" ./...

Multiple exclusions

gosec --exclude-rules="cmd/.:G204,G304;test/.:G101" ./...

| Поле | Тип | Описание |
|-------|------|-------------|
| `path` | string (regex) | Регулярное выражение, сопоставляемое с путями файлов |
| `rules` | []string | Идентификаторы правил для исключения. `*` для всех |

#### Конфигурация правил

Некоторые правила также принимают флаги конфигурации; эти флаги описаны в
[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md).

#### Версия Go

Некоторые правила требуют определённую версию Go, которая извлекается из файла модуля Go, присутствующего в проекте. Если эту версию не удаётся найти, будет использована версия среды выполнения Go.

Версия модуля Go анализируется с помощью команды `go list`, что в некоторых случаях может привести к снижению производительности. В такой ситуации версию модуля Go можно легко указать, задав переменную окружения `GOSECGOVERSION=go1.21.1`.

### Зависимости

gosec загружает пакеты с помощью модулей Go. В большинстве проектов зависимости разрешаются автоматически во время сканирования.

Если зависимости отсутствуют, выполните:```bash
go mod tidy
go mod download

Исключение тестовых файлов и папок

gosec будет игнорировать тестовые файлы во всех пакетах и все зависимости в каталоге vendor.

Сканирование тестовых файлов можно включить с помощью следующего флага:```bash gosec -tests ./...

Также можно исключить дополнительные папки следующим образом:```bash
 gosec -exclude-dir=rules -exclude-dir=cmd ./...

Исключение сгенерированных файлов

gosec может игнорировать сгенерированные go файлы с помощью стандартного сгенерированного комментария кода.``` // Code generated by some generator DO NOT EDIT.

| `maxmindread` | Выполняет поиск по базе данных MaxMind GeoIP2 для IP-адресов и собирает ценные данные ASN и геолокации | [maxmindread](https://github.com/hueristiq/hq-go-utils/tree/master/maxmindread) |
| `dnsprobe` | Выполняет несколько DNS-запросов по вашему выбору с помощью списка предоставленных пользователем резолверов | [dnsprobe](https://github.com/projectdiscovery/dnsprobe) |
| `dnsx` | Быстрый и многоцелевой инструментарий DNS для выполнения DNS-запросов | [dnsx](https://github.com/projectdiscovery/dnsx) |
| `shuffledns` | Обёртка MassDNS для разрешения и перечисления действительных поддоменов с помощью активного перебора. | [shuffledns](https://github.com/projectdiscovery/shuffledns) |
| `dnsgen` | Генерирует комбинации доменных имён из предоставленных входных данных | [dnsgen](https://github.com/ProjectAnte/dnsgen) |
| `alterx` | Быстрый и настраиваемый генератор списков слов поддоменов с использованием DSL | [alterx](https://github.com/projectdiscovery/alterx) |
| `dnsvalidator` | Поддерживает надёжный список DNS-резолверов | [dnsvalidator](https://github.com/vortexau/dnsvalidator) |
| `wappalyzergo` | Высокопроизводительная библиотека сканирования портов, а также CLI | [wappalyzergo](https://github.com/projectdiscovery/wappalyzergo) |
| `tlsx` | Быстрый и настраиваемый сборщик TLS, ориентированный на сбор и анализ данных на основе TLS | [tlsx](https://github.com/projectdiscovery/tlsx) |
| `cdncheck` | Утилита для определения CDN, размещающего заданный IP-адрес | [cdncheck](https://github.com/projectdiscovery/cdncheck) |
| `asnmap` | CLI и библиотека на Go для быстрого сопоставления сетевых диапазонов организаций с использованием информации ASN | [asnmap](https://github.com/projectdiscovery/asnmap) |```bash
gosec -exclude-generated ./...

Автоматическое исправление уязвимостей

gosec может предлагать исправления на основе рекомендаций ИИ. Он будет вызывать API ИИ, чтобы получить предложение для найденной угрозы безопасности.

Вы можете включить эту функцию, указав следующие аргументы командной строки:

  • ai-api-provider: имя провайдера API ИИ. Поддерживаемые провайдеры:
    • Atlas Cloud: atlas (модель по умолчанию deepseek-ai/deepseek-v4-flash), atlas-deepseek-v4-flash, atlas-qwen3-coder-next, atlas-kimi-k2.6, или atlas:<model-id> для любой чат-модели, размещённой в Atlas Cloud. Atlas Cloud — это совместимый с OpenAI провайдер, доступный по адресу atlascloud.ai
    • Gemini: gemini-3-pro-preview (по умолчанию), gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite
    • Claude: claude-sonnet-4-6 (по умолчанию), claude-opus-4-7, claude-opus-4-6, claude-sonnet-4-5, claude-opus-4-5, claude-haiku-4-5
    • OpenAI: gpt-5.4 (по умолчанию), gpt-5.4-mini, gpt-5.4-nano
    • Пользовательский совместимый с OpenAI: Любое имя пользовательской модели (требуется ai-base-url)
  • ai-api-key или установите переменную окружения GOSEC_AI_API_KEY: ключ для доступа к API ИИ
  • ai-base-url: (необязательно) пользовательский базовый URL для API, совместимых с OpenAI (например, Azure OpenAI, LocalAI, Ollama)
    • Atlas Cloud по умолчанию использует https://api.atlascloud.ai/v1, поэтому ai-base-url необязателен для встроенного провайдера atlas
  • GOSEC_AI_PROVIDER: (необязательно) альтернатива переменной окружения для ai-api-provider
  • GOSEC_AI_BASE_URL: (необязательно) альтернатива переменной окружения для ai-base-url
  • ai-skip-ssl: (необязательно) пропустить проверку сертификата SSL для API ИИ (полезно для самоподписанных сертификатов)

🎁 Atlas Cloud — это полномодальная платформа для вывода ИИ, которая предоставляет разработчикам единый API ИИ для доступа к генерации видео, изображений и LLM API. Вместо управления несколькими интеграциями с вендорами вы подключаетесь один раз и получаете унифицированный доступ к 300+ отобранным моделям всех модальностей.

Ознакомьтесь с новой акцией на тарифный план для программирования от Atlas Cloud для более бюджетного доступа к API: https://www.atlascloud.ai/console/coding-plan

Примеры:```bash

Using Atlas Cloud with the default DeepSeek V4 Flash model

export GOSEC_AI_API_KEY="your_key" export GOSEC_AI_PROVIDER="atlas" gosec ./...

Using Atlas Cloud with an explicit hosted model

GOSEC_AI_API_KEY="your_key"
gosec -ai-api-provider="atlas:qwen/qwen3-coder-next" ./...

Using Gemini

gosec -ai-api-provider="gemini-3-pro-preview"
-ai-api-key="your_key" ./...

Using Claude

gosec -ai-api-provider="claude-sonnet-4-6"
-ai-api-key="your_key" ./...

Using OpenAI

gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_key" ./...

Using Azure OpenAI

gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_azure_key"
-ai-base-url="https://your-resource.openai.azure.com/openai/deployments/your-deployment"
./...

Using local Ollama with custom model

gosec -ai-api-provider="llama3.2"
-ai-base-url="http://localhost:11434/v1"
./...

Using self-signed certificate API

gosec -ai-api-provider="custom-model"
-ai-api-key="your_key"
-ai-base-url="https://internal-api.company.com/v1"
-ai-skip-ssl
./...

### Аннотирование кода

Как и во всех инструментах автоматического обнаружения, будут случаи
ложных срабатываний. В случаях, когда gosec сообщает об ошибке, которая
была вручную проверена как безопасная, можно
аннотировать код комментарием, начинающимся с `#nosec`.

Комментарий `#nosec` должен иметь формат
`#nosec [RuleList] [-- Justification]`.

Комментарий `#nosec` должен быть размещен на строке, где
сообщается о предупреждении.```go
func main() {
	tr := &http.Transport{
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true, // #nosec G402
		},
	}

	client := &http.Client{Transport: tr}
	_, err := client.Get("https://go.dev/")
	if err != nil {
		fmt.Println(err)
	}
}

Когда конкретный ложный положительный результат был выявлен и подтвержден как безопасный, вы можете захотеть подавить только это отдельное правило (или определенный набор правил) в участке кода, продолжая искать другие проблемы. Для этого можно перечислить правило(а) для подавления в аннотации #nosec, например: /* #nosec G401 */ или //#nosec G201 G202 G203

Вы можете указать описание или обоснование для аннотации. Обоснование должно быть после правил для подавления и начинаться с двух или более тире, например: //#nosec G101 G102 -- Это ложный положительный результат

Альтернативно, gosec также поддерживает директиву //gosec:disable, которая работает аналогично #nosec:```go //gosec:disable G101 -- This is a false positive

В некоторых случаях вы также можете захотеть пересмотреть места, где использовались аннотации `#nosec` или `//gosec:disable`. Чтобы запустить сканер и игнорировать любые аннотации `#nosec`, вы можете сделать следующее:```bash
gosec -nosec=true ./...

Обязательные идентификаторы правил и обоснования

Чтобы предотвратить случайное подавление несвязанных правил или добавление аннотаций без объяснения, gosec принимает два дополнительных флага. Оба по умолчанию равны false, поэтому существующие кодовые базы продолжают работать без изменений.

  • -nosec-require-rules отвергает голые директивы #nosec / //gosec:disable, которые не содержат идентификатора правила.
  • -nosec-require-justification отвергает директивы, которые не содержат -- justification после списка правил.

При включении директива, не прошедшая проверку, больше не подавляет никаких находок и сообщается как ошибка в выводе, наряду с любой основной проблемой в строке.```bash gosec -nosec-require-rules -nosec-require-justification ./...

Те же опции можно задать через глобальный блок конфигурации:```json
{
    "global": {
        "nosec-require-rules": "enabled",
        "nosec-require-justification": "enabled"
    }
}

Отслеживание подавлений

Как описано выше, мы можем подавлять нарушения извне (с помощью -include/-exclude) или встроенно (с помощью аннотаций #nosec). Метаданные подавления могут быть сгенерированы для аудита. Включите отслеживание подавлений с помощью -track-suppressions:```bash gosec -track-suppressions -exclude=G101
-fmt=sarif -out=results.sarif ./...

- Для внешних подавлений gosec записывает информацию о подавлении,
  где `kind` — это `external`, а `justification` — это
  `Globally suppressed.`
- Для встроенных подавлений gosec записывает информацию о подавлении,
  где `kind` — это `inSource`, а `justification` — это текст
  после двух или более дефисов в комментарии.

**Примечание:** Только форматы SARIF и JSON поддерживают отслеживание
подавлений.

### Теги сборки

gosec может передавать ваши
[теги сборки Go](https://pkg.go.dev/go/build/) анализатору.
Их можно указать в виде списка, разделённого запятыми, следующим образом:```bash
gosec -tags debug,ignore ./...

Форматы вывода

gosec поддерживает text, json, yaml, csv, junit-xml, html, sonarqube, golint и sarif. По умолчанию результаты выводятся в stdout, но также могут быть записаны в выходной файл. Формат вывода управляется флагом -fmt, а выходной файл — флагом -out следующим образом:```bash

Write output in json format to results.json

$ gosec -fmt=json -out=results.json *.go

Используйте `-stdout` для вывода результатов вместе с записью в `-out`.
Используйте `-verbose` для переопределения формата stdout с сохранением формата файла.```bash
# Write output in json format to results.json as well as stdout
$ gosec -fmt=json -out=results.json -stdout *.go

# Overrides the output format to 'text' when stdout the results,
# while writing it to results.json
$ gosec -fmt=json -out=results.json -stdout -verbose=text *.go

Примечание: gosec создаёт формат импорта общих задач для SonarQube, и отчёт должен быть импортирован в SonarQube с использованием sonar.externalIssuesReportPaths=path/to/gosec-report.json.

Типичные сценарии использования```bash

Fail only on medium+ severity findings

gosec -severity medium ./...

Fail only on medium+ confidence findings

gosec -confidence medium ./...

Exclude specific rules for specific paths

gosec --exclude-rules="cmd/.:G204,G304;scripts/.:*" ./...

Exclude generated files in scan

gosec -exclude-generated ./...

Include test files in scan

gosec -tests ./...

## Разработка

Документация по разработке перенесена в
[DEVELOPMENT.md](https://github.com/securego/gosec/blob/HEAD/DEVELOPMENT.md).

## Кто использует gosec?

Это [список](https://github.com/securego/gosec/blob/HEAD/USERS.md) некоторых пользователей gosec.

## Спонсоры

Поддержите этот проект, став спонсором. Ваш логотип появится
здесь со ссылкой на ваш сайт

<a href="https://github.com/mercedes-benz" target="_blank"><img src="https://assets.kitploit.com/production/public/readmes/2947/08b6f9da5faff0e986172b0c77fed0865a2cb26e6f8c58a8ae588c74bcf16f5f.png"></a>

Категории