Ruby 1.9.2リリースとWEBrick脆弱性問題の顛末

はい、Ruby 1.9.2がリリースされましたね。このバージョンではWEBrick にゼロデイ攻撃可能な脆弱性 - スラッシュドット・ジャパンで紹介されている脆弱性が僕が書いたパッチで修正されているわけなのですけど、そもそもなんで僕が修正しているのか、って顛末がわりと面白いので紹介します。

  • Apple、upstreamに報告してくれないまま脆弱性をCVEに届け出る
  • upstreamに連絡が来ないまま脆弱性が公開される
  • ruby-devにAppleが書いたと思われるパッチが貼られる(Appleでない人間によって)
  • パッチのライセンスが不明なので取り込めない
  • ライセンスを問い合わせるAppleの窓口が不明なので問い合わせもできない
  • ruby-devを読んだ人はライセンス上安全なパッチを書けない
  • 脆弱性だから話は非公開に進めたい
  • yuguiさんがruby-devを読んでない僕に書かせることにする
  • yuguiさんから攻撃用コードをもらってパッチを書く
  • パブリックドメインと宣言
  • Rubyに取り込まれて1.9.2リリース

Rubyのコードはほとんど書いたことがなかったので頼まれたときはできるかどうか不安だったのですけど、攻撃コードを見てみたらそれ Unicode でのHACK #1で紹介されている2005年にGoogleの404ページで発生した脆弱性と同じなのが自明だったので、Tracer.onして攻撃して出力を眺めて問題点を修正するだけで簡単に直りました。

結局のところ、何が問題かというと

  • 問題点を発見したら上流に報告して欲しい。あなたが困る問題はみんなも困る可能性があるんだ。
  • 著作権を主張しないつもりなんだったらそれを明示的に宣言して欲しい。ライセンスが明示されていないのは、どんなライセンスよりも厳しいライセンスだ。

ということなんですよねぇ。おねがいしますよ、Appleさん。



追記
ポケットを空にして。(2010-08-19)
うーむ。
この記事には明らかな間違いと、正しいか正しくないかグレーな内容が含まれている。間違っていることくらいみんなわかるだろうしあえて言及して追い詰めることもないかなぁと思ってスルーしていたのだけども、身近で間違いに気づかない例が観測されたのでやっぱり言及しておかないとな…

まずは明らかな間違いについて。

Ruby に不適合なライセンスであるとしたら、それを組み込んで Apple が配布した Ruby がライセンス違反になるので、Ruby に適合したライセンスであると見なすのが適当であろう。

お茶を吹くかと思った。一般に「XのコードをYが使ってもよい」ことと「YのコードをXが使ってもよい」ということはイコールではない。たとえばAさんが自分のプログラムをパブリックドメインNYSLで公開していたとする。Bさんはそれを修正したコードを自分の好きなライセンスで公開できる。AさんがBさんの行った修正を自分のソフトに取り込んでパブリックドメインを維持したら、これはライセンス違反になりうる。またCさんがLGPLでライブラリを公開して、Dさんがそれを修正してGPLで公開したとする。Cさんがその修正コードを取り込んだら、やっぱこれもGPLにしないとライセンス違反になりうる。GPLパブリックドメインが特殊なのではない。一般論として「YがXを使えるならXもYを使える」なんて無茶苦茶な論理は通用しないってことだ。

次にグレーな内容について。

件のパッチに著作権が発生するか否か、といわれるとしないと思われる。全体のコードの割合から検討するとかなり少なく(1liner)、しかも部分修正で他の人から見てもそれ以外の修正方法はあまりないという時点で著作物とは見なせないと考える。

「みなせないと考える」のは自由だ。しかしあなた個人が「みなせないと考える」ことには何の意味もない。「これは著作物である」と著作権者が主張した場合にどうなるかを考えるんだ。あなたが法廷で「これは著作物とみなせない」と主張するための弁護士代や法務手続きの労働時間を提供してくれるのか?

今回の件に関して著作物とみなせないんじゃないかという意見は多い。僕だって今回の1行修正のパッチに著作権が発生すると法廷が認める確率はものすごく低いと思う。とても白に近いグレーだ。しかし問題点はそんなところじゃないんだ。そんなレイヤーの議論をしているのではない。現状のRubyコミュニティに訴訟に対処できる体力がない以上、いくら白に近く見えてもグレーなものは避けなければいけないんだ。