Island Life

< 『おくりびと』 | 状態の巻き戻し、Gauche部屋引越し >

2009/04/24

ソース幻想

中国政府によるセキュリティ関連製品のソース開示義務が話題になってて、 それじゃ難読化すればいいじゃん、というネタも出ているが、 わざわざ難読化などしなくても例えばStalinの出力のCコードを提出されたら 誰にも読めまい。言語処理系の立場からは、出力がネイティブコードだろうと バイトコードだろうと他言語だろうとやってることは根本的に大した違いは無く、 生成されたコードがCコンパイラの入力になるからといってそれをソースと呼ぶことには 違和感がある。

では実際に人間が書いたもののみをソースと認めるということにすれば良さそうだが、 それが本当に製品のバイナリのソースかどうかということは、処理系を手に入れて コンパイルしてみないとわからない。

ところが世の中には標準の処理系に不満があってマイ言語を作っちゃう人も多く、 DSLまで含めれば「標準の処理系のみ」で完結するものって意外に少ないのではなかろうか。 少なくとも私が今まで仕事で関わったプロジェクトの大半は、標準の言語処理系以外に 何らかの「言語処理系」を必要とする。(例えばautoconfはシェルスクリプトをターゲット とする言語処理系であって、その核はm4だけれど付属するpredefined macroが無いと autoconf処理系としては成立しない)。

そういう周辺処理系も含めて全部提出させればOKかっていうとそうは問屋が下ろさない。 言語処理系そのものはバイナリを許すの? ソース上無害なコードなのにコンパイル時に 怪しいコードが挿入されないという保証は?

よろしい、では言語処理系自体のソースコードも提出させることとしよう。 その全てを精査すれば怪しいコードは検出できるはずだ----ホントに?

言語処理系の多くは、「その言語自身」を使って書いてある。CコンパイラがCで かかれていたり、Scheme処理系がSchemeで書かれていたり。つまり、提出された 言語処理系のソースが本当にその言語処理系のバイナリを生成するかどうかを 確かめるには、その言語処理系のバイナリを使ってソースをコンパイルしてみるしかない。 でも、そのために渡されたバイナリ自体に細工がしてあったら、 ソースが全てを記述しているとは限らない。細工されたコンパイラのバイナリが、 無害なコンパイラのソースからコンパイラを生成する際に細工を忍び込ませることができるからだ (Ken Thompson, Reflections on Trusting Trust)。 「現在のバージョンの」ソースを一式持っている だけでは不十分なのだ。

ではどこまでのソースを持っていれば、確実に検証できるだろうか。 とりあえずCコンパイラとアセンブラくらいは全部自前で作った安心できるものがあるとして。

Gaucheのソースを一式持っているとして、そのGaucheをコンパイルするには 「その時点での最新リリース」のGaucheバイナリが必要だ。 それより古いGaucheバイナリでは、必要な機能が足りずにコンパイルできない 可能性がある。従って、

  • 現在のGaucheのコンパイルには0.8.14のバイナリが必要
  • 0.8.14のソースからのビルドには0.8.13のバイナリが必要…

という具合にどんどんリビジョンを遡ったソースが必要になってくる。 で、これが最初のリビジョンまで遡れば何とかなるかというとさにあらず。 初期のGaucheのビルドにはSTkのバイナリが必要なのだ。 STk自身のビルドにSTkが必要だったかどうかはもう覚えていないが、 もしそうだとすると、今度はSTkのリビジョンを同じように遡ってゆく 必要がある。

この信頼性検証の鎖は案外脆い。Gaucheの開発中に、うっかり一度でも

  • 手元にチェックアウトしたGaucheのソースに新機能を追加し、ビルド/インストール。
  • Gaucheのソースをその新機能を利用して書き換え、それをチェックイン

とやってしまうと、新しくチェックインされたソースをコンパイル出来るのは 私のローカルマシン中のGaucheバイナリだけということになる。 そのまま開発を続けて、新たなバージョンとしてリリースしてしまったら、 検証の鎖はそのリリースで切れてしまう。 実のところ、今までにこのミスをやらなかったという自信が無い。 一人で開発してたら気がつかないからね。

あるいは、こうやって検証の鎖をたどっていったら、今はもう手に入らない ハードウェア上で動作するソフトにつながっちゃった、っていうこともあるかもしれない。

というわけで、ソースがあれば全てわかる、っていうのはまあ間違いじゃないんだけれど、 ソフトウェアの側面だけ見ても、その命題は過去から連綿と積み上げられてきた歴史の 上に載っかってどうにか成立している、案外頼りないものなのだ。

Tags: Programming, Gauche