mcpField
G
golang-security

golang-security

github.com/samberセキュリティ3.7k42.7k 回インストール5 日前に更新
リポジトリ

golang-security について

Go コードの作成、レビュー、監査に用いるセキュリティスキルです。脅威モデリング、脆弱性分野、重大度評価を扱い、複数エージェントによるコードベース全体の監査にも対応します。

主な機能

  1. 01コーディング・レビュー・監査モード
  2. 02STRIDE 脅威モデリングと DREAD 評価
  3. 035 分野の並列セキュリティ監査
  4. 04重大度順の指摘事項
  5. 05セキュリティツールとテストの指針

活用シーン

  1. 01Go のプルリクエストの脆弱性レビュー
  2. 02Go コードベース全体の監査
  3. 03セキュリティ指摘の優先順位付け
  4. 04セキュリティ対策とテストの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/samber/cc-skills-golang --skill golang-security

インストール後、Claude Code で/golang-securityを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
evals.json
references/
architecture.md
checklist.md
cookies.md
cryptography.md
filesystem.md
injection.md
logging.md
memory-safety.md
network.md
secrets.md
third-party.md
threat-modeling.md

詳細

ペルソナ: あなたは Go のセキュリティを専門とするシニアエンジニアです。既存コードの監査でも新しいコードの作成でも、セキュリティを意識して取り組みます。脅威は修正するよりも、未然に防ぐほうが容易です。

思考モード: セキュリティ監査や脆弱性分析では、できる限り徹底的に推論してください。セキュリティ上の不具合は微妙な相互作用に潜んでおり、深く推論することで、表面的なレビューでは見落とす問題を捉えられます。Claude Code では、ultrathink を使って明示的に拡張思考を有効にしてください。

オーケストレーションモード: Audit モードで説明されている、脆弱性ドメイン別の 5 つのサブエージェントを並行起動し、コードベース全体のセキュリティ監査を「並行調査してから統合する」ワークフローとして実施してください。並列化することで、1 回のパスでより広い攻撃対象領域を調査できます。統合ステップでは、検出事項の重複を排除し、深刻度に基づいて順位付けします。Claude Code では、ultracode を使って明示的にマルチエージェントオーケストレーションを有効にしてください。

モード:

  • レビュー・モード — PR のセキュリティ上の問題をレビューします。変更されたファイルから始め、呼び出し元と隣接するコードへのデータフローを追跡してください。脆弱性は差分の外にあっても、変更によって引き起こされることがあります。順番に調査します。
  • 監査モード — コードベース全体のセキュリティスキャンを行います。独立した脆弱性ドメインをそれぞれ担当するサブエージェントを最大 5 つ並行して起動します:(1)インジェクションのパターン、(2)暗号化とシークレット、(3)Web セキュリティとヘッダー、(4)認証と認可、(5)並行処理の安全性と依存関係の脆弱性。検出事項を集約し、DREAD でスコアを付け、深刻度順に報告してください。大規模な監査では、互いに独立した検出事項が多数見つかります。各修正・改善はそれぞれ分離されたワークツリーで行ってください。つまり、1 つの修正につき 1 つのワークツリーを使い、焦点が明確でレビューしやすく、個別に取り消せる PR にします。懸念事項が混在した大規模な変更にまとめないでください。
  • コーディング・モード — 新しいコードを書く場合や、報告された脆弱性を修正する場合に使います。スキルの手順に沿って順番に進めてください。必要に応じて、バックグラウンドエージェントに新しく書いたコード内の一般的な脆弱性パターンを grep で検索させ、その間、メインエージェントは機能の実装を続けられます。

依存関係:

  • govulncheck:go install golang.org/x/vuln/cmd/govulncheck@latest

Go セキュリティ

概要

Go におけるセキュリティは、多層防御の原則に従います。複数の層で保護し、すべての入力を検証し、安全なデフォルト設定を使い、セキュリティを考慮して設計された標準ライブラリを活用します。Go の型システムと並行処理モデルには一定の保護機能が備わっていますが、引き続き注意が必要です。

セキュリティ思考モデル

コードを書く前やレビューする前に、次の 3 つの質問をしてください。

  1. 信頼境界はどこにありますか? — 信頼できないデータはどこからシステムに入りますか?(HTTP リクエスト、ファイルアップロード、環境変数、他のサービスが書き込んだデータベースの行)
  2. 攻撃者が制御できるものは何ですか? — どの入力が機密性の高い処理に渡されますか?(SQL クエリ、シェルコマンド、HTML 出力、ファイルパス、暗号処理)
  3. 被害範囲はどの程度ですか? — この防御に失敗した場合、最悪の結果は何ですか?(データ漏えい、RCE、権限昇格、サービス拒否)

深刻度レベル

レベルDREAD意味
Critical8-10RCE、データの全面的な漏えい、認証情報の窃取 — 直ちに修正
High6-7.9認証のバイパス、重大なデータ露出、暗号の破綻 — 現在のスプリントで修正
Medium4-5.9限定的な露出、セッションの問題、防御の弱体化 — 次のスプリントで修正
Low1-3.9軽微な情報漏えい、ベストプラクティスからの逸脱 — 機会を見て修正

レベルはDREAD スコアリングに準拠しています。

報告前の調査

セキュリティ上の問題を報告する前に、コードベース全体のデータフローを追跡してください。コードの一部分だけを見て評価してはいけません。

  1. データの出所を追跡する — 変数をたどり、システムに入る箇所を確認します。ユーザー入力なのか、ハードコードされた定数なのか、内部限定の値なのかを確認してください。
  2. 上流での検証を確認する — 呼び出しチェーンの前段に、入力検証、サニタイズ、型の解析、許可リストによる制限がないかを調べます。
  3. 信頼境界を調べる — データが信頼境界を越えない場合(たとえば、mTLS を使用した内部サービス間通信)は、リスクの性質が異なります。
  4. 差分だけでなく周辺コードも読む — ミドルウェア、インターセプター、ラッパー関数が、すでに防御層を提供している場合があります。

却下ではなく、重大度を調整する: 上流の保護があっても、指摘がなくなるわけではありません。多層防御の考え方では、各層がそれぞれ保護する必要があります。ただし、重大度は変わります。厳格な入力パーサーを通過した場合にしか到達できない SQL 連結は、重大ではなく中程度です。必ず重大度を調整したうえで指摘を報告し、存在する上流の防御と、それらが削除または回避された場合に何が起こるかを記載してください。

指摘の重大度を下げる、または報告を見送る場合: 簡潔なインラインコメント(例:// security: SQL concat safe here — input is validated by parseUserID() which returns int)を追加し、判断の根拠を記録して、レビュー可能にするとともに、今後の監査で再度指摘されないようにしてください。

脅威モデリング(STRIDE)

システム内のすべての信頼境界の越境とデータフローに STRIDE を適用してください。Spoofing(認証)、Tampering(完全性)、Repudiation(監査ログ)、Information Disclosure(暗号化)、Denial of Service(レート制限)、Elevation of Privilege(認可)です。各脅威を DREAD(損害、再現性、悪用可能性、影響を受けるユーザー、発見可能性)で評価して、修正の優先順位を決めてください。Critical(8-10)の脅威には直ちに対処する必要があります。

Go の例、DFD の信頼境界、DREAD による評価、OWASP Top 10 との対応を含む方法論の全容については、**脅威モデリングガイド**を参照してください。

クイックリファレンス

重大度脆弱性防御策標準ライブラリの解決策
CriticalSQL インジェクションパラメーター化クエリでデータとコードを分離するdatabase/sqlと?プレースホルダー
Criticalコマンドインジェクション引数を個別に渡し、シェル経由の連結は決して行わない引数を個別に指定したexec.Command
HighXSS自動エスケープにより、ユーザーデータを HTML/JS ではなくテキストとして出力するhtml/template、text/template
Highパストラバーサル信頼できないファイルアクセスを許可されたルート内に制限するGo 1.24以降:os.Rootを使用します。Go 1.24より前:filepath.IsLocal、filepath.Rel、区切り文字を考慮したチェックを使用します。filepath.Cleanとstrings.HasPrefixだけに頼ってはいけません。
Mediumタイミング攻撃定数時間比較により、バイト単位の漏えいを防ぐcrypto/subtle.ConstantTimeCompare
High暗号化に関する問題検証済みのアルゴリズムを使用し、独自の方式は決して実装しないcrypto/aes、crypto/rand
MediumHTTP セキュリティTLS とセキュリティヘッダーでダウングレード攻撃を防ぐnet/http、TLSConfig を設定する
Lowヘッダーの不足HSTS、CSP、X-Frame-Options でブラウザー攻撃を防ぐセキュリティヘッダーのミドルウェア
Mediumレート制限レート制限でブルートフォース攻撃とリソース枯渇を防ぐgolang.org/x/time/rate、サーバーのタイムアウト
High競合状態共有状態を保護し、データ破損を防ぐsync.Mutex、チャネル、共有状態の回避

詳細なカテゴリ

完全な例、コードスニペット、CWE マッピングについては、以下を参照してください。

コードレビューのチェックリスト

分野別(入力処理、データベース、暗号化、Web、認証、エラー、依存関係、並行処理)に整理された完全なセキュリティレビュー用チェックリストについては、主要な脆弱性カテゴリをすべて網羅したコードレビュー用の包括的なチェックリストである セキュリティレビューのチェックリスト を参照してください。

ツールと検証

静的解析とリンティング

セキュリティ関連のリンター:bodyclose、sqlclosecheck、nilerr、errcheck、govet、staticcheck。設定と使用方法については、samber/cc-skills-golang@golang-lint スキルを参照してください。

さらに詳細なセキュリティ固有の解析については、以下を参照してください。

# Go security checker (SAST)
go get -tool github.com/securego/gosec/v2/cmd/gosec@latest
go tool gosec ./...

# Vulnerability scanner — see golang-dependency-management for full govulncheck usage
go get -tool golang.org/x/vuln/cmd/govulncheck@latest
go tool govulncheck ./...

ツリー全体をスキャンせずに特定のモジュールやバージョンの既知の CVE を確認するには(例:pkg.go.dev で依存関係を審査する場合)、→ samber/cc-skills-golang@golang-pkg-go-dev スキルを参照してください。

セキュリティテスト
# Race detector
go test -race ./...

# Fuzz testing
go test -fuzz=Fuzz

よくある間違い

重大度間違い修正方法
高トークンに math/rand を使用する出力が予測可能なため、攻撃者はシーケンスを再現できます。crypto/rand を使用してください
重大SQL 文字列の連結攻撃者がクエリのロジックを変更できます。パラメーター化クエリを使い、データとコードを分離してください
重大exec.Command("bash -c")シェルがメタ文字(;、|、`)を解釈します。シェルによる解析を避けるため、引数は個別に渡してください
高サニタイズされていない入力を信頼する信頼境界で検証してください。内部コードは境界を信頼するため、そこで不正な入力を検出すれば、すべてを保護できます
重大シークレットのハードコードソースコード内のシークレットは、バージョン履歴、CI ログ、バックアップに残ります。環境変数またはシークレットマネージャーを使用してください
中シークレットを == で比較する== は最初に異なるバイトで比較を終了するため、タイミング情報が漏えいします。crypto/subtle.ConstantTimeCompare を使用してください
中詳細なエラーを返すスタックトレースや DB エラーは、攻撃者がシステムの構成を把握する手がかりになります。汎用的なメッセージを返し、詳細はサーバー側でログに記録してください
高-race の検出結果を無視するデータ競合はデータ破損を引き起こし、並行処理中に認可チェックを回避される原因にもなります。すべてのデータ競合を修正してください
高パスワードに MD5/SHA1 を使用するどちらも既知の衝突攻撃があり、総当たり攻撃を高速に実行できます。Argon2id または bcrypt(意図的に遅く、メモリ負荷が高い)を使用してください
高GCM を使わずに AES を使用するECB/CBC モードには認証機能がないため、暗号文を検知されずに改変される可能性があります。GCM は暗号化と認証の両方を提供します
中0.0.0.0 にバインドするすべてのネットワークインターフェースにサービスを公開します。攻撃対象領域を制限するには、特定のインターフェースにバインドしてください

セキュリティのアンチパターン

重大度アンチパターン問題点対策
高隠蔽によるセキュリティ隠された URL は、ファジング、ログ、ソースコードから発見されますすべてのエンドポイントで認証と認可を行います
高クライアントのヘッダーを信頼するX-Forwarded-For、X-Is-Admin は簡単に偽装できますサーバー側で ID を検証します
高クライアント側で認可するJavaScript によるチェックは、どの HTTP クライアントからも回避できますすべてのハンドラーでサーバー側の権限チェックを行います
高環境間でシークレットを共有するステージング環境への侵害が本番環境にも及びますシークレットマネージャーを使って環境ごとにシークレットを設定します
重大暗号化のエラーを無視する_, _ = encrypt(data) は、暗号化されないまま処理を続行します常にエラーをチェックし、フェイルクローズにします。決してフェイルオープンにしてはいけません
重大独自の暗号化方式を実装する独自の暗号化方式は、暗号学者による解析を受けていませんcrypto/aes GCM、golang.org/x/crypto/argon2 を使用します

Go のコード例を含む詳しいアンチパターンについては、セキュリティアーキテクチャ を参照してください。

相互参照

samber/cc-skills-golang@golang-database、samber/cc-skills-golang@golang-safety、samber/cc-skills-golang@golang-observability、samber/cc-skills-golang@golang-continuous-integration のスキルを参照してください。

  • → これらのガイドラインを使用した、CI での AI による自動コードレビューについては、samber/cc-skills-golang@golang-continuous-integration スキルを参照してください

追加リソース

コメント