こんにちは、hachi8833です。
🔗 特集: 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にリリースされました。
Hey everyone! Rails version 5.2.5, 6.0.3.6 and 6.1.3.1 have been released. These versions upgrade
Active Storage’s Marcel dependency to version 1.0.0. https://t.co/aSj5eBcJpJ— Ruby on Rails (@rails) March 26, 2021
上の更新版Railsにアップデートすることでmarcelがmimemagicに依存しなくなります。
mimemagicが必要な場合の対応方法やRails以外のサードパーティgemの問題について詳しくは、ruby-jp有志がまとめている以下の情報もどうぞ。随時更新されています。
なおgemごとのライセンス情報表示はbundle licenses
コマンドでやるのが一番手軽でした。
追記(2021/03/30)
以下の記事はmimemagicを使わない場合の注意事項です↓。
参考: mimemagicに依存しなくなったmarcelのmime type判定の変化には気をつけようって話 - Tallman
🔗 経緯
注
つっつきボイスは2021/03/25夜(木)時点のものです。更新版Railsがリリースされる前の流動的な状態につき、ご了承ください。
Good morning everyone! If you have a Rails app 6.1+, you probably noticed all of your bundle installs are failing! A gem, mimemagic, had a licensing issue and needed to yank all of its old (illegal) versions and relicense. Your options:
— Nate Berkopec (@nateberkopec) March 24, 2021
つっつきボイス:「今ちょうどmimemagicのGPL問題であちこちが騒ぎになっていますね」「気づいてなかった〜」「気づかずに済んだのは幸い: 組織内gemサーバーを使っていないところや、gemのキャッシュが残っていないRailsアプリがこの問題を踏むとbundle install
でmimemagicを取得できずにCI(Continuous Integration)がコケます」「げ」
「単にmimemagic gemが取れなくなっただけなら参照先を変えるなどすれば対応可能なんですが、mimemagicで見つかったGPL汚染が現時点で解決していないのが問題なんですよ(注: Rails更新版で対応済み)」「なるほど」
おおお?突如としてrailsがGPL に感染した https://t.co/1hTDTeby29
— 7594591200220899443 (@shyouhei) March 24, 2021
もともとGPLだったものを改めてGPLだと宣言し直した人の行いは正しいので、その事は咎めないようにしましょう。
— 7594591200220899443 (@shyouhei) March 24, 2021
「今の時点(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に依存している
旧minad/mimemagic↓は、現在minemagicrb/minemagicにリダイレクトされます(3/29時点)。
「以下は発端となったRailsのissue #41750ですが↓、既にロックされて書き込めなくなってます」「それほど書き込みが激しかったということですね」「また新しいissue(41517)が開いてる」
- Dependency on mimemagic 0.3.x no longer valid · Issue #41750 · rails/rails -- 現在はクローズ
- New mimemagic version licensed under MIT · Issue #41757 · rails/rails -- 現在はクローズ
「以下が現時点(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を置き換えて対応するのを待つのが確実でしょうね」「そうします」
- PR: Replace mimemagic with ruby-magic by georgeclaghorn · Pull Request #26 · rails/marcel
- コメント: Dependency on mimemagic 0.3.x no longer valid · Issue #41750 · rails/rails
その後
(3/29夜の時点)最終的に冒頭の更新版Railsでは、rails/marcel gemがアップグレードしてmimemagic↓に依存しなくなり、rails/marcel gemでMIMEデータファイルにApache Tika(Apache License 2.0)のファイルを用いるようにしたことで対応しました。
参考: Apache Tika – Apache Tika
参考: Apache License - Wikipedia
Railsのバージョンが微妙に古いなどの理由でmarcelをアップグレードできない場合は、minimagicを更新したうえでshared-mime-infoパッケージ↓でインストールされるfreedesktop.org.xmlをFREEDESKTOP_MIME_TYPES_PATH
に指定して使う必要があるでしょう。
🔗 GPL-2.0の解釈
注
ライセンスの解釈は最終的に弁護士など法務関係者の判断や法的手続きが必要と思われます。本記事におけるライセンスの解釈についてはあくまで参考情報にとどめていただくようお願いします。
「SaaSとしてのRailsアプリであれば、GPL-2.0に基づいたソースコード開示の対象にはならないのではないかという情報をruby-jpで見かけました: 以下のNate Berkopecさんのツイートにも同趣旨のことが書かれています↓」「そこはどうだったかな...GPL-3.0やLGPLではそうした点の明文化が改善されていたと思うんですが、GPL-2.0はそのあたりが曖昧だったような覚えがあります」「う〜む」「GPL-2.0は古くからあるライセンスですし、SaaSのような利用形態を想定していない可能性もありそうなので、この話を信じていいかどうかは判断できないかな」「ソフトウェアライセンスに強い弁護士じゃないと無理そうですね」(しばし議論)
If you have a Rails 5.2+ app, do not distribute your source code, and depend on activestorage, you are probably still legally OK to "bundle update" and continue you on with your life today, thanks to the GPL's SaaS loophole: https://t.co/E5Qb6V0XKM IANAL and this is not legal adv
— Nate Berkopec (@nateberkopec) March 24, 2021
Correction to thread: Rails 5.2+, all of your options are the same.
— Nate Berkopec (@nateberkopec) March 24, 2021
参考: GNU General Public License - Wikipedia
参考: GNU Lesser General Public License - Wikipedia
参考: PDF IoT時代におけるOSS の利用と法的諸問題Q&A集
「近年MITライセンス↓などのより制約の少ないライセンスが広く使われるようになったのはそうした理由が大きいと思います: GitHubにリポジトリを作るときもたしかデフォルトでMITライセンスファイルが作られますよね」「はい、GitHubはそうなってます」
🔗 ユーザー環境でRailsベースの製品を動作させるプロダクトへの影響
「これもruby-jpで見かけたのですが、この問題の影響が大きいのは主にGitLabやGitHub EnterpriseのようにRailsアプリをライセンス販売している会社だそうです」
「GPLライセンスのソフトウェアを自分達の作ったソフトウェア内に含めてしまうと、配布した際にソフトウェア全体をGPL規約に従ってユーザーに公開する必要があります: 非公開のコードをユーザー側環境のアプリケーションサーバーで動かせるようなプロダクト(GitHub EnterpriseやGitLab EEなど、クラウドサービスのEnterprise版でオンプレ環境に対応したものなど)の場合、大きな問題になります」
🔗 DMCA takedown
「以下はGo言語のmimemagicリポジトリですが、こちらには同様の指摘がメールでメンテナーに届いたとのことで、やはりライセンスをGPL-2.0に変更しています」「DMCA takedownの通告を受けたのか、これは大変そう」
「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に似てて何度も間違えそうになりました」「たしかに」
前編は以上です。
バックナンバー(2021年度第1四半期)
週刊Railsウォッチ(20210323後編)GitHub Actionsで使えるruby/setup-ruby、中高生国際Rubyプログラミングコンテスト2020ほか
- 20210322前編 Active Recordのstrict loadingの修正、セキュリティリリースのポリシー追加、N+1チェッカーprosopite gemほか
- 20210316後編 testdouble/standard gem、DockerfileベストプラクティスとDockerfileのlintツールhadolintほか
- 20210315前編 Active Recordのenum関連改修、Active SupportのEnumerableでpluckが使えるほか
- 20210309後編 RubyのIRBに隠れているイースターエッグ、Power Automate Desktop、SQLクエリのありがちなミス6つほか
- 20210303後編 Bundlerのセキュリティ修正、Rubyのガベージコレクション記事、Rubyが2/24に誕生日ほか
- 20210222 ActiveRecord::Relationの新メソッドload_asyncとexcluding、Active Jobのperform_laterの改善ほか
- 20210209後編 Rubyでミニ言語処理系を作る、Kernel#getsの意外な機能、CSSのcontent-visibilityほか
- 20210208前編 Rails次期リリースがバージョン7に決定、thoughtbotのアプリケーションセキュリティガイドほか
- 20210202後編 Ruby 3 irbのmeasureコマンド、テストを関数型言語のマインドセットで考えるほか
- 20210201前編 Webpackerのガイドがマージ、RailsはRuby 3でどのぐらい速くなったかほか
- 20210126後編 Google Cloud FunctionsがRubyをサポート、Ruby 3のパターンマッチングでポーカーゲームほか
- 20210125前編 Railsリポジトリのデフォルトブランチがmainに変更、Rails 6.1はMySQLのENUM型に対応済みほか
- 20210120後編 Ruby 3.0の新機能で遊ぶ、RubyスニペットをJSに変換するRuby2JS、rspec-parameterized gemほか
- 20210113後編 Ruby 3.0 Ractor解説記事、Vercelホスティングサービス、教育用OS xv6ほか
- 20210112前編 Active Recordの範囲指定バリデーション改善、soleとfind_sole_byメソッド、AlgoliaとRailsほか
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)