Google がリリースした OSS 向け脆弱性スキャナ OSV-Scanner をさっそく試してみた

**本記事は [NECソリューションイノベータ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nec_solution_innovators) の 12/21 の記事です。**



# はじめに

2022年12月13日に Google が OSS 向けの脆弱性スキャナ OSV-Scanner をリリースしました。

[【Google Security Blog】Announcing OSV-Scanner: Vulnerability Scanner for Open Source](https://security.googleblog.com/2022/12/announcing-osv-scanner-vulnerability.html)



# インストール

## インストール先

M1 チップ搭載の MacBook Pro になります。

- [MacBook Pro（31-inch, M1, 2020）](https://support.apple.com/kb/SP824?locale=ja_JP)



## インストール手順

私が利用している MacBook でのインストール手順になります。

1. Go のインストール

   ~~~text
   $ brew install go
   ~~~

2. GOPATH 環境変数の設定

   デフォルトの GOPATH 環境変数は `~/go` となります。

   変更する場合は `.zshrc` に以下の設定を行います。

   ```
   export GOPATH=<path to GOHOME directory>
   export PATH=$PATH:$GOPATH/bin
   ```

3. OSV-Scanner のインストール

   ```
   $ go install github.com/google/osv-scanner/cmd/osv-scanner@v1
   ```



# OSV-Scanner を動かしてみる

## コマンドライン仕様

コマンドライン仕様を軽く見てみましょう。

~~~
$ ~/go/bin/osv-scanner --help

NAME:
   osv-scanner - scans various mediums for dependencies and matches it against the OSV database

USAGE:
   osv-scanner [global options] command [command options] [directory1 directory2...]

VERSION:
   dev

COMMANDS:
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --docker value, -D value [ --docker value, -D value ]      scan docker image with this name
   --lockfile value, -L value [ --lockfile value, -L value ]  scan package lockfile on this path
   --sbom value, -S value [ --sbom value, -S value ]          scan sbom file on this path
   --config value                                             set/override config file
   --json                                                     sets output to json (WIP) (default: false)
   --skip-git                                                 skip scanning git repositories (default: false)
   --recursive, -r                                            check subdirectories (default: false)
   --help, -h                                                 show help (default: false)
   --version, -v                                              print the version (default: false)
~~~

- 診断対象の指定方法

  - `--docker <イメージ名>:<タグ> `：Docker イメージをスキャン対象に指定できるようです

  - `--lockfile <ロックファイル名>`：npm や yarn などのパッケージマネージャのロックファイルをスキャン対象に指定できるようです

  - `--sbom <SBOMファイル名>`： SBOM は使ったことないのでよく知らない（；^ω^）
  - `--recursive`：このオプションと合わせて、コマンドラインの最後にディレクトリを指定すれば、指定ディレクトリ配下に格納されている診断対象ファイルを再帰的に検索して、その全てに対して診断してくれるようです

- 診断の設定

  - `--config <設定ファイル名>`：診断結果から除外する脆弱性IDや、そのIDを除外する期間、除外理由などを設定ファイルで指定できるようです。

- 出力形式
  - `--json`：デフォルトは表形式ですが、JSON で出力可能なようです。これは、将来的に SonarQube などで可視化などできるようになるのかな？



## OSV-Scanner による診断結果

```
$ ~/go/bin/osv-scanner ./
```

脆弱性の指摘をしっかり出したかったので、1年くらい前に作って放置していたサンプルプロジェクトで診断してみました。

コマンドを実行すると、すこし時間がかかりましたが、添付イメージのように表形式でレポートが表示されました。

OSV URL のリンク先（[参考](https://osv.dev/vulnerability/GHSA-hrpp-h998-j3pp)）を開くと、その脆弱性についての詳細が確認できます。

![osv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104325/609430a4-6cfa-f37b-d485-232273ebfe87.png)


- `--recursive` を指定した場合、一番左側の `SOURCE` に診断対象のロックファイル名が相対パスで出力されるので、どのプロジェクトの脆弱性なのかは、ここで区別できるようです。



## npm audit と比べて

現在、フロントエンドの依存関係の脆弱性チェックには `npm audit` を利用しているのですが、それと比べて思ったことを軽く。

以下に同じサンプルプロジェクトで npm audit を実行した結果を一部抜粋しています。

![audit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104325/fd4a1c53-65e9-2b40-43d1-28f5021abc83.png)



- npm audit だと、脆弱性を持つパッケージが `Path` に示すどの依存関係から間接依存しているか、パッと見でわかりますが、OSV-Scanner の方ではそれがわからないので少し不便に感じます。
- npm audit だと、devDependencies を除外する `--omit=dev` というオプションが指定できましたが、OSV-Scanner の方には同様のオプションがまだ無いようなので、開発ツールの脆弱性も含めたレポートが出力されてしまい、チェックが少し大変です。
  現時点では `--config` で指定する設定ファイルで、不要な脆弱性の指摘を除外してね。ってことになりそうですね。



# 最後に

npm audit と比べると、すこし使いにくい状況ではありますが、OSV-Scanner はまだまだリリースされたばかりで、リポジトリの Issues を見ると、これから色々な強化予定されているようです。今後に期待したいですね。



以上。