Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20210329前編)特集: Rails更新版の臨時リリースとmimemagic gemのGPL問題

こんにちは、hachi8833です。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

🔗 特集: mimemagic gemのGPL問題とRails更新版リリース

現状: Rails 5.2.5、6.0.3.6、6.1.3.1がリリース

最初に本日(2021/03/29)時点の情報から。
後述するmimemagicの問題を解決したRailsが日本時間の2021/03/27(土)03:24にリリースされました。

上の更新版Railsにアップデートすることでmarcelがmimemagicに依存しなくなります。

mimemagicが必要な場合の対応方法やRails以外のサードパーティgemの問題について詳しくは、ruby-jp有志がまとめている以下の情報もどうぞ。随時更新されています。

参考: mimemagicの最新動向 - HackMD

なおgemごとのライセンス情報表示はbundle licensesコマンドでやるのが一番手軽でした。

追記(2021/03/30)

以下の記事はmimemagicを使わない場合の注意事項です↓。

参考: mimemagicに依存しなくなったmarcelのmime type判定の変化には気をつけようって話 - Tallman

🔗 経緯

つっつきボイスは2021/03/25夜(木)時点のものです。更新版Railsがリリースされる前の流動的な状態につき、ご了承ください。


つっつきボイス:「今ちょうどmimemagicのGPL問題であちこちが騒ぎになっていますね」「気づいてなかった〜」「気づかずに済んだのは幸い: 組織内gemサーバーを使っていないところや、gemのキャッシュが残っていないRailsアプリがこの問題を踏むとbundle installでmimemagicを取得できずにCI(Continuous Integration)がコケます」「げ」

「単にmimemagic gemが取れなくなっただけなら参照先を変えるなどすれば対応可能なんですが、mimemagicで見つかったGPL汚染が現時点で解決していないのが問題なんですよ(注: Rails更新版で対応済み)」「なるほど」

参考: GPL汚染 ‐ 通信用語の基礎知識

「今の時点(3/25 20時頃)ではbundle update mimemagicを実行すれば更新版のmimemagicを取得してエラーを解決できますが、更新版mimemagicがGPL-2.0ライセンスのまま(注: 3/29時点では後述の対応でMITライセンスに変更済みです)なので、Railsアプリ全体のライセンスがGPL-2.0になってしまいます」「mimemagicは随分前からRailsで使われてたのか」

「こういう依存関係があったそうです↓」

mimemagicの依存関係

  • RailsのActive Storageは、rails/marcel gemに依存している
  • rails/marcel gemは、Railsリポジトリの外にあるmimemagic gemに依存している

rails/marcel - GitHub

旧minad/mimemagic↓は、現在minemagicrb/minemagicにリダイレクトされます(3/29時点)。

minad/mimemagic - GitHub

「以下は発端となったRailsのissue #41750ですが↓、既にロックされて書き込めなくなってます」「それほど書き込みが激しかったということですね」「また新しいissue(41517)が開いてる」

「以下が現時点(3/25夜)までのおおよその流れです↓」

ここまでの流れ

  • minad/mimemagic gemで使っているMIMEリストXMLファイルfreedesktop.org.xmがGPL-2.0ライセンスであることが発覚した(#97
  • minad/mimemagic 0.3.6で以下を行った
    • ライセンスをMITからGPL-2.0に変更
    • minad/mimemagicのリポジトリをアーカイブ化
    • 従来MITライセンスとして公開されていたminad/mimemagic gemをyankした

issue: freedesktop.org.xml file license · Issue #97 · minad/mimemagic

「mimemagicはActive Storage添付ファイルのMIMEタイプの判別に使っているんでしょうね」

参考: MIME タイプ (IANA メディアタイプ) - HTTP | MDN

「現時点(3/25夜)では、少なくともrails/marcel gemのminad/mimemagic依存を「ruby-magicに切り替える」「libmagicに切り替える」という2つの方向が検討されているようです↓」「#26のCIが全部失敗しているのでまだ作業中か」「緊急の対応がどうしても必要でなければ、Railsフレームワーク側でmimemagicを置き換えて対応するのを待つのが確実でしょうね」「そうします」

その後

(3/29夜の時点)最終的に冒頭の更新版Railsでは、rails/marcel gemがアップグレードしてmimemagic↓に依存しなくなり、rails/marcel gemでMIMEデータファイルにApache Tika(Apache License 2.0)のファイルを用いるようにしたことで対応しました。

mimemagicrb/mimemagic - GitHub

参考: Apache Tika – Apache Tika
参考: Apache License - Wikipedia

Railsのバージョンが微妙に古いなどの理由でmarcelをアップグレードできない場合は、minimagicを更新したうえでshared-mime-infoパッケージ↓でインストールされるfreedesktop.org.xmlをFREEDESKTOP_MIME_TYPES_PATHに指定して使う必要があるでしょう。

参考: shared-mime-info
参考: mimemagicの最新動向 - HackMD

🔗 GPL-2.0の解釈

ライセンスの解釈は最終的に弁護士など法務関係者の判断や法的手続きが必要と思われます。本記事におけるライセンスの解釈についてはあくまで参考情報にとどめていただくようお願いします。

「SaaSとしてのRailsアプリであれば、GPL-2.0に基づいたソースコード開示の対象にはならないのではないかという情報をruby-jpで見かけました: 以下のNate Berkopecさんのツイートにも同趣旨のことが書かれています↓」「そこはどうだったかな...GPL-3.0やLGPLではそうした点の明文化が改善されていたと思うんですが、GPL-2.0はそのあたりが曖昧だったような覚えがあります」「う〜む」「GPL-2.0は古くからあるライセンスですし、SaaSのような利用形態を想定していない可能性もありそうなので、この話を信じていいかどうかは判断できないかな」「ソフトウェアライセンスに強い弁護士じゃないと無理そうですね」(しばし議論)

参考: GNU General Public License - Wikipedia
参考: GNU Lesser General Public License - Wikipedia
参考: PDF IoT時代におけるOSS の利用と法的諸問題Q&A集

「近年MITライセンス↓などのより制約の少ないライセンスが広く使われるようになったのはそうした理由が大きいと思います: GitHubにリポジトリを作るときもたしかデフォルトでMITライセンスファイルが作られますよね」「はい、GitHubはそうなってます」

参考: MIT License - Wikipedia

🔗 ユーザー環境でRailsベースの製品を動作させるプロダクトへの影響

「これもruby-jpで見かけたのですが、この問題の影響が大きいのは主にGitLabやGitHub EnterpriseのようにRailsアプリをライセンス販売している会社だそうです」

「GPLライセンスのソフトウェアを自分達の作ったソフトウェア内に含めてしまうと、配布した際にソフトウェア全体をGPL規約に従ってユーザーに公開する必要があります: 非公開のコードをユーザー側環境のアプリケーションサーバーで動かせるようなプロダクト(GitHub EnterpriseやGitLab EEなど、クラウドサービスのEnterprise版でオンプレ環境に対応したものなど)の場合、大きな問題になります」

🔗 DMCA takedown

「以下はGo言語のmimemagicリポジトリですが、こちらには同様の指摘がメールでメンテナーに届いたとのことで、やはりライセンスをGPL-2.0に変更しています」「DMCA takedownの通告を受けたのか、これは大変そう」

zRedShift/mimemagic - GitHub

「GitHubのようなソフトウェア配布事業者やコンテンツ事業者がDMCA takedownの通告を受けたら、DMCA違反かどうかの詳細を確認するよりも先に配布を速やかに停止しないといけないんですよ」「えぇ?」「もちろん異議申し立てなどのプロセスもありますが、手順としては最初に公開を停止してから事実確認や審議を行うことになっていて、その意味では事業者よりも利用者の保護を優先していると言えますね」

参考: デジタルミレニアム著作権法 - Wikipedia -- DMCA
参考: DMCAテイクダウンポリシー - GitHub Docs

通知がリポジトリのコンテンツ全体、またはパッケージが著作権侵害に該当すると主張する内容の場合、当社はステップ 6 に移動し、リポジトリ全体またはパッケージを迅速に無効にします。 そうでない場合、GitHub はリポジトリ内の特定のファイルへのアクセスを無効にすることはできないため、リポジトリを作成したユーザに連絡し、約 1 営業日以内に通知で指定されたコンテンツを削除または変更するよう求めます。 ユーザに変更を行う機会を提供した場合、当社はその旨を著作権者に通知します。 パッケージはイミュータブルであるため、パッケージの一部が著作権を侵害している場合、GitHub はパッケージ全体を無効にする必要がありますが、侵害している部分が削除された場合は復帰を許可しています。
docs.github.comより(強調は編集部)

「GitHubのドキュメント↑にもあるように、通告を受けた事業者は1営業日以内にコンテンツを削除または変更しないといけません」「たった1日ですか?」「通知が来た日の翌営業日までだと思います」「それでもキビシイ🥲」「リポジトリのメンテナーがたまたま休んでたりしたら間に合わなさそう」「ドキュメントには『うっかり期間内に変更できなかった場合』の項目もあるから対応はできそうかな」

「DMCA takedownは強い指示で、それでいて申し立ても比較的やりやすいので、これまでも炎上記事の火消しなどのために記事公開を差し止めさせるといった、DMCA本来の目的から外れた使われ方がしばしば話題になってますね」「あぁなるほど!」「言われてみればその手の記事をときどき見かけますね」

参考: 史上最高に馬鹿げた著作権侵害のDMCA通告 | TechCrunch Japan

「その代わり、悪用防止のためにDMCA takedownを依頼した側の情報は事業者がすべて公開しています」「なるほど、そうしないといくらでもイケないことに使われそう」「それでもしばしばそういうふうに使われていますけどね」「『DMCA 悪用』でググるといっぱい出てくる...」「今見ている記事でも、DMCAを悪用するとかえってブランドイメージを傷付けるから止めた方がいいよって書かれてました」

参考: Google 透明性レポート
参考: DMCAとは 意味・用途 - アイオイクスの社員ブログ

🔗 まとめ

「minad/mimemagicの場合はDMCA通告ではなくshared-mime-infoメンテナーからのissue(#97)でGPLの件が知らされていたようですが、今回の件でminad/mimemagicリポジトリをアーカイブしたのはDMCA違反回避のためにやむを得ず緊急で行ったのだろうと推測しました」「悪意とかではなく、事が重大なだけに真っ先に公開を止めてそれからRails側に知らせるしかなかったんでしょうね、何となくわかってきました」「リポジトリを止めたときのRailsへの影響の大きさがわかっていてもリポジトリを一時的に復旧できなかったのは、そういうことだったのかも」「学びを得た気持ちです」

無事に復旧して何よりでした。関係者の皆さまお疲れさまでした!


「ところで、#41750のコメント↓に貼られているxkcd: Dependencyの絵は身につまされますね」「あと、mimemagicという名前がminimagickに似てて何度も間違えそうになりました」「たしかに」

minimagick/minimagick - GitHub


前編は以上です。

バックナンバー(2021年度第1四半期)

週刊Railsウォッチ(20210323後編)GitHub Actionsで使えるruby/setup-ruby、中高生国際Rubyプログラミングコンテスト2020ほか


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。