チュートリアル: VS Code Goで脆弱な依存関係を見つけて修正する
Visual Studio Code 用 Go 拡張機能を使用すると、エディターから直接コードの脆弱性をスキャンできます。
注: 以下の画像に含まれる脆弱性修正の説明については、govulncheck チュートリアルを参照してください。
前提条件
- Go. このチュートリアルに従うには、最新バージョンの Go を使用することをお勧めします。インストール手順については、Go のインストールを参照してください。
- VS Code は最新バージョンに更新されています。こちらからダウンロードしてください。Vim も使用できます (詳細はこちらを参照してください) が、このチュートリアルでは VS Code Go に焦点を当てます。
- VS Code Go 拡張機能は、こちらからダウンロードできます。
- エディター固有の設定変更。 以下の結果を再現するには、これらの仕様に従って IDE の設定を変更する必要があります。
VS Code Go を使用して脆弱性をスキャンする方法
ステップ 1. 「Go: Toggle Vulncheck」を実行する
Toggle Vulncheck コマンドは、モジュールにリストされているすべての依存関係の脆弱性分析を表示します。このコマンドを使用するには、IDE のコマンドパレット (Linux/Windows では Ctrl+Shift+P、Mac OS では Cmd+Shift+P) を開き、「Go: Toggle Vulncheck」を実行します。go.mod ファイルには、コードで直接的および間接的に使用されている脆弱な依存関係の診断が表示されます。
注: このチュートリアルを自分のエディターで再現するには、以下のコードを main.go ファイルにコピーしてください。
// This program takes language tags as command-line
// arguments and parses them.
package main
import (
"fmt"
"os"
"golang.org/x/text/language"
)
func main() {
for _, arg := range os.Args[1:] {
tag, err := language.Parse(arg)
if err != nil {
fmt.Printf("%s: error: %v\n", arg, err)
} else if tag == language.Und {
fmt.Printf("%s: undefined\n", arg)
} else {
fmt.Printf("%s: tag %s\n", arg, tag)
}
}
}
次に、プログラムに対応する go.mod ファイルが次のようになっていることを確認してください。
module module1
go 1.18
require golang.org/x/text v0.3.5
これで、`go mod tidy` を実行して go.sum ファイルが更新されていることを確認します。
ステップ 2. コードアクションを介して govulncheck を実行する。
コードアクションを使用して govulncheck を実行すると、コード内で実際に呼び出されている依存関係に焦点を当てることができます。VS Code のコードアクションは電球アイコンでマークされています。関連する依存関係にカーソルを合わせると脆弱性に関する情報が表示され、「クイック修正」を選択するとオプションのメニューが表示されます。これらのオプションの中から「検証のために govulncheck を実行」を選択します。これにより、関連する govulncheck 出力がターミナルに返されます。
ステップ 3. go.mod ファイルにリストされている依存関係にカーソルを合わせる。
特定の依存関係に関する関連する govulncheck 出力は、go.mod ファイル内の依存関係にカーソルを合わせることでも見つけることができます。依存関係情報を素早く確認するには、このオプションはコードアクションを使用するよりもさらに効率的です。
ステップ 4. 依存関係の「修正済み」バージョンにアップグレードする。
コードアクションを使用して、脆弱性が修正された依存関係のバージョンに素早くアップグレードすることもできます。コードアクションのドロップダウンメニューで「アップグレード」オプションを選択することでこれを行います。
追加リソース
- IDE での脆弱性スキャンに関する詳細については、このページを参照してください。特に「注意と警告」セクションでは、脆弱性スキャンが上記の例よりも複雑になる可能性のある特殊なケースについて説明しています。
- Go 脆弱性データベースには、Go パッケージのメンテナが Go セキュリティチームに直接報告したものに加えて、多くの既存の情報源からの情報が含まれています。
- Go 脆弱性管理ページでは、Go の脆弱性の検出、報告、管理のためのアーキテクチャの概要を提供しています。