Snyk SBOM API (Beta) 叩いてみた 

## はじめに
この記事は [**「Snykを使って開発者セキュリティにまつわる記事を投稿しよう！ by Snyk Advent Calendar 2022」**](https://qiita.com/advent-calendar/2022/snyk)の 21 日目の記事です。

https://qiita.com/advent-calendar/2022/snyk

あなただけの専属自動シェフ賞に応募します!!
(Snyk のカレンダー投稿で豪華プレゼントかもらえるかも!?過去に遡って投稿可能とのことです。)

本記事では一般公開が待ち遠しい、SBOM API の Beta Version (2022-12-15~beta) を検証してみたいと思います。

## SBOM とは
SBOM (**S**oftware **B**ill **O**f **M**aterials：ソフトウェア部品表) とはソフトウェアを構成するライブラリやモジュール、およびその依存関係といった情報をもつインベントリーです。SBOM によって構築または使用しているソフトウェアに関連するライセンスおよびセキュリティリスクを把握しやすくなります。

国家電気通信情報庁 (NTIA) の Web サイトでは以下のように定義されています。

> A "Software Bill of Materials" (SBOM) is a nested inventory for software, a list of ingredients that make up software components.

https://ntia.gov/page/software-bill-materials

[2021 年のサイバーセキュリティに関する米国大統領令](https://www.federalregister.gov/documents/2021/06/02/2021-11592/software-bill-of-materials-elements-and-considerations) や記憶に新しい Apache Log4j の脆弱性などに端を発して、ソフトウェアサプライチェーンにおけるセキュリティの重要性が改めて認識されることとなり、この SBOM が注目されています。

SBOM については以下の記事も参考になりました。

https://atmarkit.itmedia.co.jp/ait/articles/2207/26/news013.html

https://snyk.io/blog/building-sbom-open-source-supply-chain-security/

このような動向の中、各社の SCA (Software Composition Analysis) ツールにおいても SBOM を出力する機能が整備されつつあります。
## Snyk SBOM API
Snyk でも 2022/11/8 に開催された SnykLaunch にて SBOM API および CLI などの SBOM ツールが発表されました。Snyk Japan さんが日本語まとめ記事を公開してくれています。

https://qiita.com/SnykSec/items/416cfd35e2d9dfebb856

本記事執筆の 2022/12/21 時点で SBOM API は Beta ステータス、CLI での生成機能はまだ公開されていないようです。今回は Beta バージョンの SBOM API を直接叩いてみたいと思います。

:::note warn
繰り返しますが SBOM API は 2022/12/21 時点で Beta ステータスです。一般公開リリースまでに応答内容や動作がかわる可能性がありますのでご注意ください。
:::

### SBOM API (Beta) の制限
* 有償サブスクリプションを契約している必要があります
    * Free プラン で API を利用した場合は 403 Forbidden となります
* 出力できるフォーマットは CycloneDX のみをサポートしています
    * 代表的な SBOM のフォーマットとして [SPDX](https://spdx.dev/) や [CycloneDX](https://cyclonedx.org/) があります

## 叩いてみた
以下の Snyk REST API Documentation に従って cURL を実行してみます。API Version は `2022-12-15~beta` です。

https://apidocs.snyk.io/?version=2022-12-15%7Ebeta#get-/orgs/-org_id-/projects/-project_id-/sbom

今回は以下のように [nodejs-goof](https://github.com/snyk-labs/nodejs-goof) の SBOM を出力しました。`ORG_ID` に Organization ID を、`PROJECT_ID` には SBOM 出力対象のプロジェクト ID を入力してください。`SNYK_TOKEN` は SNYK アカウントの API Token です。

:::note info
nodejs-goof は snyk-labs で公開されているデモ用の脆弱な Node.js アプリケーションです。
:::

```shell
export ORG_ID="your-organization-id"
export PROJECT_ID="your-project-id"
export SNYK_TOKEN="your-api-token"
export VERSION="2022-12-15%7Ebeta"

curl -X GET "https://api.snyk.io/rest/orgs/${ORG_ID}/projects/${PROJECT_ID}/sbom?version=${VERSION}&format=cyclonedx%2Bjson" \
 -H "Accept: application/vnd.api+json" \
 -H "Authorization: Token ${SNYK_TOKEN}" \
 -H "Accept: application/vnd.cyclonedx+json" | jq . > nodejs-goof-sbom.json
```

エラーとならずに json ファイルが出力されていれば成功です。

cURL 以外では Snyk REST API Documentation 上で API リクエストを試す方法が簡単かと思います。

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671544354390/KqBJRDY6F.png)

## bomber で SBOM をスキャンする
bomber は SBOM に対応した脆弱性スキャナーです。

https://github.com/devops-kung-fu/bomber

複数の脆弱性情報プロバイダーに対応しており、Snyk もその 1 つで SnykLaunch でもサポートが発表されていたようです。せっかくなので bomber を使用して Snyk をプロバイダーとし、Snyk API で出力した SBOM をスキャンしてみます。

[リリースページ](https://github.com/devops-kung-fu/bomber/releases) から使用するプラットフォームの最新リリースをインストールします。

```shell
sudo yum install -y https://github.com/devops-kung-fu/bomber/releases/download/v0.4.0/bomber_0.4.0_linux_amd64.rpm
```


provider に `snyk` を指定し、scan を実行するだけです。bomber は環境変数 `SNYK_TOKEN` を認識します。
```shell
export SNYK_TOKEN="your-api-token"
bomber scan --provider snyk nodejs-goof-sbom.json
```

以下のように SBOM から脆弱性をスキャンすることができました！

```shell
$ bomber scan --provider snyk nodejs-goof-sbom.json

 ██▄ ▄▀▄ █▄ ▄█ ██▄ ██▀ █▀▄
 █▄█ ▀▄▀ █ ▀ █ █▄█ █▄▄ █▀▄

DKFM - DevOps Kung Fu Mafia
https://github.com/devops-kung-fu/bomber
Version: 0.4.0

■ Ecosystems detected: npm
■ Scanning 980 packages for vulnerabilities...
■ Vulnerability Provider: Snyk (https://security.snyk.io) 

■ Files Scanned
        nodejs-goof-sbom.json (sha256:c420d3936c5c00287a7ae1423e57203358a41360027f34e95d450d0ea1c1086d)
╭──────┬───────────────────────┬─────────┬──────────┬─────────────────────────────────────────┬────────╮
│ TYPE │ NAME                  │ VERSION │ SEVERITY │ VULNERABILITY                           │ EPSS % │
├──────┼───────────────────────┼─────────┼──────────┼─────────────────────────────────────────┼────────┤
│ npm  │ yargs-parser          │ 9.0.2   │ MODERATE │ SNYK-JS-YARGSPARSER-560381              │ N/A    │
│      │                       ├─────────┼──────────┼─────────────────────────────────────────┼────────┤
│      │                       │ 8.1.0   │ MODERATE │ SNYK-JS-YARGSPARSER-560381              │ N/A    │
│      ├───────────────────────┼─────────┼──────────┼─────────────────────────────────────────┼────────┤
│      │ y18n                  │ 4.0.0   │ HIGH     │ SNYK-JS-Y18N-1021887                    │ N/A    │
│      │                       ├─────────┼──────────┼─────────────────────────────────────────┼────────┤
│      │                       │ 3.2.1   │ HIGH     │ SNYK-JS-Y18N-1021887                    │ N/A    │
│      ├───────────────────────┼─────────┼──────────┼─────────────────────────────────────────┼────────┤
中略---------------------------------------------------------------------------------------------------

Total vulnerabilities found: 182

╭──────────┬───────╮
│ RATING   │ COUNT │
├──────────┼───────┤
│ CRITICAL │     4 │
├──────────┼───────┤
│ HIGH     │    86 │
├──────────┼───────┤
│ MODERATE │    79 │
├──────────┼───────┤
│ LOW      │    13 │
╰──────────┴───────╯

NOTES:

1. The list of vulnerabilities displayed may differ from provider to provider. This list
   may not contain all possible vulnerabilities. Please try the other providers that bomber
   supports (osv, ossindex, snyk)
2. EPSS Percentage indicates the % chance that the vulnerability will be exploited. This
   value will assist in prioritizing remediation. For more information on EPSS, refer to
   https://www.first.org/epss/
```

近いうちに Snyk CLI でも簡単に SBOM が出力できるようになるのではないかと思います。
CI/CD プロセスの中で SBOM を生成できるようになったりと活用の幅が広がりそうですね。

以上です。
参考になれば幸いです。