やりたいこと
日々の開発業務の中で、自分のコードに脆弱性を埋め込まないか、というところはわりと気を使っていることが多いですが、使っているフレームワークやライブラリが古く、そちらに脆弱性が含まれていた...というのがしばしばあります。
自分が使っているライブラリが何で、どのバージョンを使用しているかは把握できますが、そのライブラリが使用しているライブラリ・バージョンが何かまではなかなか意識できていません。でもそれらのライブラリに脆弱性があるかもしれません。
SBOM関連のツールを使用して、脆弱性があるライブラリを使用してないかチェックしてみます
SBOMは、ソフトウエアがどのようなコンポーネントを使用しているか、その依存関係やライセンスとともに一覧化したものらしいです
やってみる
題材として、ちょっと古いバージョンのライブラリを使用するアプリを作成します。
(プログラムの内容は問題ではないので、WebAPIのプロジェクトを作成し実装はデフォルトのままにしました)
<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形式を使用します
SBOMを生成
下記のツールを使用します。slnファイルを食わせるとSBOMを出力してくれます
下記で実行します。公式のコンテナイメージが提供されているのでそれを使用しています
#カレントフォルダをコンテナに/workとしてマウントし、slnファイルを指定
#出力先はカレントフォルダ配下にoutフォルダを作成してそこに出力
docker run --rm -it -v %cd%:/work cyclonedx/cyclonedx-dotnet /work/WebApplication1.sln -o /work/out
実行するとoutフォルダが作成され、その中にSBOMのファイルが出力されます
ライブラリの脆弱性を検索
下記のツールを使用します。CycloneDXの形式のSBOMをインプットに、OSVなどの脆弱性のデータベースを検索してくれます。
下記のようにコンテナイメージを作成し、ローカルを汚さず実行できるようにします
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
下記で実行します
#コンテナイメージを作成
docker build -t localbomber .
#作成したイメージを使って実行 先ほど作成したSBOMファイルを指定してスキャン
docker run -v %cd%:/work --rm -it localbomber bomber scan /work/out/bom.xml
実行すると、下記のように見つかった脆弱性が一覧化されます。
重大度HIGHのものが2つありますね...
修正・再スキャン
新しいバージョンのライブラリを参照するよう修正して再挑戦します
<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の生成・スキャンを再実行すると脆弱性の指摘はなくなりました!
やってみた感想
- 日々新しい脆弱性が見つかるので、継続的なウォッチが必要。CIなどに組みこめるとよさそうと思った
- CycloneDXでは、SBOMを一元管理するシステムが提供されているようなので、組織的に管理するのもよさそう。大変そうだけど