続・玩式草子 ―戯れせんとや生まれけん―

第44回linux-6.0とSPDX

ここしばらく上半期末の事務処理やら稲刈りやらを口実に執筆をサボっているうち、linux-6.0がリリースされていました。最近のバージョン付けルールでは、4.19の次は5.0、5.19の次は6.0と、マイナーバージョンが20になるとメジャーバージョンが繰りあがるようになっているため、⁠メジャーバージョンアップ」に以前のような感慨は無くなったものの、1991年に開発が始まって以来30有余年、うまずたゆまず開発を続けてきたLinusさんたちの努力には頭が下がります。

最近はあまりカーネルのソースコードを見ることがなかったので、6.0がリリースされた機会に、と久しぶりにあれこれと眺めてみたら、少し変わったことに気づきました。というのも、ほとんどのソースコードの先頭にこんな行が追加されているのです。

$ head linux-6.0/init/main.c
// SPDX-License-Identifier: GPL-2.0-only
/*
 *  linux/init/main.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 ...

linuxの利用許諾条件はGPL-2.0なことはよく知っているものの、SPDX-License-Identifier:というタグは意識したことがありませんでした。そこで「これは何?」と少し調べてみることにしました。

Software Package Data Exchange

ざっと調べたところを簡単に紹介すると、SPDXとは"Software Package Data Exchange"の略で、Linux Foundationが中心になって取り決めた、ソフトウェアのライセンスなどに関するメタ情報をやりとりするための規格だそうです。

図1 SPDXのサイト(https://spdx.dev/)
SPDXのサイト

Linuxを代表とするフリー/オープンソース・ソフトウェア(FOSS)が普及してきた結果、現在では、データの圧縮・展開や画像処理、暗号化、各種ネットワークサービス等々、膨大な数のツールやライブラリがFOSSとして提供され、それらを利用することで新しいソフトウェアの開発が劇的に加速するようになりました。

一方、FOSSにはライセンスに関わる問題が発生しがちです。最近はライセンスに関する意識も高まってきたので、GPLなコードを組み込んだ商用ソフトウェアがソースコード開示請求された、といった話題はあまり聞かなくなったものの、何か新しいソフトウェアを作ろうとする際、ライブラリ等の部品として使いたいソフトウェアが利用元のソースコードの公開も求めるGPLなのか、リンクして使うには問題ないLGPLなのか、より制限の少ないBSDやApache、MITライセンスなのかは、特に商用ソフトウェアの開発において注意すべきポイントになります。

たいていのFOSSは、ソースコードを収めたディレクトリにそのコードを利用する際の条件(使用許諾契約)を記したCOPYINGというテキストファイルを用意しているものの、依存関係で芋ヅル式に増加していくライブラリそれぞれの"COPYING"ファイルを調べるのは面倒です。また、たいていの"COPYING"ファイルはGPLやBSDライセンスの写しなものの、実際にどのライセンスを採用しているのかはファイルを開いてみるまでわかりませんし、法的な有効性を意識したライセンスの文言を機械的に処理するのは厄介です。

そこでSPDXでは、FOSSに使われているライセンスを広く収集、整理し、それらに識別子を付けて簡単に区別できるようにしました。SPDXのサイトには収集しているFOSSのライセンスの一覧表があります。

図2 SPDXが収集したライセンス集
SPDXが収集したライセンス集

2022/08/12付けのバージョン3.18の時点で、現在も利用されているライセンスが469、使われなくなった(deprecated)ライセンスが31の計500のFOSSライセンスが紹介され、それぞれの条文や出所、FSFやOSIが認めたライセンスかどうかが一覧表になっています。

GPLやBSD、MIT、Apacheといったメジャーなライセンスのみならず、IPAやJPNIC、はてはbzip2やimlib、libtiffなど、そのソフトウェアだけしか使ってないようなライセンスまで収集、整理されているのには感心します。

上述のようにSPDXのサイトでは500の異なるライセンスが整理され、それぞれを一意に区別する識別子が振られているので、"COPYING"ファイルの写しを置かずとも、識別子だけで適用するライセンスを示すことができます。

多くのFOSSプロジェクトではソースコードのあるディレクトリに置いた一つの"COPYING"ファイルがプロジェクト全体に適用されるように考えています。しかしながら、linuxのような規模になってくると、⁠全体的にはGPLv2だけど、外部からAPIを使うためのヘッダーファイル等についてはLGPL」という風に、ファイルごとに異なるライセンスを適用した方が便利な場合もあります。

そのためSPDXでは、ファイル単位でライセンスを設定するよう、ソースコードの先頭行にコメント文として"SPDX-License-Identifier:"タグと適用されるライセンスの識別子(たとえば"GPL-2.0-only")を書くことになっています。先に見たlinux-6.0/init/main.cの先頭にある"//SPDX-License-Identifier: GPL-2.0-only"が、この方式に対応したライセンスの表示方法になります。

linux-6.0とSPDX

それでは実際にlinuxのソースコードにSPDXがどのように利用されているか調べてみましょう。執筆時点での最新版、linux-6.0.5には77970のファイルが含まれています。

$ find linux-6.0.5/ -type f | wc -l
77970

そのうち、"SPDX-License-Identifier:"のタグを持つファイルは62210ありました。

$ find linux-6.0.5/ -type f -print | xargs grep 'SPDX-License-Identifier:' | wc -l
62210

どのライセンスが採用されているのかを確認すると、当然のことながら大多数のファイルはGPL-2.0です。

$ find linux-6.0.5/ -type f -print | xargs grep 'SPDX-License-Identifier:' | cut -f3 -d':' | sort | uniq -c | sort -nr
  15587  GPL-2.0
  11814  GPL-2.0-only
   8918  GPL-2.0 */
   5797  GPL-2.0-or-later
   4182  GPL-2.0-only */
   2536  GPL-2.0-or-later */
   2355  GPL-2.0+
   ...

しかしながら、MITBSDISCライセンスなどを採用しているファイルも散見されます。

    645  MIT */
    611  GPL-2.0+ */
    528  (GPL-2.0 OR BSD-2-Clause)
    458  MIT
    363  GFDL-1.1-no-invariants-or-later
    286  GPL-2.0-only OR BSD-2-Clause
    284  ISC
    258  BSD-3-Clause OR GPL-2.0

ISC(Internet Systems Consortium)ライセンスを採用しているのはどのファイルだろう、と確認してみると、

$ find linux-6.0.5/ -type f -print |xargs grep 'SPDX-License-Identifier:' | grep ISC
linux-6.0.5/Documentation/process/license-rules.rst:	  SPDX-License-Identifier: ISC
...
linux-6.0.5/drivers/net/wireless/ath/ath10k/ahb.c:// SPDX-License-Identifier: ISC
linux-6.0.5/drivers/net/wireless/ath/ath10k/ahb.h:/* SPDX-License-Identifier: ISC */
linux-6.0.5/drivers/net/wireless/ath/ath10k/bmi.c:// SPDX-License-Identifier: ISC
...
linux-6.0.5/drivers/net/wireless/broadcom/brcm80211/Makefile:# SPDX-License-Identifier: ISC
linux-6.0.5/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile:# SPDX-License-Identifier: ISC
...

ISCはBIND9やISC DHCPの開発元ということもあってか、ネットワーク製品を開発している企業が提供したワイヤレスネットワーク用のドライバ類にISCライセンスを採用している例が多いようです。

少し変わったところではZlibライセンスを採用しているファイルもありました。

$ find linux-6.0.5/ -type f -print |xargs grep 'SPDX-License-Identifier:' | grep Zlib
linux-6.0.5/LICENSES/deprecated/Zlib:    SPDX-License-Identifier: Zlib
linux-6.0.5/lib/zlib_dfltcc/dfltcc.c:// SPDX-License-Identifier: Zlib
linux-6.0.5/lib/zlib_dfltcc/dfltcc.h:// SPDX-License-Identifier: Zlib
linux-6.0.5/lib/zlib_dfltcc/dfltcc_deflate.c:// SPDX-License-Identifier: Zlib
linux-6.0.5/lib/zlib_dfltcc/dfltcc_inflate.c:// SPDX-License-Identifier: Zlib
linux-6.0.5/lib/zlib_dfltcc/dfltcc_util.h:// SPDX-License-Identifier: Zlib

これらはzlibがファイルシステムの圧縮等に用いられていたころ利用されたコードなものの、より高機能のxzやzstdが採用されたので、現在はたぶん使用されていません。そのため、SPDX的には現在も有効なライセンスと認められているものの、linux的にはdeprecated(廃止された)と見なされているようです。

この結果を見ると、⁠管理を容易にするためにライセンス情報を機械可読形式にする」というSPDXの目的のひとつは、linuxに関してはかなり実現できていると言えそうです。


実のところ、SPDXはSBOM(Software Bill of Materials:ソフトウェアの部品表)という概念を実現するための規格で、ライセンス管理はその機能の一部に過ぎません。

BOM(部品表)は製造業などが採用している部品管理システムの謂で、ある製品を製造するために必要な部品の種類や名称、仕様、規格、発売元等の情報をまとめ、生産や開発、品質管理に役立てよう、というものです。たとえば、製品の不具合がある部品に起因することがわかった場合、BOMを使えばその部品を使っている他の製品を簡単に調べることができるので、迅速にリコール等の対応ができます。

ソフトウェア業界にもこのような仕組みを導入しよう、というのがSBOMの目標です。すなわち、ソフトウェア製品で使われている各種FOSSの名称や機能、開発元、バージョン情報等をBOMとして管理し、セキュリティ等の問題が見つかった場合、その影響範囲を見極め、迅速な対応が取れることを目指しています。

SBOMを実現するためには必要な情報を機械可読形式にして電子的にやりとりする必要があります。SPDX(Software Package Data Exchange)はこのやりとりの際に使われるデータ形式の仕様で、今回紹介した"SPDX License List"はSBOMのうちのライセンス情報に関する部分をとりあげています。

SPDXの最初の仕様(1.0)が確定したのは2011年8月で、すでに10年以上の歴史を持つものの、linux以外のソフトウェアプロジェクトでこの形式を採用しているものはあまり目にしたことがありません。しかしながら、米国政府がソフトウェアのサプライ・チェーン・セキュリティの観点から、政府に納入するソフトウェアにSBOMを求める大統領令を発したり、Javaのログ取り機能として多数のソフトウェアで利用されていたLog4jのセキュリティ問題Log4Shellが大騒ぎになったりした結果、SBOMやSPDXへの関心も高まってきたようで、新しく書き起されたり、最近修正されたFOSSのコードには"SPDX-License-Identifier:"タグが散見されるようになりました。

Linusさんあたりには「口(仕様や規格の策定)よりも手を動かせ(コードを書け⁠⁠」と小言を言われそうですが(苦笑⁠⁠、FOSSが社会システムのインフラとして使われていくには、このような手続きも必要なのでしょう。

おすすめ記事

記事・ニュース一覧