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 以降で有効なのでご注意を。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)