
gosec v2.28.0
Сканер безопасности Go
gosec - Средство проверки безопасности Go
Проверяет исходный код на проблемы безопасности путем сканирования AST и SSA представления кода Go.
Быстрые ссылки
- GitHub Action
- Локальная установка
- Быстрый старт
- Типовые шаблоны использования
- Выбор правил
- Форматы вывода
Возможности
- Правила на основе шаблонов для обнаружения типовых проблем безопасности в коде Go
- Анализаторы на основе SSA для преобразований типов, границ срезов и криптографических проблем
- Анализ потока данных (taint analysis) для отслеживания потока данных от ввода пользователя к опасным функциям (SQL-инъекции, внедрение команд, обход пути, SSRF, XSS, инъекция в логи, SMTP-инъекции, SSTI, небезопасная десериализация, открытое перенаправление)
Лицензия
Лицензировано в соответствии с Apache License, Version 2.0 («Лицензия»). Вы не можете использовать этот файл иначе как в соответствии с Лицензией. Копию Лицензии можно получить здесь.
Статус проекта
Установка
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: слабости криптографии и TLSG5xx: импорты из черного списка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)
- Atlas Cloud:
ai-api-keyили установите переменную окруженияGOSEC_AI_API_KEY: ключ для доступа к API ИИ- Для Gemini вы можете создать ключ API, следуя этим инструкциям
- Для Claude получите ключ API из Anthropic Console
- Для OpenAI получите ключ API из OpenAI Platform
ai-base-url: (необязательно) пользовательский базовый URL для API, совместимых с OpenAI (например, Azure OpenAI, LocalAI, Ollama)- Atlas Cloud по умолчанию использует
https://api.atlascloud.ai/v1, поэтомуai-base-urlнеобязателен для встроенного провайдераatlas
- Atlas Cloud по умолчанию использует
GOSEC_AI_PROVIDER: (необязательно) альтернатива переменной окружения дляai-api-providerGOSEC_AI_BASE_URL: (необязательно) альтернатива переменной окружения дляai-base-urlai-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>