
Go セキュリティチェッカー
# gosec - Go セキュリティチェッカー
Go の AST および SSA コード表現をスキャンして、ソースコードのセキュリティ問題を検査します。
<img src="https://assets.kitploit.com/production/public/readmes/2947/83d294db3a312bcea542b6eb8261128e6f09b50a95271788fe301e164b1655b1.png" width="320">
## クイックリンク
- [GitHub Action](#github-action)
- [ローカルインストール](#local-installation)
- [クイックスタート](#quick-start)
- [一般的な使用パターン](#common-usage-patterns)
- [ルールの選択](#selecting-rules)
- [出力フォーマット](#output-formats)
## 機能
- Go コードにおける一般的なセキュリティ問題を検出するための**パターンベースのルール**
- 型変換、スライス境界、暗号関連の問題に対応する**SSA ベースのアナライザー**
- ユーザー入力から危険な関数へのデータフローを追跡する**テイント解析**(SQL インジェクション、コマンドインジェクション、パストラバーサル、SSRF、XSS、ログインジェクション、SMTP インジェクション、SSTI、安全でないデシリアライゼーション、オープンリダイレクト)
## ライセンス
Apache License, Version 2.0(「本ライセンス」)の下でライセンスされています。
本ライセンスに準拠しない限り、このファイルを使用することはできません。
本ライセンスのコピーは
[こちら](http://www.apache.org/licenses/LICENSE-2.0)から入手できます。
## プロジェクトの状況
[](https://bestpractices.coreinfrastructure.org/projects/3218)
[](https://github.com/securego/gosec/actions?query=workflows%3ACI)
[](https://codecov.io/gh/securego/gosec)
[](https://goreportcard.com/report/github.com/securego/gosec)
[](https://pkg.go.dev/github.com/securego/gosec/v2)
[](https://securego.io/)
[](https://github.com/securego/gosec/releases)
[](https://github.com/orgs/securego/packages/container/package/gosec)
[](http://securego.slack.com)
[](https://github.com/nikolaydubina/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: ./...
```
### コードスキャンとの統合
データを SARIF ファイルとしてアップロードすることで、[サードパーティのコード解析ツールを](https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/integrating-with-code-scanning)
GitHub コードスキャンと統合できます。
このワークフローは、GitHub アクションワークフローのステップとして `gosec` を実行し、`results.sarif`
ファイルを出力する例を示しています。その後、ワークフローは `upload-sarif` アクションを使用して `results.sarif` ファイルを
GitHub にアップロードします。
```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 解析
`goanalysis` パッケージは、標準の Go 解析インターフェースをサポートするツール(Bazel の [nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst) フレームワークなど)との統合のために [`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis) を提供します:
```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`: 抑制されていない検出結果または処理エラーが少なくとも1件存在
- 常に `0` を返すには `-no-fail` を使用
## 使用方法
Gosec は、ルールのサブセットのみを実行する、特定のファイルパスを除外する、異なる形式でレポートを生成するように設定できます。デフォルトでは、すべてのルールが指定された入力ファイルに対して実行されます。カレントディレクトリから再帰的にスキャンするには、入力引数として `./...` を指定できます。
### 利用可能なルール
gosec には以下のカテゴリにわたるルールが含まれています:
- `G1xx`: 一般的なセキュアコーディングの問題 (例: ハードコードされた認証情報、安全でない使用法、HTTP の強化、Cookie のセキュリティ)
- `G2xx`: クエリ/テンプレート/コマンド構築におけるインジェクションリスク
- `G3xx`: ファイルおよびパス処理のリスク (パーミッション、トラバーサル、一時ファイル、アーカイブ展開)
- `G4xx`: 暗号および TLS の脆弱性
- `G5xx`: ブロックリストに登録されたインポート
- `G6xx`: Go 固有の正確性/セキュリティチェック (例: range のエイリアシングやスライスの境界)
- `G7xx`: テイント解析ルール (SQL インジェクション、コマンドインジェクション、パストラバーサル、SSRF、XSS、ログ、SMTP インジェクション、SSTI、安全でないデシリアライゼーション、オープンリダイレクト)
完全なリスト、ルールの説明、およびルールごとの設定については、[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md) を参照してください。
### 廃止されたルール
- G105: math/big.Int.Exp の使用を監査 -
[CVE は修正済み](https://github.com/golang/go/issues/15184)
- G307: エラーを返すメソッドの defer -
この
[ブログ記事](https://www.joeshaw.org/dont-defer-close-on-writable-files/)の詳細にもかかわらず、セキュリティ問題の修正よりも不便さを引き起こすため
### ルールの選択
デフォルトでは、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 マッピング
`gosec` が検出するすべてのイシューは、脆弱性をより一般的な用語で説明する
[CWE (Common Weakness Enumeration)](http://cwe.mitre.org/data/index.html)
にマッピングされます。正確なマッピングは
[こちら](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 | 除外するルールID。`*` はすべてを意味する |
#### ルール設定
一部のルールは設定フラグも受け付けます。これらのフラグは
[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md)に
記載されています。
#### Goバージョン
一部のルールは特定のGoバージョンを必要とし、そのバージョンは
プロジェクト内に存在するGoモジュールファイルから取得されます。このバージョンが
見つからない場合は、Goランタイムのバージョンにフォールバックします。
Goモジュールのバージョンは `go list` コマンドを使用して解析され、
場合によってはパフォーマンスの低下を引き起こす可能性があります。このような
状況では、環境変数
`GOSECGOVERSION=go1.21.1` を設定することでGoモジュールのバージョンを簡単に
指定できます。
### 依存関係
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.
```
```bash
gosec -exclude-generated ./...
```
### 脆弱性の自動修正
gosec は AI の推奨に基づいて修正を提案できます。セキュリティ上の検出事項に対する提案を受け取るために AI API を呼び出します。
この機能を有効にするには、以下のコマンドライン引数を指定します:
- `ai-api-provider`: AI API プロバイダーの名前。
サポートされるプロバイダー:
- **Atlas Cloud**: `atlas` (デフォルトモデル
`deepseek-ai/deepseek-v4-flash`)、
`atlas-deepseek-v4-flash`、
`atlas-qwen3-coder-next`、`atlas-kimi-k2.6`、または
Atlas Cloud でホストされる任意のチャットモデルには
`atlas:<model-id>`。
Atlas Cloud は
[atlascloud.ai](https://www.atlascloud.ai/?utm_source=github&utm_medium=link&utm_campaign=gosec)
で利用可能な OpenAI 互換プロバイダーです
- **Gemini**: `gemini-3.1-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` を設定: AI API にアクセスするためのキー
- Gemini の場合、
[こちらの手順](https://ai.google.dev/gemini-api/docs/api-key)
に従って API キーを作成できます
- Claude の場合、
[Anthropic Console](https://console.anthropic.com/)
から API キーを取得してください
- OpenAI の場合、
[OpenAI Platform](https://platform.openai.com/api-keys)
から API キーを取得してください
- `ai-base-url`: (オプション) OpenAI 互換 API
(例: Azure OpenAI、LocalAI、
Ollama) 用のカスタムベース URL
- Atlas Cloud はデフォルトで `https://api.atlascloud.ai/v1`
を使用するため、組み込みの `atlas`
プロバイダーでは `ai-base-url` はオプションです
- `GOSEC_AI_PROVIDER`: (オプション) `ai-api-provider`
の代替となる環境変数
- `GOSEC_AI_BASE_URL`: (オプション) `ai-base-url`
の代替となる環境変数
- `ai-skip-ssl`: (オプション) AI API の SSL 証明書検証を
スキップします (自己署名証明書に便利です)
> 🎁 **[Atlas Cloud](https://www.atlascloud.ai/?utm_source=github&utm_medium=link&utm_campaign=gosec)** はフルモーダル AI 推論プラットフォームで、開発者に動画生成、画像生成、LLM API へアクセスするための単一の AI API を提供します。複数のベンダー統合を管理する代わりに、一度接続するだけで、あらゆるモダリティにわたる 300 以上の厳選モデルへ統合アクセスできます。
>
> より予算に優しい API アクセスのために、Atlas Cloud の新しいコーディングプランキャンペーンをチェックしてください: [https://www.atlascloud.ai/console/coding-plan](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.1-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`
アノテーションの説明や正当化のテキストを記述することもできます。正当化は抑制するルールの後に記述し、2つ以上のダッシュで始める必要があります。例: `//#nosec G101 G102 -- This is a false positive`
あるいは、gosec は `//gosec:disable` ディレクティブもサポートしており、これは `#nosec` と同様に機能します:
```go
//gosec:disable G101 -- This is a false positive
```
場合によっては、`#nosec` や `//gosec:disable` の注釈が使用されている箇所を再確認したいこともあるでしょう。スキャナを実行し、`#nosec` の注釈をすべて無視するには、次のようにします:
```bash
gosec -nosec=true ./...
```
#### ルールIDと正当性の要求
アノテーションが無関係なルールを誤って抑制したり、説明なしで追加されたりするのを防ぐため、gosecは2つのオプトインフラグを受け付けます。どちらもデフォルトは`false`であるため、既存のコードベースは変更なく動作し続けます。
- `-nosec-require-rules`は、ルールIDを一切列挙していない裸の`#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` はコメント内の2つ以上のダッシュ以降のテキストとなります。
**注:** 抑制の追跡をサポートするのは 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` をサポートしています。デフォルトでは、
結果は標準出力に報告されますが、出力ファイルに書き込むこともできます。
出力形式は `-fmt` フラグで制御され、出力ファイルは `-out` フラグで
次のように制御されます:
```bash
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json *.go
```
`-out` への書き込みと同時に結果を出力するには `-stdout` を使用します。
ファイル形式を維持しつつ stdout 形式を上書きするには `-verbose` を使用します。
```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 用の
[generic issue import format](https://docs.sonarqube.org/latest/analysis/generic-issue/)
を生成し、レポートは
`sonar.externalIssuesReportPaths=path/to/gosec-report.json`
を使用して SonarQube にインポートする必要があります。
## 一般的な使用パターン
```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/master/DEVELOPMENT.md) に移動しました。
## gosec を利用しているのは誰ですか?
gosec の利用者の一部をまとめた[リスト](https://github.com/securego/gosec/blob/master/USERS.md)です。
## スポンサー
スポンサーになってこのプロジェクトを支援してください。あなたのロゴが
ウェブサイトへのリンクとともにここに表示されます
<a href="https://github.com/mercedes-benz" target="_blank"><img src="https://assets.kitploit.com/production/public/readmes/2947/08b6f9da5faff0e986172b0c77fed0865a2cb26e6f8c58a8ae588c74bcf16f5f.png"></a>