バイナリ・ブロブの恐怖

むかし、「ブロブ 宇宙からの不明物体」というB級映画があった。正体不明のぶよぶよした肉塊が人間を食べて巨大化していくというホラーSFだが、いろいろな意味で後味の悪いラストが印象的だった。

映画のブロブほどダイレクトには恐ろしくないものの、フリーソフトウェア/オープンソースの世界にとっては大変な脅威なのがバイナリ・ブロブ(binary blob)だ。対応するソースコードが入手できないオブジェクトコードを総称して、こう呼んでいる。まあ、この定義だとプロプライエタリ・ソフトウェアのうちソースが入手できないものはすべてバイナリ・ブロブとなってしまうのだが(そして別にそれでも間違いではないが)、特に「バイナリ・ブロブ」として言及される場合には、多くの場合大規模な実行形式のプログラムというよりは、無線LANやソフトモデム、グラフィックスなどある種のハードウェア用のファームウェアやカーネルモジュールのような、オープンソースOSのカーネルに特殊な手続きによって読み込まれるオブジェクトコードの小断片のことを指すことが多いようである。Ndiswrapperで読み込まれるWindows用のデバイスドライバに加え、BIOS、あるいはウェブブラウザやその他のアプリケーション向けのプラグイン(典型的にはFirefox向けのAdobe Flash Playerプラグイン)といったものもバイナリ・ブロブと呼ばれることがある。ようは、フリーソフトウェア/オープンソースが中心の世界においてもしぶとく生き残ったプロプライエタリな一部分ということだ。

ハードウェアメーカや組み込み系など、どうしてもソースや内部情報を公開したくないという向きはそれなりにあるようで、ドライバを出すにしてもバイナリ・ブロブにしたいという欲求にはなかなか根強いものがある。私などは、だったらそもそもオープンソースOSなど使わなければいいのにと思うのだが、そのへんは大人の事情というようなものがあるのだろう。ちなみに、たとえLinuxカーネルのように「本体」にGPLが適用されている場合でも、ユーザが自分の手元で読み込ませる限り、ライセンス的な問題はない。もちろん、あらかじめビルドされたカーネルに組み込んだ形で配布することはできないが。

とは言え、バイナリ・ブロブは結局のところ「正体不明のバイナリの塊」でしかないので、当たり前だがフリーソフトウェア/オープンソースとの親和性は甚だ良くない。リバースエンジニアリングでもしない限り中がどうなっているのかよく分からないので、バグがあっても自分で直すことができないし、ライブラリのバージョンが上がった、バイナリ・ブロブ以外の部分が書き直された、というような外部環境の変化で容易に動かなくなる。移植はおろか再コンパイルも出来ないので、最近だとGNU/Linuxでも、バイナリ・ブロブに頼っているせいで32bit環境では動くのに64bit環境では動かなくなるハードウェアというのが結構あった。おまけに、こうしたバイナリ・ブロブは往々にしてハードウェア寄りの低レベルな処理を担うことが多いので、その出来が悪いとシステム全体のクラッシュやフリーズの原因となる。ようするに、OS全体の安定性がたった一つのバイナリ・ブロブの出来不出来に左右されてしまうのである。ちなみにバイナリ・ブロブでひどい目に遭っているのは何もGNU/Linuxだけではなく、Windows Vistaのクラッシュのなんと28%は、Nvidiaの不出来なバイナリ・ブロブ・ドライバのせいなのだそうだ(Ars Technicaの記事)。

このようなこともあって、Linuxの開発者の多くは今や明確にバイナリ・ブロブに反対している。かなり前から、ライセンス的にまずいカーネルモジュールを組み込もうとすると「汚染されたカーネル(tainted kernel)」というようなメッセージが出てくるようにもなっているが、これをかいくぐろうとして袋だたきにあった奴もいた(プロプライエタリ・ドライバによるLinuxカーネルの「汚染」OpenBSDは以前からバイナリ・ブロブを全く受け付けないし、最近ではgNewSenseのように、バイナリ・ブロブの完全除去を目標の一つに掲げるLinuxディストリビューションも存在するくらいである。ちなみに、現在FSFが公式に推奨するLinuxディストリビューションがこれだ。

一口にバイナリ・ブロブといっても、見た目からして明らかにバイナリオンリーなのはまだましだ。一番たちが悪いのが、一見普通のソースコードの中にバイナリ・ブロブがテキストエンコードされて紛れ込んでいる場合である。2003年のことだが、ICQクライアントのmICQ バージョン0.4.10.1には以下のようなCコードが入っていた。

#if defined(__Dbn__) && __Dbn__ != -1 && !defined (EXTRAVERSION)
  if (me[0] != 'm' || me[1] != 'a' || me[2] != 'd' || me[3] != 'k' ||
      me[4] != 'i' || me[5] != 's' || me[6] != 's' || me[7])
  if (time (NULL) > 1045000000)
  {
      const char *parts[] = {
                    "\n\n\eX0282nZlv$qf#vpjmd#wkf#nJ@R#sb`hbdf#sqlujgfg#az",
                    "#Gfajbm-#Pjm`f#wkf#Gfajbm#nbjmwbjmfq#jp#f{wqfnfoz#",
                    "vm`llsfqbwjuf/#zlv$qf#bguj`fg#wl#vpf#wkf#afwwfq#rv",
                    "bojwz#sb`hbdf#eqln#nj`r-lqd-#Pjnsoz#bgg#wkf#eloolt",
                    "jmd#ojmf#wl#zlvq#,fw`,bsw,plvq`fp-ojpw#wl#wqb`h#pw",
                    "baof#ufqpjlmp#le#nJ@R9\eX3n\ngfa#kwws9,,ttt-nj`r-lqd",
                    ",gfajbm#pwbaof#nbjm\n\eX0282nWl#wqb`h#@UP#pmbspklwp/",
                    "#bgg9\eX3n\ngfa#kwws9,,ttt-nj`r-lqd,gfajbm#wfpwjmd#n",
                    "bjm\n\eX0282nPlvq`f#sb`hbdfp#nbz#af#qfwqjfufg#pjnjob",
                    "qoz-\eX3n\n\n                                        " };

      char buf[52];
      int i, j;

      for (i = 0; i  30 ? parts[i][j] ^ 3 : parts[i][j];
          buf[j] = '\0';
          M_print (buf);
      }
      exit (99);
  }
#endif

いったいこれが何をするコードなのか、暇な人は読み解いてみると良いだろう。ヒントとして、mICQの作者と、DebianのmICQパッケージメンテナが喧嘩していたということを挙げておく。Debianメンテナのほうのアカウント名はmadkissだった。

こんなのはある意味ほほえましいとも言えるが、現実問題として「見た目上ソースが提供されているにも関わらず、実はバイナリ・ブロブである」というのは、警戒心がゆるむ分いよいよ恐ろしいとも言える。Debianでも、この件をきっかけにしてソースコードの監査(audit)がやかましく言われるようになった。Debianメンテナになる以上、きちんとソースを全部読んでからパッケージにしろということだ。まあ当然のことではあるのだが、現実問題としてはなかなか面倒でもある。とはいえこうしたことが全く浮世離れした懸念かと言えばそうでもなく、実際にあるソフトウェアの配布サイトがクラックされ、バイナリ・ブロブ(のテキストエンコードされたもの)とそのローダーが巧みにソースに挿入されたうえで、元アーカイヴとサイズまで合わせた改ざんアーカイヴが置かれていたということもあった。もちろん、チェックサムを照合すればすぐ分かることだが…。

ところで、今まで述べてきたような技術的、セキュリティ的な懸念もさることながら、私が最も心配しているのは、バイナリ・ブロブがもたらすある種のモラルへの影響である。ようするに、「とりあえず動けばなんでもいいじゃん」というようなイージーな感覚が蔓延するのではないか、ということだ。確かに動けばなんでもいいのであるが、バイナリ・ブロブで動くというのはいわばかりそめのものに過ぎない。本来は、そこからフリーソフトウェア/オープンソースのドライバ等を書くという方向に行かなければならないのだが、そうした意欲が、なまじ中途半端には使えるバイナリ・ブロブが存在するせいで削がれてしまうのではないか、ということである。これが明確にプロプライエタリなOSであったりアプリケーションであったりすれば、そういったものを使うたびにああ俺はプロプライエタリなものを使っているなと意識せざるを得ないわけだが、バイナリ・ブロブの場合は目立たない裏方仕事をこなしている場合が多いので、ユーザからすればあまり意識しなくても済んでしまう。結果として、当人はオープンソース/フリーソフトウェアを使っているつもりで、実態としてはプロプライエタリにどっぷり首根っこを押さえられている、というような状況が招来されうる。これでは元も子もない。

映画のブロブは、人間を食べていった。私は、バイナリ・ブロブが次第にソフトウェアの自由を食い尽くしていくのではないかと懸念しているのである。