【Golang】Go 公式の脆弱性チェッカー govulncheck 【Goのための脆弱性管理】

Go 言語（以下 golang）公式の脆弱性チェッカー「`govulncheck`」が [2022/09/06 に発表](https://go.dev/blog/vuln)されました。

「`govulncheck`」は、`go get` した golang のモジュールのうち、<strong>パッケージの脆弱性をローカルでチェックできる公式ツール</strong>です。

いままでも [Snyk](https://snyk.io/) などの [CI](https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) で似たようなチェックはできました。目的が若干違うものの、golang 公式のツールであり、golang に特化したグループが脆弱性情報をメンテしていること、なにより `golangci-lint run` と同じ感覚で、**ローカルで手軽にチェックできるのが良い**ですね。

まだ <font color=darkorange>`experimental` (`golang.org/x/` 下の[準標準パッケージ](https://pkg.go.dev/golang.org/x)）です</font>が、将来的に `go test` の `-cover` ` -fuzz` `-bench` と似た使い勝手で統合されることに期待です。

https://go.googlesource.com/vuln

以下は基本的な使い方で、リリース情報の翻訳は [TS; DR](#go-%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E7%AE%A1%E7%90%86) をご覧ください。

## TL; DR <sub><sup>（今北産業、基本的な使い方）</sup></sub>

1. インストールとアップグレード:
    ```shell-session:ツールのインストール&アップグレード（要Go1.18以降）
    $ go install golang.org/x/vuln/cmd/govulncheck@latest
    ```

    `go install` した golang アプリのアップデートには [gup](https://github.com/nao1215/gup) がオススメです。

1. 脆弱性のテスト実行:

    ```shell-session:ツールの実行
    $ govulncheck ./...
    govulncheck is an experimental tool. Share feedback at https://go.dev/s/govulncheck-feedback.
    
    Scanning for dependencies with known vulnerabilities...
    No vulnerabilities found.
    $ echo $?
    0

    $ govulncheck -json ./...
    {
    	"Vulns": null
    }
    ```

1. 使い方:

    ```shell-session
    $ govulncheck -h
    usage:
    	govulncheck [flags] package...
    	govulncheck [flags] binary
    
      -json
        	output JSON
      -tags list
        	comma-separated list of build tags
      -test
        	analyze test files. Only valid for source code.
      -v	print a full call stack for each vulnerability
    
    For details, see https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck.
    ```

注意点として、**すべての脆弱性を表示するのではなく、危険度によって表示結果が異なります**。

危険度の測定には、脆弱性のあるパッケージに、どれだけ自分のアプリが依存しているかなども加味されます。例えば、脆弱性の報告されているパッケージであっても、脆弱性に該当する関数を利用していない場合は報告しない、などです。

つまり「パスした == 脆弱性は発見されなかった」と言うよりは「パスした == <ruby>クリティカル<rt>致命的</rt></ruby>な脆弱性は発見されなかった」という意味合いが強い気がします。

とは言え、<ruby><code>go test</code><rt>ユニット・テスト</rt></ruby> や <ruby><code>golangci-lint</code><rt>静的解析や構文チェック</rt></ruby> などとセットで「最低限のチェック」として使える手軽さがあります。`govulncheck` 単体で完結させるよりは、CI の愉快な仲間たちに加えて使うのがいいと思いました。

- リリース情報: "[Vulnerability Management for Go](https://go.dev/blog/vuln)" | blog @ go.dev
- リポジトリ: https://github.com/golang/vuln @ GitHub
- GoDoc: https://pkg.go.dev/golang.org/x/vuln @ pkg.go.dev
- 報告された脆弱性の例: [GO-2022-1059](https://pkg.go.dev/vuln/GO-2022-1059)

---

:::note info
以下は [2022/09/06 に発表](https://go.dev/blog/vuln)された、"[Vulnerability Management for Go](https://go.dev/blog/vuln)" の日本語訳です。ライセンスは原文と同じ [CC BY 4.0](https://go.dev/copyright) です。
【文責】 原文: 2022/09/06, Julie Qiu （Go セキュリティチーム）／翻訳: 2023/01/22, [@KEINOS](https://qiita.com/KEINOS)
:::

## Go のための脆弱性管理

この度、Go 言語（以下 Go）の脆弱性管理のための新しいサポート・ツールをリリースしました。これは、Go 開発者が影響を受けるであろう「既知の脆弱性を知るための手助け」の最初のステップです。

この記事では、現在利用可能なものの概要と、このプロジェクトの次のステップについて説明します。

### 概要

Go のツールに、既知の脆弱性についてコードを解析するためのツールが加わりました。これらのツールは、Go セキュリティ・チームによって維持されている [Go の脆弱性データベース](https://vuln.go.dev)に依存しています。新しいツールは、**コードから実際に呼び出された関数の脆弱性だけを表示する**ことによって、出力結果のノイズを低減しています。

![](https://go.dev/blog/vuln/architecture.png)

### Go 脆弱性データベース

Go 脆弱性データベース (Go Vulnerability Database, https://vuln.go.dev) は、一般にインポート可能な Go モジュールの**パッケージにおける既知の脆弱性についての包括的な情報源**です。

脆弱性データは、既存のソース（[CVE](https://ja.wikipedia.org/wiki/%E8%84%86%E5%BC%B1%E6%80%A7%E6%83%85%E5%A0%B1%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9 "Common Vulnerabilities and Exposures") や [GHSA](https://github.com/advisories "GitHub Security Advisories") など）と、Go パッケージのメンテナから直接受けた報告から得たものです。この情報は、Go セキュリティ・チームによってレビューされ、データベースに追加されます。

Go パッケージのメンテナには、自身のパッケージで公表した[新たな脆弱性情報を提供](https://go.dev/s/vulndb-report-new)したり、[既存の脆弱性情報を更新](https://go.dev/s/vulndb-report-feedback)することを推奨しています。私たちの目標は、報告の過程で摩擦を少なくすることですので、このプロセスに改善点があればぜひ[提案を送ってください](https://golang.org/s/vuln-feedback)。

Go の脆弱性データベースは、[pkg.go.dev/vuln](https://pkg.go.dev/vuln) でブラウザからも利用可能です。データベースの詳細については、[go.dev/security/vuln/database](https://go.dev/security/vuln/database) を参照してください。

### govulncheck による脆弱性の検出

新しい `govulncheck` コマンドは、ソースコードを分析し、コード内のどの関数が脆弱な関数を過渡的に呼び出すかに基づいて、本当に影響を与える脆弱性のみを表示します。これにより、自身の Go プロジェクトに影響を与える可能性のある「既知の脆弱性」について、出力ノイズの少ない信頼できる情報を得られます。

`govulncheck` は、[go install](https://pkg.go.dev/cmd/go#hdr-Compile_and_install_packages_and_dependencies) で最新版をインストールすることができます。

```shell-session:ツールのインストール
$ go install golang.org/x/vuln/cmd/govulncheck@latest
```

次に、プロジェクトのディレクトリで `govulncheck` を実行します。

```shell-session:ツールの実行
$ govulncheck ./...
```

`govulncheck` は単体で実行できるツール（スタンドアロンのバイナリ）であるため、ユーザーからのフィードバックを収集している間にも、頻繁な更新やツールのアップデートを可能にします。将来的に `govulncheck` ツールはメインの Go ディストリビューションに統合される予定です。

### 統合

脆弱性については、開発やデプロイメントといったプロセスの、できるだけ早い段階で認識することが最善です。脆弱性チェックを独自のツールやプロセスに統合するには、[govulncheck -json](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck#hdr-Flags) が使用できます。

私たちは、この脆弱性検出を、既存の Go ツールやサービス（[Go パッケージの検索サイト](https://pkg.go.dev/)など）に統合しました。たとえば、[このページ](https://pkg.go.dev/golang.org/x/text?tab=versions)では `golang.org/x/text` の各バージョンにある既知の脆弱性を表示しています。また、VSCode の Go 拡張による脆弱性チェック機能も近々利用できるようになる予定です。

### 次のステップへ

この Go の新しい機能のサポートが脆弱性管理のお役に立てたり、改善にご協力いただけると幸いです。

Go の脆弱性管理のサポートは、現在活発に開発が行われている新機能です。また、いくつかのバグや[制限がある](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck#hdr-Limitations)ことをご承知おきください。

皆様には、次のような改善へのご協力をお願いいたします。

- 自身で管理している Go パッケージの、脆弱性に関する[新しい公開情報の報告](https://golang.org/s/vulndb-report-new)、または[既存の情報の更新](https://go.dev/s/vulndb-report-feedback)を行う。
- [アンケートに答えて](https://golang.org/s/govulncheck-feedback)、`govulncheck` の利用体験を共有する。
- 不具合報告や機能要望など、[意見を寄せる](https://golang.org/s/vuln-feedback)。

より良く、より安全な Go のエコシステムを構築するために、皆さんと協力できることを楽しみにしています。

（原文: "[Vulnerability Management for Go](https://go.dev/blog/vuln)" | blog @ go.dev）