PS/SLの佐々木です。
今回はSBOMツールのScanCode.ioの調査記事になります。
SBOMとはなんぞやという方はまずはこちらから読んでみてください。
ScanCode.ioとは
ScanCode.ioとはソフトウエア構成解析を自動化し、アプリケーションのOSSコンポーネントとそのライセンスを解析します。
ScanCode.ioを使用するメリットは以下の二つです。
- サードパーティーのライブラリを使用する前にライセンスを知る必要がある
- 古かったり脆弱性があるコンポーネントの使用を避ける
ScanCode.ioで解析をするためには4つの方法が紹介されています。
- ユーザーインタフェース
- ScanCode.ioのUIは、ソフトウェア構成物のスキャンや結果の表示、設定の変更などの操作をユーザーが行うためのグラフィカルなインターフェースを提供します。
- REST API
- 外部アプリケーションやサービスがScanCode.ioの機能を利用できるようにするためのプログラムインターフェースです。これにより、外部のツールやシステムがScanCode.ioを自動化したり統合したりすることが可能になります。
- コマンドラインインタフェース
- ターミナルやシェルでScanCode.ioのコマンドを実行して、ソフトウェア構成物のスキャンや結果の表示、設定の変更などを行うことができます。
- データモデル
- ソフトウェア構成物やそのコンポーネント、ライセンス情報などのデータの構造と関係を定義します。これにより、ScanCode.ioがソフトウェアの構成情報を収集し、効果的に管理できるようになります。
実際に使用してみる
ユーザーインタフェース
git clone https://github.com/nexB/scancode.io.git && cd scancode.io
make envfile
docker compose build
docker compose up -d
localhostにアクセスするとブラウザで開くことができる
Docker imageを解析してみる
今回解析するDocker Imageはalpine/httpieです。
下記画像のように入力を行いCreateボタンを押下するとソースコードの解析結果が得られます。
解析できるパイプラインの項目には以下のようなものがあります。
関数 | 説明 |
---|---|
analyze_docker_image | Dockerイメージを解析します。 |
analyze_root_filesystem_or_vm_image | LinuxのルートファイルシステムまたはVMイメージを解析します。 |
analyze_windows_docker_image | WindowsのDockerイメージを解析します。 |
inspect_packages | アプリケーションパッケージのアーカイブ/コードベースを検査し、オプションで事前解決された依存関係が含まれています。パッケージのマニフェストと依存関係に存在するパッケージを検査します。 |
load_inventory | ScanCode-toolkitのスキャン結果やScanCode.ioのスキャン結果を処理します。 |
load_sbom | SPDX/CycloneDX SBOMまたはABOUTファイルをプロジェクトにインポートします。 |
map_deploy_to_develop | 開発とデプロイメントの両方のコードベースが関係する場合に使用します。 |
resolve_dependencies | コードベースにロックファイルや他のパッケージマニフェストがある場合、パッケージ要件からパッケージを解決します。 |
scan_codebase | コードをアーカイブとして圧縮し、各ファイルにリンクされているすべての既存パッケージを検出します。オプションで事前解決された依存関係も含めることができます。 |
scan_single_package | 単一のパッケージアーカイブがある場合に使用し、そのライセンス、著作権、パッケージのメタデータに関する情報を取得します。 |
以下は解析した結果になります。
様々な解析結果を眺めることができます。
タイプとライセンスでのフィルタリングの結果を円グラフの形式で表示します。
プログラミング言語、MIME タイプ、所有者、著作権、 ライセンス キー、およびライセンス カテゴリによってコード リソースをフィルタリングする円グラフのグループが提供されます。
解析された項目をクリックすると下記のような解析項目に入っているパッケージの一覧が表示されます。
脆弱性の解析
今回の解析結果に脆弱性が含まれているかどうか確認したい場合があると思います。
ScanCode.ioではVulnerableCodeと統合して脆弱性がないか判断することができます。
ローカルに組み込むには
.env
ファイルに以下を追加してください。
VULNERABLECODE_URL=https://public.vulnerablecode.io/
追加後はサービスを再起動します。
docker compose restart web worker
再起動後Webに戻りプロジェクトページのAdd pipelineボタンを押下します。
モーダルが表示されたらfind_vulnerabilities
を選択しAdd pipelineを押下します。
パイプラインの実行が終わり脆弱性が見つかるとPackageのところに赤い虫マークのようなものがあり、これがあると脆弱性が見つかったことになります。
虫マークをクリックすると脆弱性の詳細を見ることができます。
https://public.vulnerablecode.io/vulnerabilities/VCID-wavq-xut5-aaak
上記URLのような脆弱性が確認されていることがわかります。
今回はWebUIでの解析方法を紹介しましたが、コマンドラインやREST APIでも同様のことができます。
またスキャンを自動化し、定期的に実行したりソースコードのコミットやリリースに応じて実行するようにスケジュールすることができます。(この記事ではやりませんが興味のある方は以下のドキュメントを確認してみてください。)
https://scancodeio.readthedocs.io/en/latest/automation.html
Dependency-TrackでSBOMを読み込んでみる
最後に以前紹介したDependency-Trackを使用してSBOMを読み込んでみたいと思います。
Dependency-Trackについて知りたい方はこちらを参照してみてください。
ScanCode.ioからCyclone DXのSBOMをExportしてDependency-Trackにimportしてみました。(Download results as:のCycloneDXという項目押下するとダウンロードされます。)
問題なく取り込まれたことが確認できました。
結果を確認するとrisk scoreが高いものが3件あることがわかりますね。
確認してみます。
一つ目のものはScanCode.ioのほうでも脆弱性リスクがあると警告が出ていたものと同様です。
Dependency-Trackは様々な脆弱性報告サイトと連携することができるので幅広い情報ソースから脆弱性を検出することができます。
他二つはScanCode.ioでは検出されていなかったものになります。
pip関連の脆弱性のようです。
終わりに
今回はScanCode.ioのWebUIに関する調査検証を行っていきました。
ScanCode.ioは様々な形式のソースコードを解析することができるのが非常に強みで、CI/CDに組み込んで解析を自動化したりすることも可能そう(ちょっとここはドキュメント読んだだけなので確証はないですが。。。)でした。
一方で脆弱性検出のソースが一つしか紹介されていなかったり、少々解析結果の詳細が見にくかったり、通知機能がなかったりしました。
その点は以前紹介したDependency-Trackが優れているので併用して使うことで非常に解析の体験が向上するのではないかと思いました。