えっ　私のアプリ、脆弱すぎ...? SBOMを使ってライブラリの脆弱性を見つける

### やりたいこと

日々の開発業務の中で、自分のコードに脆弱性を埋め込まないか、というところはわりと気を使っていることが多いですが、使っているフレームワークやライブラリが古く、そちらに脆弱性が含まれていた...というのがしばしばあります。

自分が使っているライブラリが何で、どのバージョンを使用しているかは把握できますが、そのライブラリが使用しているライブラリ・バージョンが何かまではなかなか意識できていません。でもそれらのライブラリに脆弱性があるかもしれません。

SBOM関連のツールを使用して、脆弱性があるライブラリを使用してないかチェックしてみます

SBOMは、ソフトウエアがどのようなコンポーネントを使用しているか、その依存関係やライセンスとともに一覧化したものらしいです

https://www.nri-secure.co.jp/glossary/sbom

### やってみる

題材として、ちょっと古いバージョンのライブラリを使用するアプリを作成します。
(プログラムの内容は問題ではないので、WebAPIのプロジェクトを作成し実装はデフォルトのままにしました)

```xml:WebApplication1.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>47bdee1b-a936-400a-a583-b43929721ed4</UserSecretsId>
  </PropertyGroup>

  <!-- 古いライブラリを参照 -->
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.SignalR" Version="1.4.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  </ItemGroup>

</Project>
```

このアプリのからSBOMを生成し、リストに記載されたコンポーネントから脆弱性のあるものを取得してみます
フリーなツールが充実している[CycloneDX](https://cyclonedx.org/)形式を使用します

#### SBOMを生成

下記のツールを使用します。slnファイルを食わせるとSBOMを出力してくれます

https://github.com/CycloneDX/cyclonedx-dotnet

下記で実行します。公式のコンテナイメージが提供されているのでそれを使用しています

```bash

#カレントフォルダをコンテナに/workとしてマウントし、slnファイルを指定
#出力先はカレントフォルダ配下にoutフォルダを作成してそこに出力
docker run --rm -it -v %cd%:/work cyclonedx/cyclonedx-dotnet /work/WebApplication1.sln -o /work/out 
```

実行するとoutフォルダが作成され、その中にSBOMのファイルが出力されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77403/d9aa8ac9-9975-d6fa-e3e4-cec44c6c4492.png)


#### ライブラリの脆弱性を検索

下記のツールを使用します。CycloneDXの形式のSBOMをインプットに、[OSV](https://osv.dev/)などの脆弱性のデータベースを検索してくれます。

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

下記のようにコンテナイメージを作成し、ローカルを汚さず実行できるようにします

```Dockerfile:Dockerfile
FROM debian

#githubからパッケージをダウンロードしてインストール(あまり行儀良くない..)
RUN apt update && apt install -y curl && curl -L https://github.com/devops-kung-fu/bomber/releases/download/v0.4.8/bomber_0.4.8_linux_amd64.deb > package.deb && apt install ./package.deb && rm package.deb && apt remove -y curl && apt -y autoremove
```

下記で実行します

```bash
#コンテナイメージを作成
docker build -t localbomber .

#作成したイメージを使って実行　先ほど作成したSBOMファイルを指定してスキャン
docker run -v %cd%:/work --rm -it localbomber bomber scan /work/out/bom.xml
```

実行すると、下記のように見つかった脆弱性が一覧化されます。
重大度HIGHのものが2つありますね...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77403/da43ac4c-52c6-6181-6c9b-8122fb9a9534.png)

#### 修正・再スキャン

新しいバージョンのライブラリを参照するよう修正して再挑戦します

```xml:Webapplication1.csproj(変更後)
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>47bdee1b-a936-400a-a583-b43929721ed4</UserSecretsId>
  </PropertyGroup>

  <!-- 新しいバージョンに変更 -->
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.SignalR" Version="1.27.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.7.3" />
  </ItemGroup>

</Project>
```

SBOMの生成・スキャンを再実行すると脆弱性の指摘はなくなりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77403/f22d2fac-b897-e068-4c2a-65f21144b30e.png)

### やってみた感想

- 日々新しい脆弱性が見つかるので、継続的なウォッチが必要。CIなどに組みこめるとよさそうと思った
- CycloneDXでは、[SBOMを一元管理するシステム](https://dependencytrack.org/)が提供されているようなので、組織的に管理するのもよさそう。大変そうだけど