あなたのGoで書かれたプロジェクトはgo.devが提唱するセキュリティベストプラクティスに従っていますか?
実は、GoのチームはGo開発者のためのセキュリティベストプラクティスを公開しています。
これ↓
一次情報を読むことをお勧めしますが、英語が苦手な人や、サクッと概要だけ見たい忙しい人も多いと思います。
そんなあなたのために、心優しい私が要約しましたので活用してください。
ソースやバイナリに脆弱性スキャンをする
-
govulncheckを使って脆弱性を検知する
- チュートリアル
- Govulncheck は CI/CD フローに組み込むこともできる
- GoチームはGitHubマーケットプレイスにgovulncheckのためのGitHub Actionを提供している
- 他の CI/CD システムと統合できるように
-json
フラグを提供している - Go extension for Visual Studio Codeを使うことでエディタから直接脆弱性スキャンができる
Goのバージョンと依存関係を最新に保つ
- Goのバージョンは最新に保つ
- 新しいバージョンにすることで、新機能、セキュリティパッチ、そしてパフォーマンスの向上などの恩恵を得ることができる
- 依存関係の新しいバージョンとの互換性も保証され、潜在的な統合に関する問題を回避できる
- Release Historyを確認してバージョン間でどのような変更があったかを評価するのが良い
- マイナーバージョンの更新もした方が良い
- サードパーティーパッケージも最新状態に更新する
- ただし、更新する前には精査とテストを
- 新たなバグ、悪意のあるコード、非互換な変更などのリスクがある
- ただし、更新する前には精査とテストを
ファジングテストでエッジケースの脆弱性を発見する
-
Fuzzingを使う
- ファジングテストはプログラマが見逃したり、そもそもテストが難しいようなエッジケースのテストをしてくれるため、脆弱性の検知の役にたつ
race detectorを使って競合状態をチェックする
- 競合状態(race condition)は2つ以上のgoroutineが同時に同じリソースにアクセスして、そのリソースに対する書き込みがあった場合に起こる
- ビルトインのrace detectorを使うことで潜在的な競合状態を検知することができる
- (ただし、実行されないコード内の競合は検知できない)
- ビルドやテストを実行するときに
--race
フラグを加えることで race detector を使うことができる- e.g.
go test -race
- e.g.
- ビルトインのrace detectorを使うことで潜在的な競合状態を検知することができる
Vet を使用して怪しい構造を検査する
- Goの
vet
コマンドを使ってソースコードの静的解析をする- コンパイルは通るが、潜在的な問題を抱えているコードを検知することができる
- e.g. 到達しないコード、未使用の変数、goroutine関連のよくある間違い
-
go vet ./...
で実行できる
- コンパイルは通るが、潜在的な問題を抱えているコードを検知することができる
golang-announce を購読してセキュリティリリースの通知を受け取る
- セキュリティ修正などは golang-announce@googlegroups.com のメーリングリストに事前に通知される