
Сканер безопасности Go
Проверяет исходный код на проблемы безопасности путем сканирования AST и SSA представления кода Go.
Лицензировано в соответствии с Apache License, Version 2.0 («Лицензия»). Вы не можете использовать этот файл иначе как в соответствии с Лицензией. Копию Лицензии можно получить здесь.
Вы можете запускать 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"
on: push: schedule:
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, чтобы всегда возвращать 0Gosec можно настроить на выполнение только подмножества правил, исключение определенных путей файлов и создание отчетов в разных форматах. По умолчанию все правила применяются к переданным входным файлам. Для рекурсивного сканирования из текущего каталога можно указать ./... в качестве аргумента ввода.
gosec включает правила по следующим категориям:
G1xx: общие проблемы безопасного кодирования (например, жестко заданные учетные данные, небезопасное использование, усиление HTTP, безопасность cookies)G2xx: риски внедрения в запросы/шаблоны/командыG3xx: риски работы с файлами и путями (права доступа, обход, временные файлы, извлечение архивов)G4xx: слабости криптографии и TLSG5xx: импорты из черного спискаG6xx: специфичные для Go проверки корректности/безопасности (например, псевдонимы диапазонов и границы слайсов)G7xx: правила анализа распространения меток (SQL-инъекции, инъекции команд, обход пути, SSRF, XSS, логи, SMTP-инъекции, SSTI, небезопасная десериализация и открытое перенаправление)Полный список, описания правил и настройки для каждого правила см. в RULES.md.
По умолчанию gosec выполняет все правила для переданных путей файлов. Однако можно выбрать подмножество правил для выполнения с помощью флага -include=, или указать набор правил для явного исключения с помощью флага -exclude=.```bash
$ gosec -include=G101,G203,G401 ./...
$ 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$ gosec -conf config.json .
### Исключения правил на основе путей
Большие репозитории с несколькими компонентами могут требовать разных правил безопасности для разных путей. Используйте `exclude-rules` для подавления определенных правил для определенных путей.
**Файл конфигурации:**```json
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
Флаг CLI:```bash
gosec --exclude-rules="cmd/.*:G204,G304" ./...
gosec --exclude-rules="scripts/.:" ./...
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 (модель по умолчанию
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.aigemini-3-pro-preview (по умолчанию),
gemini-2.5-pro, gemini-2.5-flash,
gemini-2.5-flash-liteclaude-sonnet-4-6 (по умолчанию),
, ,
, ,
🎁 Atlas Cloud — это полномодальная платформа для вывода ИИ, которая предоставляет разработчикам единый API ИИ для доступа к генерации видео, изображений и LLM API. Вместо управления несколькими интеграциями с вендорами вы подключаетесь один раз и получаете унифицированный доступ к 300+ отобранным моделям всех модальностей.
Ознакомьтесь с новой акцией на тарифный план для программирования от Atlas Cloud для более бюджетного доступа к API: https://www.atlascloud.ai/console/coding-plan
Примеры:```bash
export GOSEC_AI_API_KEY="your_key" export GOSEC_AI_PROVIDER="atlas" gosec ./...
GOSEC_AI_API_KEY="your_key"
gosec -ai-api-provider="atlas:qwen/qwen3-coder-next" ./...
gosec -ai-api-provider="gemini-3-pro-preview"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="claude-sonnet-4-6"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_key" ./...
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"
./...
gosec -ai-api-provider="llama3.2"
-ai-base-url="http://localhost:11434/v1"
./...
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
$ 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.
gosec -severity medium ./...
gosec -confidence medium ./...
gosec --exclude-rules="cmd/.:G204,G304;scripts/.:*" ./...
gosec -exclude-generated ./...
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>
claude-opus-4-7claude-opus-4-6claude-sonnet-4-5claude-opus-4-5claude-haiku-4-5gpt-5.4 (по умолчанию), gpt-5.4-mini,
gpt-5.4-nanoai-base-url)ai-api-key или установите переменную окружения
GOSEC_AI_API_KEY: ключ для доступа к API ИИ
ai-base-url: (необязательно) пользовательский базовый URL для
API, совместимых с OpenAI (например, Azure OpenAI, LocalAI,
Ollama)
https://api.atlascloud.ai/v1,
поэтому ai-base-url необязателен для встроенного провайдера atlasGOSEC_AI_PROVIDER: (необязательно) альтернатива переменной окружения
для ai-api-providerGOSEC_AI_BASE_URL: (необязательно) альтернатива переменной окружения
для ai-base-urlai-skip-ssl: (необязательно) пропустить проверку сертификата SSL
для API ИИ (полезно для самоподписанных сертификатов)