4.トラの尾

「はぁ〜、だめだぁ」

健は椅子の背にもたれかかって大きく背伸びをした。

「どうしたんですかぁ」

後ろに立った紀子が健の顔を上からのぞき込んでいる。

「紀ちゃんがみつけてくれた、このワームのコードを追いかけてるんだけど、コードがやたらと細分化されてて一苦労だよ。単純な逆アセンブラじゃなくて、もうちょい賢いツールがいるな、こりゃ。」

「あはは、健さん、そろそろ歳なんじゃないですか。集中力が落ち込んでません?」

「ほっとけよ!、ガキに言われたくないぞ」

「あ、ガキはないでしょ、これでも大人のお・ん・な、のつもりなんですから。」

「どこがだよ」

「パソコンヲタクにゃわからんでしょ」

「それこそ、あんたにゃ言われたくないもんだ」

紀子は言い返すかわりに口をとんがらせて、あかんべーをした。

「そりゃそうと・・・」

健が真顔にかえって聞いた。

「おたくの教授、むこうに飛んでるんだろ。何か連絡はあった?」

「うーん、それがまだ研究室にはなにも。なんでも、先生の知り合いにすごい人がいて、その人の知恵をかりるって話なんだけど。」

「すごい人ってどんな?」

「S大のコンピュータサイエンスの教授でうちの先生と大学で同期だった人みたい。詳しいことはわからないけど、セキュリティの大家らしいのね。」

「ふ〜ん、あんまり役にたつとも思えないなぁ。それより、このコードを解析した方がよっぽど早そうな気がするけど。」

健はコンピュータの画面を指でつっついて言った。

「たぶん、先生、何かに気が付いたんじゃないかと思うんだけど、誰にも話してくれてないのよね。」

「なるほど、でもまぁ、いずれにせよ・・だ。これを解析しないことには、敵さんの真意はわからないってことだから、やるしかないだろうな。」

「あ、そうそう。ちょっと不思議なことがあるんですよね。」

「え、何?」

「健さん、そのコードの感染処理の部分って見つけられました?」

「ん、今探してるところなんだけど、不思議なことに、それらしい部分が見あたらないんだよね。」

「でしょ。私もどうしても見つけられなくて・・・って言うか、そんな部分はないんじゃないかって思うんですよ。」

「え、それじゃどうやってこいつは感染するんだよ。実際にOSのコードの一部が書き換えられて、通信を仲介するようになってるのはわかってるんだぜ。」

「でも、その書き換えを行ったり、自分自身を複製する処理をどうしても見つけられないんですよね。今のOSの仕組みからすれば、メモリ上で自分を複製することは難しいから、一旦ファイルを経由するはずでしょ。実際、このプログラムを見つけられたのはそのファイルがあったからだけど、でも、その位置にファイルを作るようなコードをどうやっても見つけられなかったんですよ。」

「たしかに。俺もさんざん探したんだけどそれらしい部分はなかったな。でも、だとしたらいったい・・・」

「健さん、もしかしてまだ他にプログラムがあるんじゃないですか?。これ以外に、複製や転送を受け持つようなものが。」

「そう考えるしかないだろうな。我々が調べた時点では、そのプログラムは消えていた。おそらく、そいつはメモリ上にしか存在しないものだ。」

「ページファイルには何ものこってませんでしたよ。」

「いや、一部のプログラムはパフォーマンスを確保するために、ページファイルに書かれないこともあるんだ。実行中もそのプログラムのコードページをロックしちゃえば、そのメモリ領域はページングの対象外になっちゃうし。」

コンピュータのメモリには限界がある。最近ではギガバイトのメモリを積むPCが一般的になってはいるが、同時にアプリケーションプログラムも肥大化の一途をたどっているから、同時に実行しようとするすべてのプログラムを完全にメモリ上に読み込んでしまうことが困難な場合がでてくる。しかし、ご存じのように今のPCは同時にたくさんのアプリを起動しても、起動できなくなることはあまりない。但し、ある程度の数を立ち上げたところで、実行速度が極端に下がるのを経験した人も多いだろう。OSはメモリが足りなくなると、あまり誓われないメモリの一部をディスクにあるページファイルもしくはスワップ領域とよばれるエリアに一時的に待避させて、新しい内容を読み込む隙間を作る。一方、待避した内容が必要になると、再度、他の領域に対して同じことを行って内容を復旧し利用する。仮想記憶と呼ばれる機構によって、このようなことを行っても実行中のプログラムの整合性が保てるようになっているのだ。しかし、こうした動作が発生すると大きなオーバーヘッドが生じるため、性能は一気に低下する。こうした低下をできるだけ減らすため、プログラム起動の時点で、一旦全プログラムをページファイルに書いておき、必要に応じて読み込むオン・デマンド・ページングという方法を多くのOSが採用しており、これによりコード領域を待避させるオーバヘッドを減らす工夫が行われている。しかし、そのため、起動されたプログラムのイメージは多くの場合、ページファイルの中に記録され、次にその領域が再利用されるまでゴミとして残ってしまう。これをサルベージすれば、どのようなプログラムが実行されていたかを、ある程度掌握できるのだ。しかし、一部の極めてリアルタイム性の高いプログラムは、こうした機構によってパフォーマンスが低下することを嫌う。このため、OSはこのようなプログラムを実行る際には、直接メモリに読み込んだり、また、その領域が解放されないようにロックする機能を提供している。もし、問題のプログラムがこうした機構を利用していたとすれば、ディスク上でその痕跡を探すことは困難になるのだ。

「でも、そんなことってOSにしか出来ないですよね。」

「そう。なんらかの方法で最も高いレベルの実行権限で実行しないと不可能だな。この種の機能は実行が厳しく制限されているからね。」

「じゃ、敵はOSの中にいる・・・・でも、そんなことってありえないでしょ。他にも書き換えられてしまってる部分があるのかな。」

「OSも調べたけど、オリジナルと変わっている部分は、例のTCP/IP処理の部分だけだったよ。最初から組み込まれていれば別だが、そんなことはあり得ないし。」

「M社の陰謀だったりして?。」

「あはは、スパイ小説の読み過ぎ!。」

「いずれにせよ、もう一度、シミュレーションをやってみる必要がありそうだな。今度は、PCにエミュレータを入れて、実行状況を監視してみよう。問題のプログラムのファイルを作るためのシステムコールをトラップしておいて、その時点のメモリを見れば、そいつが絶対いるはずだろ。」

「そうですね。めんどくさそうだけど、やってみましょう。」

「じゃ、二谷さんに頼んで準備をしよう。」

健からの連絡で、二谷は快くシミュレーションルームを貸してくれた。いくつか予定が入っていたのだが、二谷は担当者を口説いて空けてくれたのだった。準備にはさほど時間はかからなかった。

「えーと、じゃ、このエミュレータ上でOSを実行すればいいんですね。これって使うの初めてなんですけど、うまく動くんですか?」

「うん、これはいわゆる仮想マシンを作るシステムなんだよね。もともとPCに入ってるOSそのものは使わずに、その上に仮想的なPC環境を作ってやる、それがこのエミュレータの仕事なんだ。一種のPCシミュレータと呼んでもいいかもしれないな。だから、このエミュレータをインストールした上で、その上に、もう一回、実際に動かすOSをインストールしなくちゃいけない。で、その上で例のプログラムを動かすんだ。」

「なるほど、でも、ちゃんと動くのかな」

「そこが不思議なところなんだけど、エミュレータ上のソフトウエアから見ると、独立したPCの上で実行されているように見えるんだよね。BIOSや各種のハードウエアだってエミュレートしちゃうから結構すごいよ、こいつは。」

「で、実際に OS のファイル操作APIをトラップして、特定のパスへのファイル書き込みを検出する設定を入れるわけだ。検出したら一時的に実行を停止して、このコンソールからメモリ上の内容を調べるって寸法さ。」

「直接調べるより、一度メモリのスナップショットを取ってから解析した方がよさそうですね。」

「さすが、わかってるじゃない。で、解析はやってくれる・・・と。」

「あ、ずる〜い、いつもそうやって面倒なことを押しつけるんだから。」

「まぁ、そういわずに。こういうことは、集中力のある若者にやってもらうのが一番だろ。」

「はいはい、健さんももお歳ですからね〜。そろそろこういうお仕事は辛いでしょ。」

「なんとでも言え!」

「じゃ、私は解析の準備をするので、テストの準備はおねがいね〜。」

「あ、・・・わかったよ、しょうがないな。俺もやるって。」

「最初からそう言えばいいのに。で、何から始める?」

紀子は笑うとコンソールの画面を軽くつっついた。

「じゃ、エミュレータを動かしてOSのインストールからだな。」

「ついでにエミュレータの使い方を考えながら、インストールをモニタしてみるってのは?」

「いいね、そうしよう。」

仕事に夢中になりだすと、のめりこんでしまう性格は、2人ともよく似ている。準備は、あっという間に整ってしまった。

「さて、じゃ準備はいいか。」

「OK。エミュレータは準備できてるわ。」

「よし、じゃ、ネットワークに繋いで、実験を開始するぞ。」

シミュレーションルームのネットワーク上には、すでに感染してしまったコンピュータが数台ある。このネットワークにエミュレータ上の仮想マシンを繋いだ瞬間に感染が発生する。感染と同時に問題のプログラムはあるファイルへの書き込みを実行するはずだ。エミュレータはその動きを監視し、書き込みが発生すると同時に一旦、仮想マシンを停止させて、すべての情報を保存するように設定されている。これで、プログラムの正体がわかるはずだ。

「あ、きたきた。健さん、これ見てください。」

「お、早速だな。狙ったとおりじゃないか。」

「ちょっと待ってくださいね、今、スナップショットを保存してますから。」

エミュレータはメモリ上のすべてのデータをディスクに保存している。なんせ、数ギガバイトのデータだから、書き込みには時間がかかる。だが、これで少なくとも現時点で発生している事象はすべて保存できる。健も紀子も、既に犯人を捕らえたも同然だと思っていた。

「OK。保存完了。」

「で、呼び出しはどこから発生してるんだ。」

「ほら、そんなに慌てないでくださいって。敵は逃げられないんだから。」

紀子は笑いながら、マウスを握るとエミュレータの画面を操作した。

「えーっと、0x843365.... あれぇ」

「どうした?」

「これって、OSの、別のモジュールの内部からですよ。」

「え、そんなはずは・・・。スタックトレースはどうなってる?」

コンピュータ上のプログラムは特定の作業を受け持つサブルーチンという部品に分かれている。サブルーチンはさらに、より単純な仕事を受け持つサブルーチンや、OSが提供する基本的な機能を呼び出して自分の仕事を完成させる。サブルーチンがどのような順序で呼び出されたかは、作業終了後に、呼び出されたサブルーチンへ順次、制御を戻すためにスタックと呼ばれるメモリ上の待避領域に書き込まれているのだ。スタックトレースとはその情報を読み出して、サブルーチンがどのような順序で呼び出されたかを調べる方法だ。

「うーん、少なくとも、残っているデータにはユーザプログラムは含まれていないみたい。」

「ということは、一連の動作はOSの仕業ってことなのか?。嘘だろ?」

二人は顔を見合わせた。その時、部屋のドアが開いて本田と二谷の二人が入ってきた。

「どうだ、何かわかったか?」

本田が聞いた。

「実は、また不思議なことが起きたんです。エミュレータの結果を見る限りでは、どう見てもOS自身が例のプログラム複製に関わってるとしか思えなくて・・・」

本田と二谷は顔を見合わせた。

「なるほど・・・。ちょっと謎が解けてきたぞ。」
二谷が言う。

「厄介なことになってきたな。こりゃ、篠原先生が帰ってきたら一度相談した方がいいかもしれない。」
と本田。

「同感だね。」

健と紀子には事情がのみこめない。

「ちょっと待ってください。いったい、何の話を・・・」
健はいぶかしげに聞いた。

「この実験は一旦中止だ。実はM社から、この件はM社が調査を引き継ぐので、当社は手を引くようにと言ってきたんだ。」

本田が言った。

「ええっ、それはどういう事なんですか?。この間の経過はすべて彼らにも細かく報告してあるんですよ。」

驚いた様子で健。

「だから・・・なんじゃないかな。」
と二谷。

「つまり、我々が、彼らにとっては面白くない領域に踏み込みつつある、ということなんだろう。」

「というと?」
健は、とうてい納得が行かないという様子。

「もしかして、陰謀に我々が気づくと困る・・・とか?」
紀子が横から口をはさむ。

「茶化すなよっ、真剣に話をしてるんだから。」
健が怒った口調で言う。

「案外、お嬢さんのカンが正しかったり。でも、そこから先はうっかり立ち入らない方がよさそうな気がするが。」
二谷が言う。

「いずれにせよ、」
と本田。

「納得はいかんかもしれんが、この実験は一旦打ち切る。今後、どうするかは会社の上の方での話が必要だろう。私のカンじゃ、篠原先生は何か気づいておられたみたいだし、帰ってこられたら一度話を聞いてみようと思うが。」

「そんな。」

「とりあえず、この実験の結果は私が一旦預かろう。それからこの件、詳しいことがわかるまでは他言は無用だぞ。いいな。」

本田がいつもにない強い口調で言ったので、健も紀子も黙り込むしかなかった。

「まだ終わったわけじゃないよ。でもここから先に進むかどうかは、慎重に考えないとな。どうやら僕らはトラのしっぽを踏みかけているようだ。」

二谷が健の肩をたたいて言った。なにやらとんでもない話になってきたな、と健は思った。とりあえずは本田と二谷に任せざるを得ないのだが、割り切れない思いが残った。

5.深み・・・・ へ

目次へ