Go 依存パッケージの脆弱性検査
どの言語でも同じだけど,インポートする外部パッケージが安全かどうかを調べるのはけっこう大変である。 で, Go 言語の場合は nancy を使うのがよさげである。
nancy は “Sonatype OSS Index” の情報を使って依存パッケージ/モジュールの検査をしてくれる。 ツール自体は Apache-2.0 でライセンスされている。 提供されているデータについては
OSS Index and the associated tools are and always will be free to the community. The data we gather is derived from public sources, and does not include human curated intelligence nor expert remediation guidance.
とあるので,オープンな場で使うなら問題ないかな。
使い方は簡単で,開発中のパッケージのリポジトリ上で
$ go list -json -m all | nancy sleuth
とすればよい。 問題なければ
$ go list -json -m all | nancy sleuth -n
┏━━━━━━━━━━━━━━━┓
┃ Summary ┃
┣━━━━━━━━━━━━━┳━┫
┃ Audited Dependencies ┃ 9┃
┣━━━━━━━━━━━━━╋━┫
┃ Vulnerable Dependencies ┃ 0┃
┗━━━━━━━━━━━━━┻━┛
みたいな感じで結果を返してくれる。 問題のあるパッケージ/モジュールを含んでると,ものすごい勢いで叱られるけど(笑)
GitHub Actions でも使える
nancy には GitHub Actions も用意されている。 ありがたや。
設定は簡単。
リポジトリの .github/workflows/
ディレクトリに YAML ファイル(例えば vulns.yml
)を置き,以下のように記述する。
name: vulns
on:
push:
tags:
- v*
branches:
- master
pull_request:
jobs:
vulns:
name: Vulnerability scanner
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
go-version: ^1.13
- name: WriteGoList
run: go list -json -m all > go.list
- name: Nancy
uses: sonatype-nexus-community/nancy-github-action@main
これで pull request 時, master
ブランチ1 への push 時,およびバージョンタグを打った際に脆弱性検査が走る。
依存の依存パッケージに脆弱性がある
直接インポートするパッケージに脆弱性があるなら無害なバージョンに差し替えればいいけど,依存パッケージが依存しているパッケージに脆弱性がある場合はどうするか。
とりあえず,そのパッケージ宛てには issue を投げておくとして,それまでの継ぎとしては go.mod
ファイルの replace
ディレクティブを使って凌ぐことができそうだ。
たとえば,依存パッケージが github.com/coreos/etcd v3.3.13 に依存してるんだけど v3.3.13 に脆弱性がある場合,
replace (
github.com/coreos/etcd v3.3.13+incompatible => github.com/coreos/etcd v3.3.25+incompatible
)
などとして無害なバージョンに差し替えできる。
require
ディレクティブで
require (
github.com/coreos/etcd v3.3.25+incompatible
)
とか書いても同じ効果があるけど,名目だけの依存関係で実際にはインポートしないパッケージは go mod tidy
コマンドで記述が削除されちゃうのでオススメできない。
go list -m all
って,実際にはリンクしない名目上の依存関係も全部拾ってリストアップしちゃうので,凄い面倒くさいんだよねぇ。
実際にリンクするパッケージだけリストアップしてくれないものだろうか…
【2021-02-25 追記】 depm との連携
拙作の Go 言語用モジュール依存関係可視化ツール depm を使って
$ depm list --json | nancy sleuth -n
とすることで名目だけの依存パッケージの誤検知を回避できる。 ただ,私としては depm の信頼性にイマイチ確信が持てないので,ご利用は自己責任で(笑)
GitHub Actions を使うのであれば
name: vulns
on:
push:
tags:
- v*
branches:
- master
pull_request:
jobs:
vulns:
name: Vulnerability scanner
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
go-version: ^1.16
- name: install depm
run: go install github.com/spiegel-im-spiegel/depm@latest
- name: WriteGoList
run: depm list --json > go.list
- name: Nancy
uses: sonatype-nexus-community/nancy-github-action@main
などとすればOK。 Go 1.16 以降で有効なのでご注意を。
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。と思ったら絶版状態らしい(2025-01 現在)。復刊を望む!
-
2020年10月から GitHub の新規リポジトリの既定ブランチ名が
main
になるらしい。ご注意を。 ↩︎