SPDXの取っ掛かりのための記事

こんばんは。

SPDXと言うものに触れる機会があったのですが、聞いた時点では食べ物かどうかも分からなかったので調べて軽くまとめました。

# SPDXとは
https://spdx.dev/

The Software Package Data Exchangeの略語で、直訳すると __ソフトウェア パッケージ データ交換__ です。
~~ハァ？~~

公式ページなどを読んでみたところ、 __ライセンスや依存関係について明確に識別するためのフォーマットの一つ__ と言うことが分かりました。 ~~いかがでしたか？~~

先日、log4jの脆弱性が発見された際のクソデカ影響範囲はご存じかと思いますが「そもそもウチのプロジェクトは使ってるのか？」と言う調査を行った方もいらっしゃるかもしれません。

で、面倒な手間をかけていると対策にも時間がかかってしゃーないからいい感じに管理しようぜ、
という __プロジェクト及びそのフォーマット__ を指してSPDXと呼ぶそうです。

# 公式が提供しているツール類を調べてみよう
何はともあれ [公式GitHub](https://github.com/spdx/) 。
全部で54リポジトリ（除く13Public Archive）ありました。
Starsが多く、今回自分が使う言語であるJavaに関係ありそうなプロジェクトであるtools-javaが見つかったので詳しく見てみます。

# 中身を見てみよう（tools-java）
[GitHub](https://github.com/spdx/tools-java)
[Maven Repository](https://mvnrepository.com/artifact/org.spdx/tools-java)
[Maven Central](https://central.sonatype.com/artifact/org.spdx/tools-java)
※投稿日現在の最新バージョンは __v1.1.6__

GitHubの説明によると __Spdx-Java-Library を使用した SPDX コマンド ライン ツール__ とのことでした。
まずは[Maven Central > 1.1.6 > Dependencies](https://central.sonatype.com/artifact/org.spdx/tools-java/1.1.6/dependencies)で依存関係を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/c0b6d969-6a3f-9444-093a-a67f66f1f4da.png)

色々入っていますが、SPDX公式の依存関係だけ抜き出すとこれらを使っているみたいです（GitHubに見つからなかったものはMaven Repositoryのリンク）
* [java-spdx-library](https://github.com/spdx/Spdx-Java-Library)
* [spdx-rdf-store](https://github.com/spdx/spdx-java-rdf-store)
* [spdx-jackson-store](https://github.com/spdx/spdx-java-jackson-store)
* [xmlschema-core](https://mvnrepository.com/artifact/org.apache.ws.xmlschema/xmlschema-core)
* [spdx-spreadsheet-store](https://github.com/spdx/spdx-java-spreadsheet-store)
* [spdx-tagvalue-store](https://github.com/spdx/spdx-java-tagvalue-store)
* [json-schema-validator](https://github.com/java-json-tools/json-schema-validator)

# tools-javaを使ってみよう
さて、依存関係を確認して満足したので次は実際に動かしてみましょう。
とりあえず[GitHub](https://github.com/spdx/tools-java)から[spdx-examples](git@github.com:spdx/spdx-examples.git)と共にcloneします。
```console
$ git clone git@github.com:spdx/tools-java.git
$ git clone git@github.com:spdx/spdx-examples.git
```
tools-javaはMavenプロジェクトなので、Mavenをインストールして（インストール方法は省略）依存関係を解消します。
```console
$ mvn install
～～～～～～中略～～～～～～
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  59.855 s
[INFO] Finished at: 2023-04-21T00:01:16+09:00
[INFO] ------------------------------------------------------------------------
```
これでtarget/tools-java-1.1.6-jar-with-dependencies.jarが生成されましたので、実行してみましょう。
```console
$ C:\pleiades\workspace\tools-java\target>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 509C-4ED5 です

 C:\pleiades\workspace\tools-java\target のディレクトリ

2023/04/23  23:56    <DIR>          .
2023/04/23  23:56    <DIR>          ..
2023/04/23  14:55    <DIR>          apidocs
2023/04/23  14:54    <DIR>          classes
2023/04/23  14:55    <DIR>          javadoc-bundle-options
2023/04/23  14:55    <DIR>          maven-archiver
2023/04/23  14:54    <DIR>          maven-status
2023/04/23  14:55    <DIR>          site
2023/04/23  14:55    <DIR>          surefire-reports
2023/04/23  14:54    <DIR>          test-classes
2023/04/23  14:55        53,434,220 tools-java-1.1.6-jar-with-dependencies.jar
2023/04/23  14:55           416,143 tools-java-1.1.6-javadoc.jar
2023/04/23  14:55           120,155 tools-java-1.1.6-sources.jar
2023/04/23  14:55           169,196 tools-java-1.1.6.jar
               4 個のファイル          54,139,714 バイト
              10 個のディレクトリ  236,821,012,480 バイトの空き領域
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>java -jar tools-java-1.1.6-jar-with-dependencies.jar Convert ../testResources/SPDXTagExample-v2.3.spdx TagToRDF.rdf
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 509C-4ED5 です

 C:\pleiades\workspace\tools-java\target のディレクトリ

2023/04/24  00:00    <DIR>          .
2023/04/24  00:00    <DIR>          ..
2023/04/23  14:55    <DIR>          apidocs
2023/04/23  14:54    <DIR>          classes
2023/04/23  14:55    <DIR>          javadoc-bundle-options
2023/04/23  14:55    <DIR>          maven-archiver
2023/04/23  14:54    <DIR>          maven-status
2023/04/23  14:55    <DIR>          site
2023/04/23  14:55    <DIR>          surefire-reports
2023/04/24  00:00           344,329 TagToRDF.rdf
2023/04/23  14:54    <DIR>          test-classes
2023/04/23  14:55        53,434,220 tools-java-1.1.6-jar-with-dependencies.jar
2023/04/23  14:55           416,143 tools-java-1.1.6-javadoc.jar
2023/04/23  14:55           120,155 tools-java-1.1.6-sources.jar
2023/04/23  14:55           169,196 tools-java-1.1.6.jar
               5 個のファイル          54,484,043 バイト
              10 個のディレクトリ  236,820,484,096 バイトの空き領域
```
TagToRDF.rdfが無事作成されましたので比較してみましょう。
左が変換前、右が変換後です。
確かにTag:Value → RDF変換が行われているようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/b311c21d-ed7e-9f41-90de-4347f4bed4c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/9f63554f-84b1-6bfb-9078-a604eecc721d.png)

README.mdを読む感じConvert以外にもVerifyやSPDXViewerも使えるようですので、時間がある時にまた試してみようと思います。

# 最後に

ソースコードからSBOMを起こす方法は存在しているのでしょうか。有識者の方からのお知らせをお待ちしております。
SPDX Liteを手作業で作成してツールでSPDX形式に加工、その後必要な部分を手作業で入力する感じ･･･？
と思ったらMicrosoftの提供するReview Toolkitやsbom-toolなるものもあるようです。こちらもいずれ時間作ってやってみようかと。

# 参考サイト

pdfは直リンクしか見つかりませんでした･･･。

https://wiki.linuxfoundation.org/_media/openchain/20190418-spdx-toolingswg.pdf

https://www.hitachi-solutions.co.jp/sbom/sp/download/document/grape-ossseminar2022_LectureMaterial.pdf

https://codebook.machinarecord.com/threat-intelligence/23666/

https://qiita.com/K-Hama/items/5c1d4759fd5cbcf397b2