
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 付きのバージョンタグを使用してください。これにより安定した動作が提供されます。
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 トークン。
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 コードスキャンと統合できます。
このワークフローは、GitHub アクションワークフローのステップとして gosec を実行し、results.sarif
ファイルを出力する例を示しています。その後、ワークフローは upload-sarif アクションを使用して results.sarif ファイルを
GitHub にアップロードします。
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 フレームワークなど)との統合のために golang.org/x/tools/go/analysis.Analyzer を提供します:
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
ローカルインストール
gosec には Go 1.25 以降が必要です。
go install github.com/securego/gosec/v2/cmd/gosec@latest
クイックスタート
# 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 を参照してください。
廃止されたルール
- G105: math/big.Int.Exp の使用を監査 - CVE は修正済み
- G307: エラーを返すメソッドの defer - この ブログ記事の詳細にもかかわらず、セキュリティ問題の修正よりも不便さを引き起こすため
ルールの選択
デフォルトでは、gosec は指定されたファイルパスに対してすべてのルールを実行します。ただし、-include= フラグを使用して実行するルールのサブセットを選択したり、-exclude= フラグを使用して明示的に除外するルールのセットを指定したりすることが可能です。
# 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)
にマッピングされます。正確なマッピングは
こちら
で確認できます。
設定
次のように、設定ファイルでいくつかのグローバル設定を 指定できます:
{
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
nosec: この設定はコードベース全体で定義されたすべての#nosecディレクティブを上書きしますaudit: 監査モードで実行され、通常のコード分析では干渉しすぎる可能性がある追加チェックが有効になります
# Run with a global configuration file
$ gosec -conf config.json .
パスベースのルール除外
複数のコンポーネントを持つ大規模なリポジトリでは、パスごとに異なるセキュリティルールが必要になる場合があります。exclude-rules を使用して、特定のパスに対して特定のルールを抑制します。
設定ファイル:
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
CLI フラグ:
# 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" ./...