
Go AST および SSA コード表現をスキャンすることで、ソースコードのセキュリティ問題を検査します。
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: ./...
SARIFファイルとしてデータをアップロードすることで、サードパーティのコード分析ツールを統合し、GitHubコードスキャンと連携できます。
このワークフローは、gosec をGitHub Actionsワークフローのステップとして実行し、results.sarif ファイルを出力する例を示しています。その後、ワークフローは upload-sarif アクションを使用して results.sarif ファイルをGitHubにアップロードします。```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分析
`goanalysis`パッケージは、
[`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis)
を提供します。これは、標準のGo
分析インターフェースをサポートするツール、例えばBazelの
[nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst)
フレームワークとの統合のためのものです:```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つの抑制されていない発見または処理エラー-no-fail を使用すると常に 0 を返すGosec は、ルールのサブセットのみを実行したり、特定のファイルパスを除外したり、異なる形式でレポートを生成するように設定できます。デフォルトでは、与えられた入力ファイルに対してすべてのルールが実行されます。カレントディレクトリから再帰的にスキャンするには、入力引数として ./... を指定します。
gosec は以下のカテゴリにわたるルールを含んでいます:
G1xx: 一般的なセキュアコーディングの問題(例:ハードコードされた認証情報、安全でない使用法、HTTP 強化、クッキーセキュリティ)G2xx: クエリ/テンプレート/コマンド構築におけるインジェクションリスクG3xx: ファイルおよびパス処理のリスク(パーミッション、パストラバーサル、一時ファイル、アーカイブ抽出)G4xx: 暗号化および TLS の脆弱性G5xx: ブロックリストに登録されたインポートG6xx: Go 固有の正当性/セキュリティチェック(例:range エイリアシング、スライス境界)G7xx: 汚染解析ルール(SQL インジェクション、コマンドインジェクション、パストラバーサル、SSRF、XSS、ログ、SMTP インジェクション、SSTI、安全でないデシリアライゼーション、オープンリダイレクト)完全なリスト、ルールの説明、ルールごとの設定については RULES.md を参照してください。
デフォルトでは、gosec は与えられたファイルパスに対してすべてのルールを実行します。しかし、-include= フラグを使用して実行するルールのサブセットを選択したり、-exclude= フラグを使用して明示的に除外するルールのセットを指定することが可能です。```bash
$ gosec -include=G101,G203,G401 ./...
$ 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$ 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 | 除外するルール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 は、すべてのパッケージのテストファイルと、ベンダーディレクトリ内の依存関係を無視します。
テストファイルのスキャンは、次のフラグで有効にできます:```bash gosec -tests ./...
また、追加のフォルダを以下のように除外することもできます:```bash
gosec -exclude-dir=rules -exclude-dir=cmd ./...
gosec は、デフォルトの生成コードコメントを使用して生成された Go ファイルを無視できます。``` // Code generated by some generator DO NOT EDIT.
**CVE-2021-4034-alternative**
- このモジュールは、Python が利用できない場合の `cve_2021_4034_pwnkit_lpe_pkexec` モジュールの代替として、[CVE-2021-4034](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-4034) の悪用を試みます。
- [GitHub から代替エクスプロイトバイナリ](https://github.com/ly4k/PwnKit) をダウンロードし、実行時に `chmod u+s /usr/bin/pkexec` を実行して SUID バイナリを作成しようとします。成功すると、`/usr/bin/pkexec /bin/sh -p` を実行してルートシェルを取得します。
- **サポート対象プラットフォーム**: Linux
**options.cve_2021_4034_alternative.url**
- 代替エクスプロイトバイナリをダウンロードするための URL。
- **デフォルト**: `https://raw.githubusercontent.com/ly4k/PwnKit/main/PwnKit`
- デフォルトがアクセスできない場合は、代替 URL を指定できます。
**cve_2021_4034_pwnkit_lpe_pkexec**
- このモジュールは、pkexec(polkit 認証エージェントの一部として使用される setuid バイナリ)の脆弱性である [CVE-2021-4034](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-4034) の悪用を試みます。
- この特定のバリアントは、[ly4k](https://github.com/ly4k/PwnKit) によって開発された `PwnKit` エクスプロイトを活用します。
- **サポート対象プラットフォーム**: Linux
**cve_2021_4034_pwnkit_lpe_pkexec_solaris**
- このモジュールは、Solaris システム上で CVE-2021-4034 を悪用します。
- 注意: これは Linux の pkexec エクスプロイトとは異なるバリアントであり、特に Solaris を標的にしています。
- **サポート対象プラットフォーム**: Solaris
**cve_2021_4034_pwnkit_lpe_pkexec_solaris_alt**
- このモジュールは、CVE-2021-4034 に対する代替の Solaris エクスプロイト手法です。
- **サポート対象プラットフォーム**: Solaris
**linux_exploit_suggester_2**
- Linux Exploit Suggester 2 (LES2) は、Linux システム上で潜在的な権限昇格ベクトルを特定するために設計されたツールです。
- カーネルバージョン、アーキテクチャ、その他のシステム設定を既知の脆弱性データベースと比較します。
- **サポート対象プラットフォーム**: Linux
- **オプション**: `check```bash
gosec -exclude-generated ./...
gosec は AI の推奨に基づいて修正案を提案できます。セキュリティの問題に対する提案を得るために AI API を呼び出します。
この機能を有効にするには、以下のコマンドライン引数を指定します:
ai-api-provider: AI API プロバイダーの名前。
サポートされているプロバイダー:
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 は OpenAI 互換のプロバイダーで、atlascloud.ai で利用できます。gemini-3-pro-preview(デフォルト)、
gemini-2.5-pro、gemini-2.5-flash、
gemini-2.5-flash-liteclaude-sonnet-4-6(デフォルト)、
、、
、、
🎁 Atlas Cloud は、開発者に単一の AI API を提供し、動画生成、画像生成、LLM API にアクセスできるフルモーダル AI 推論プラットフォームです。複数のベンダー統合を管理する代わりに、一度接続するだけで、300 以上の厳選されたモデルにすべてのモダリティで統合アクセスできます。
より予算に優しい API アクセスについては、Atlas Cloud の新しいコーディングプランプロモーションをご覧ください: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)
}
}
特定の誤検出(false positive)が確認され、安全であると検証された場合、コードのセクション内でその単一のルール(または特定のルールセット)のみを抑制し、他の問題のスキャンを続けたいことがあります。これを行うには、#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 ./...
アノテーションが無関係なルールを誤って抑制したり、説明なしに追加されたりするのを防ぐために、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 build tags](https://pkg.go.dev/go/build/)をアナライザに渡すことができます。
これらは以下のようにカンマ区切りのリストとして提供できます。```bash
gosec -tags debug,ignore ./...
gosecは text, json, yaml, csv, junit-xml,
html, sonarqube, golint, sarif をサポートしています。デフォルトでは結果は標準出力に報告されますが、出力ファイルに書き込むこともできます。出力形式は -fmt フラグで制御され、出力ファイルは -out フラグで制御されます。その方法は次の通りです:
$ gosec -fmt=json -out=results.json ./...
``````bash
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json *.go
Use -stdout を使用すると、結果を表示しながら -out にも書き込めます。
Use -verbose を使用すると、ファイル形式を保持したまま stdout のフォーマットを上書きできます。```bash
$ gosec -fmt=json -out=results.json -stdout *.go
$ gosec -fmt=json -out=results.json -stdout -verbose=text *.go
**注記:** gosecはSonarQube向けに
[汎用課題インポート形式](https://docs.sonarqube.org/latest/analysis/generic-issue/)
を生成します。レポートは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 に移動しました。
これは gosec のユーザーの一部をまとめたリストです。
スポンサーになることでこのプロジェクトを支援してください。あなたのロゴがここに表示され、あなたのウェブサイトへのリンクが貼られます。
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 を設定:AI API にアクセスするためのキー
ai-base-url:(オプション)OpenAI 互換 API のカスタムベース URL(例:Azure OpenAI、LocalAI、Ollama)
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 証明書検証をスキップ(自己署名証明書に便利)