
gosec v2.28.0
Go セキュリティチェッカー
gosec - Go セキュリティチェッカー
Go AST および SSA コード表現をスキャンすることで、ソースコードのセキュリティ問題を検査します。
クイックリンク
特徴
- パターンベースのルール — Go コードにおける一般的なセキュリティ問題を検出
- SSA ベースのアナライザー — 型変換、スライス境界、暗号問題に対応
- 汚染解析 — ユーザー入力から危険な関数(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: ./...
コードスキャンとの統合
SARIFファイルとしてデータをアップロードすることで、サードパーティのコード分析ツールを統合し、GitHubコードスキャンと連携できます。
このワークフローは、gosec をGitHub Actionsワークフローのステップとして実行し、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`パッケージは、
[`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 を参照してください。
廃止されたルール
- G105: math/big.Int.Exp の使用の監査 - CVE は修正済み
- G307: エラーを返すメソッドの defer - この ブログ記事 の詳細にもかかわらず、 セキュリティ問題を修正するよりも不便を引き起こすため
ルールの選択
デフォルトでは、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/.:" ./...