(* -*- title: "λ Abstraction"; episode: "Sophiya's Last Theorem" -*- *)

これは暫定的なページです。 将来、内容が変更される可能性があります。

(* Local Variables: *)
(* Continued-from: nil *)
(* Continued-on: nil *)
(* Version: "0.0.7" *)
(* Stability: provisional *)
(* Category: Novel *)
(* End: *)

Abstract

 冬休みの3日めの夜。しんしんと降り続ける粉雪で、 道路が粉砂糖をかけたココアケーキみたい。 イルミネーションで豪勢に飾られたクリスマスツリーのために 道路は昼間のように明るい。

 仕事で疲れた社会人や 勉強をこなした学生が、みんな、帰りの電車に乗るために 京都駅へ吸い込まれるような流れをつくっている。

 そんななか、わたしは、京都駅から離れるように、 人の流れに逆らうようにして歩いている。

 目的地は京都λ抽象学院だ。

 なぜ、ほかのだれかではなく、よりにもよってこのわたしが 冬休みの3日めに学校へ出向くのかというと、 学校のわたしの住んでいる寮に設置されたサーバに、 昨日の昼頃、何者かが不正にログインし、Facebook Searchという 検索エンジンのTCPパケットを改竄してsearch.facebook.comドメイン以下の すべてのページにマルウェアへのリンクを張ったからだ。

 でも、たしかsearch.facebook.comはGGH暗号で暗号化されていたはず。

 GGH暗号というのは、格子暗号のひとつ。 格子暗号というのは、古典的な公開鍵暗号や楕円曲線暗号よりも安全な、 耐量子計算機暗号のひとつで、耐量子計算機暗号のうちでは もっとも主流のもの。

 耐量子計算機暗号を解読しなければ、TCPパケットの改竄はできない。

 search.facebook.comのTCPパケットを改竄するなんてこと、可能なのだろうか。

 ともあれ、京都λ抽象学院のルータを通して通信していたたくさんの 〈マシン〉がそのマルウェアに感染したことは事実としてあるらしく、 今日の午後それが発覚して、まず最初に疑われたのが、その 寮に住んでいる、わたしと、ソフィーヤと、真鳥の3人だったわけだ。

 耐量子計算機暗号で暗号化されたsearch.facebook.comが改竄された ということは、犯人は耐量子計算機暗号を解読してしまうほどの 技術力を持った人物ということになる。

 わたしと、ソフィーヤと、真鳥のうちで、そんなことが できる技術力を持っているとすればソフィーヤだけだ——彼女は 天才だ——けど、ソフィーヤはわたしの親友だし、 そんな悪いことをするはずがない。

 それに、動機だってないだろうし。

 それでも、わたしたちは疑われている。 身の潔白を主張するため、わたしは、いま京都λ抽象学院へ向かっている。

Introduction

 2045年12月23日土曜日午後7時前。 今日はわたしの誕生日だというのに、 わたしは京都駅からバス停へ向かっている。

 バス停でソフィーヤが待っていた。彼女はロシア人だから 寒さには強いと思ってたけど普通に厚着をしていた。

 わたしはカーディガンのポケットに両手を突っ込み、震えながら 彼女を見上げてたずねる。

「ロシア人はこの時期でも薄着かと思ってたけど」

 ソフィーヤは表情を変えず冷静に答える。

「アリス、ロシアはシベリアじゃない……モスクワの気温は……たぶん ザールラントと変わらない」

 アリスことわたしはドイツのザールラント出身。 ソフィーヤはロシアのモスクワ出身。ふたりとも留学生。

 わたしとソフィーヤは京都府に住んでいるから待ち合わせられたけど、 真鳥は兵庫県に住んでいるから時間がかかる。

 それにしても、こんな時間に兵庫県から呼び寄せるなんて、 後藤先生も鬼畜だと思う。

 わたしはぼそっとつぶやく。

「真鳥はたいへんねぇ……ひょっとして今日は帰れないんじゃないかしら」

 ちらっとソフィーヤの顔を見ると、彼女の〈眼鏡〉には メールが表示されていた。彼女はメールを読みながら冷徹にも答える。

「寮があるから平気だと思う」

 バスが来たので、わたしとソフィーヤはバスに乗る。

 ソフィーヤは無言でなにかメールをしているみたい。

 わたしは唇を尖らせてそっぽを向いてたずねる。

「なに読んでるの」

 一緒にいるときにメールを読まれてると、 なんだか無視されてるみたいで。

 今日はわたしの誕生日だって、ほんとにわかってるのかしら。

 おめでとうの一言もなし?

 そんなわたしの気持ちも知らず、ソフィーヤは答える。

「後藤先生に質問してる……というのも……どこまで わかってるのか……掴んでおきたいから」

「サーバに侵入した犯人のこと?」

「そう……」

「ふん。悪いのは学院よ。セキュリティを怠ったのが悪いのよ」

「学院のセキュリティは……かなりしっかりしてると思うけど……」

「思う? 現在形? わたしたち、意見が合うのね、わたしも 思っていたわよ——過去形であることに注意ね!——侵入された事実はないわ、 フィクションよ! そうに違いないわ」

「……そうじゃないと思う……問題があったのは学院じゃなくて……むしろ生徒……」

「あらそう。なにか心当たりでも?」

 ソフィーヤは黙って目をうろうろさせ、うつむいてしまう。

 わたしはびっくりして思わずたずねる。

「……ほんとにあるの?」

「わたし……一昨日……サーバにログインしてた……リモートで……SSHで……」

 わたしは耳を疑う。ソフィーヤが? サーバに? ログイン? リモート で? SSHで?

 ……量子コンピュータは市販されている。だから、SSHの 基盤になっているRSA暗号はすぐに解読されてしまう。まだGGH暗号に対応 していないSSHはほとんど信用ならない、 ログインするならLANでのみ、そう授業で習ったはず。

 SSHでリモート・ログインすると、TCPセッション・ハイジャックされる 可能性がある。だから、SSHでリモート・ログインすることは 危険なので校則で禁止されてる。

 でも、リモート・ログインは便利だから、ついつい使ってしまう。 盗聴される危険性があるのもわかるけど、 きっと、わたしだけは大丈夫だろう、そんな気持ちでみんな 使ってしまうんだ。

 わたしは確認する。

「ほんとなの……?」

 ソフィーヤはうなずく。

 鳥肌が立つ。緊張する。

 つまり、その、本当に原因はソフィーヤで、 秘密鍵が解読されて、パスワードが盗まれたってこと?

 もちろん犯人は別にいるとはいえ、そんな事実が発覚したら、 ソフィーヤはどうなるか。退学? よくて停学? サーバは 処分されるかも。同じ寮のわたしたちは? どうなるかわからない。

 これから先の学校生活が破壊される。

 こわい。

 わたしは指をこねくり合わせて目を逸らし、たずねる。

「どっ、どうしてサーバにリモート・ログインしたのかしら」

「それはその……とあるファイルをサーバから〈マシン〉に コピーし忘れてたから……」

 とあるファイルがなんであるかは、たずねないほうがいいだろう。

 わたしはしどろもどろで言う。

「そう、残念、だわ……」

 バスが荒神口通りに着く。

 わたしとソフィーヤはそこで降りて、学校まで歩く。

 夜中の学校の、職員室の窓だけが光っている。

 わたしは門でインターホンを押す。

 インターホンのディスプレイに後藤先生の顔が写り、 彼女はおごそかに言う。

「いま、鍵を開けました。どうぞ入ってください」

 わたしとソフィーヤは学校のなかに入り、 職員室へ向かう。

 職員室の扉を開けると、温暖な空気が漏れ出てきて、 なかに入ると、眼鏡があっという間に曇る。

 わたしとソフィーヤは眼鏡を一度外し、結露を拭いてから 再度身に付ける。

 わたしたちは、目が悪いから眼鏡をしているわけではなくて、 この眼鏡はポケットにいれた〈マシン〉のディスプレイになっているのだ。

 また、表示できる情報は〈マシン〉のものだけではなく、 情報にアクセスさえできれば、パソコンのディスプレイのように なんでも表示できる。

 ただ、冬は暖かい部屋に入るとすぐ曇ってしまうのが難点だ。

 ところで、〈マシン〉というのは、いまの時代ならだいたい ひとりひとつは持っている、ポケットに入るくらいの小型デバイスのことだ。

 〈マシン〉にも種類はあるけど、たいていのスペックは128ビットCPUか 256ビットCPUで、メインメモリは512GB程度。マシンにはそれぞれ IPv6 によってグローバルIPアドレスが振られている。 OSはLinuxディストリビューションのいずれかであることが多い。 最近は16キュービットCPUや32キュービットCPUを積んだ〈量子マシン〉も あるらしいけど、わたしは持っていない。

 〈指輪〉で入力し、〈マシン〉が計算し、〈眼鏡〉が表示し、 〈イヤホン〉が鳴らし、〈嗅覚シール〉がにおわせてくれて、 〈味覚入れ歯〉があじあわせてくれる。

 これは、いまさら説明するまでもないような、当たり前のことだけど。

 ところで、職員室には後藤先生——わたしたちの担任——以外の先生はいない。

 わたしたちは後藤先生の机まで行く。

 後藤先生はしかめっ面で椅子に座っている。

 後藤先生がふだん通りの優しい口調で言う。

「どうぞ、空いている席はたくさんあります。お座りください」

 ソフィーヤは黙って言うとおりに座る。

 わたしはある椅子に座る前に高さを調節してから——つまり、 悔しいけど座席部分を可能な限り高くしてから——その椅子に座る。 それでもやや低過ぎる気がして悔しい。

 ソフィーヤがわたしを気遣ってくれたのか、何気なく言う。

「なんなら……わたしの膝の上に座っても……」

 わたしは顔が真っ赤になる気がした。 そういうことはその、ふたりきりのときなら嬉しいけど、 いまは後藤先生の前だし……。わたしはそっぽを向いて抗議する。

 後藤先生の〈眼鏡〉にウィンドウが表示されている。 どうやらメールしているみたいだ。

 後藤先生は左手の小指でたんと机を叩くような仕草をする。 〈指輪〉——ブレイン・マシン・インターフェイスの一種で、 指の神経への電気信号を理解し、空中でも机でもどこでも、 タップすることでクリックやダブルクリックができて、 指で空をなぞることでマウスポインタを動かせる、 マウスに代わる入力デバイス——を操作しているのだ。 その操作で、彼女は眼鏡に表示されたウィンドウを閉じ、 言う。

「真鳥さんはあと17分ほどで到着するようです。 真鳥さんが来てからまた話すことになるのは時間のムダですし、 詳しい話は彼女が到着してからにしましょう」

 ソフィーヤが即座に答える。

「賛成……です……」

 わたしは質問する。

「それまではどうします?」

「そうですね……では、いくつか出題します——今回の件にも関係のある ことです——あなたたちが授業で習ったことをしっかり身につけられているか どうか、抜き打ちテストです」

 ソフィーヤは眉ひとつ動かさないけど、わたしは心のなかで 思わず(ヒーッ)と叫んでいたし、たぶん顔にも出ていたと思うと、 恥ずかしくなる。

 後藤先生はにっこり笑う。

「答えられなくてもかまいませんよ。公式な 問題ではないし、成績には影響しませんので」

 わたしは冷や汗をかく。答えられる自信はほとんどない。

「それでは最初の問題です」と、後藤先生が切り出すけど、 「あっと、えっと、その前に……前提を共有しましょう。 一昨日——12月21日、冬休み初日ですね——、ソフィーヤさんは、 自宅からSSHで件のサーバにリモート・ログインした。 これは本人の証言です。これはあとで真鳥さんにも話すつもりですが、 アリスさんは、この事実をご存知ですか?」

「はい、道中、ソフィーヤから聞きました」

「ここから出題。まず、SSHはリモート・サーバと 安全に通信をするためのプロトコルです。 SSHにおける通信の安全は、公開鍵暗号と 共通鍵暗号という暗号技術によって担保されています。 ここで、共通鍵暗号とはどのような暗号技術か、 簡潔に答えなさい」

 選択問題じゃない! 選択なら消去法とかいろいろ 解き方の定石があるのに。こういう問題は苦手だ。

 そう思っていると、ソフィーヤがすらすらと答える。

「共通鍵暗号は……サーバとクライアントで……同じ鍵を使って暗号化をする 方式です……。共通鍵では……同じ鍵で暗号化したものを…… 同じ鍵で復号します……。 鍵は……あらかじめサーバとクライアントに同じものを用意しておくか…… 通信する直前に一度だけつくって共有するなどの方法で用意されます。 そして……同じ鍵を用意したうえで……その鍵で暗号化したデータを送信し…… 受信したデータをその鍵で復号するようにして……通信の安全を担保します……」

「よろしい。この方式では、鍵が漏れず、アルゴリズムに脆弱性がない かぎりは、基本的に絶対安全と言えます。ところが、共通鍵暗号には、ひとつ 重大な問題があります。それはなんでしょう」

 これはわかる! わたしは手をあげて元気よく答える。

「はいはい! わたしが答えます。共通鍵暗号は、鍵で暗号化したデータは 安全に通信できますが、鍵そのものをどうやって通信するのかという問題が あります」

「正解。つまり、もし攻撃者に 鍵の通信そのものが盗聴されてしまった場合、ほかの通信も攻撃者に 復号されてしまうということですね。ところで、 この問題をきれいとは言えないまでも現実的に解決する方法が公開鍵暗号です。 共通鍵暗号が、鍵をひとつしか用意しないのに対して、 公開鍵暗号は、鍵のペアを用意します。その鍵をそれぞれなんと言うでしょうか」

 これもわかる。わたしは続けて答える。

「公開鍵と、秘密鍵です」

「正解。ところで、この鍵のペアにはある性質があります。ここで、

  1. 公開鍵で暗号化したものは、どの鍵で復号できるでしょうか。
  2. 秘密鍵で暗号化したものは、どの鍵で復号できるでしょうか」

 ちょっとばかにされてるのかとも思うくらい簡単な問題。 わたしは答える。

「公開鍵で暗号化したものは、秘密鍵で復号できます。 秘密鍵で暗号化したものは、公開鍵で復号できます」

 ソフィーヤが落ち着いて付け加える。

「いまの言い方だと……公開鍵で暗号化したものを復号できるのは 秘密鍵だけではないようにも聞こえるけど……実際には…… 公開鍵で暗号化したものが復号されるのは秘密鍵を使ったとき、 またそのときにかぎる……秘密鍵で暗号化したものについても 同様」

 わたしは顔を真っ赤にして抗議する。

「わっ、わかってるわよ、それくらい。言わなくてもわかるでしょ」

 ソフィーヤは細い目でわたしを見て言う。

「事例は……ちゃんと列挙しないと……勘違いする人が……いるかも」

 後藤先生が続ける。

「次の問題。共通鍵暗号では、鍵の送受信が盗聴者に知られると、 通信が復号される可能性がありました。ところで、公開鍵暗号は 鍵の送受信はするものの、鍵が盗聴者に知られても、 通信は復号されない仕組みになっています。それは、 どのような仕組みか。簡潔に答えなさい」

 そんなの、わからない。

 わたしが目をまわしていると、ソフィーヤが答える。

「“公開鍵で暗号化したものを復号できるのは、秘密鍵だけ”という性質を 利用します……。サーバとクライアントで……それぞれ公開鍵と秘密鍵のペアを ひとつずつ生成し……公開鍵だけを交換します——このとき、 公開鍵は攻撃者に盗聴される危険性があるけど、 秘密鍵は攻撃者に盗聴される危険性はないということに注意して ください——ここで……データを公開鍵で暗号化して送信すれば…… “公開鍵で暗号化したものを復号できるのは、秘密鍵だけ”なのですから…… 攻撃者は秘密鍵を知らないのですから……安全というわけです」

「正しい。次の問題。ところで、SSHは安全にリモート・サーバと通信する ためのプロトコルです。SSHでサーバとクライアントが通信するとき、 SSHは、

などをして、通信の安全性を保証してくれます。 サーバとクライアントは、それぞれ公開鍵と秘密鍵のペアを 生成して、かつ、あらかじめ公開鍵は交換しておいたものと して——この公開鍵の交換は盗聴されても問題はありません——SSHが おこなう手順は、簡単には、

  1. クライアントは、ホスト公開鍵で、ランダムなデータを暗号化してサーバに 送信し、
  2. サーバは、そのデータをホスト秘密鍵で復号してクライアントに送り返し、
  3. クライアントは、送り返されたデータと、送ったはずのデータが一致するか 確かめて——公開鍵で暗号化したものを復号できるのは秘密鍵の所有者だけ なので、一致すればサーバがハイジャックされていないと確信できるわけ です——
  4. クライアントは、共通鍵の鍵をつくり、それをホスト公開鍵で暗号化して サーバに送信し——この鍵は、やはり公開鍵で暗号化されているので、秘密鍵の 所有者しか復号できず、通信は安全です——
  5. サーバは、クライアント公開鍵で、ランダムなデータを暗号化して クライアントに送信し、
  6. クライアントは、そのデータをクライアント秘密鍵で復号して サーバに送り返し、
  7. サーバは、送り返されたデータと、送ったはずのデータが一致するか 確かめて——公開鍵で暗号化したものを復号できるのは秘密鍵の所有者だけ なので、一致すればクライアントがハイジャックされていないと 確信できるわけです——
  8. 晴れてクライアント認証とサーバ認証が完了したので、 手順4でつくった共通鍵の鍵で通信を暗号化する

という手順を踏むのですが——すいません、簡単にはと言いつつ、 ややこしく、複雑でした——要は、公開鍵暗号で鍵を暗号化して交換し、 その鍵で通信を暗号化することで安全に通信します。 これを前提として、いくつか出題します。 まず、このとき、公開鍵暗号としては、たいていRSA暗号が使われます。 ここで、RSA暗号はどのような公開鍵暗号か、簡潔に答えなさい」

 ソフィーヤがまるで教科書を暗記しているかのようにすらすらと答える。

「RSA暗号は……代表的な公開鍵暗号で…… 素数と素数を掛け合わせて合成数を求めるのは簡単だけど…… 合成数を素因数分解して素数と素数を求めることは難しいことを 根拠としています……たとえば、2048ビット長のRSA暗号を素因数分解で 解読するには……3×1020年の時間が必要とも言われていました…… 無条件安全性はありませんが……計算量的安全性はあるというやつです……」

「正しい。もっとも、その時間は古典コンピュータの進化とともに 短くなっていきます。 ところで、無条件安全性と計算量的安全性とはなにか。簡潔に説明せよ」

 これはわかる。わたしは説明する。

「無条件安全性というのは、解読が不可能という意味です。 鍵の長さが送信するデータと同じかそれ以上の長さであれば、 無条件に安全です。計算量的安全性とは、解読は可能だけど、 古典コンピュータでは解読するのに非現実的なほど長い時間がかかる ことです。同じアルゴリズムでも、単純に鍵の長さを長くすることで、 計算量的に安全になる可能性があります」

「そう。20年から30年前の古典コンピュータの時代では、 RSA暗号はとても頑丈な、計算量的に安全な暗号でした。 ところが、RSA暗号の脅威となる技術が現れました。つまり、 ある技術を使うと、RSA暗号の鍵をいくら長くしようとほぼ定数時間で 解読してしまう技術が現れました。それはなにか」

 わたしは授業で習った記憶を引っ掻き回す。 たしか、量子コンピュータでショアのアルゴリズムがなんとかとか……。

 そうこう考えているうちに、ソフィーヤが答えてしまう。

「……量子コンピュータ」

「そう。量子コンピュータで、あるアルゴリズムを走らせると、 素因数分解を高速に——たとえば2048ビット長のRSA暗号を ものの数秒で——処理できます。そのアルゴリズムとはなにか」

 わたしは即答する。

「ショアのアルゴリズム」

「そう。するとどうなったか。 RSA暗号は安全とは言えなくなって しまいました。 なぜなら、もともと RSA 暗号が安全な根拠は、 大きな整数の素因数分解に 3×1020年かかるからであって、 暗号化が絶対不可能というわけではなかったのに、 それがものの数秒で解けるようになってしまったからです。 ところで、RSA暗号は、SSHの根幹となる暗号です。 当然、SSHも、この影響を受けます。SSHのどの手順がこの 影響を受けるのか答えなさい」

 ソフィーヤがつまらなそうに答える。

「……ユーザの認証と……サーバの認証と……共通鍵の暗号化の部分です…… 2048ビットのRSA暗号が主流なので——それが ssh-keygen でつくられる 鍵のデフォルトの形式だからです——それらの部分が、もはや 安全ではないというか、危険です……」

「正しい。では、どのように影響を受けるのか答えなさい」

 ソフィーヤが続けて答える。

「たとえば……まず……攻撃者はホストの公開鍵を入手 します……どうやってホストの公開鍵を入手するのかというと…… ssh コマンドでホストにアクセスすれば簡単に入手できます…… それから……量子コンピュータでホストの公開鍵からホストの秘密鍵を 計算します……数分もあれば終わるはずです……秘密鍵がわかれば通信の一部が 解読できるようになるので……たとえば、SSHでリモート・ログインするときは、 手順の一部にホストの公開鍵で共通鍵の鍵を暗号化するものがありますが…… このホストの公開鍵で暗号化された共通鍵をホストの秘密鍵で解読することで…… 暗号化されたパケットをすべて解読できるようになるので…… TCPセッション・ハイジャックができます……」

 TCPセッション・ハイジャック。あるTCPのセッションになりすます パケットを横から送信することで、そのTCPセッションを奪ってしまうこと。

 SSHによるリモート・ログインもTCPセッションのひとつだ。

 リモート・ログイン中のTCPセッションをハイジャックする。

 すると、攻撃者はログイン中のセッションを横取りして、 サーバにログインできてしまう。

 それにしても、ソフィーヤはやっぱりすごい。

 理解度が違う。

 わたしが答えられない質問にも、すぐさま答えてしまう。

 ソフィーヤは大人しいけど、すっごく頭がいいってことを再確認した。

 後藤先生はいかめしい顔つきで続ける。声はふんわりしているんだけど、 顔はこわい。

「よろしい。ふたりとも、SSHでリモート・ログインすることがいかに 危険なのかよくわかっているようですね」

 そのとき、職員室にごーんごーんと鐘の音が鳴る。

 インターホンの音。

 こんな時間に来客は来ない。

 どうやら真鳥が到着したみたいだ。

 後藤先生が席を立ち、受話器をとって言う。

「いま、鍵を開けました。どうぞ入ってください」

 廊下から真鳥が入ってくる。彼女は一気に曇る眼鏡を 外すよりも先に、大きく頭を下げて叫ぶ。

「遅れてごめんなさい! お待たせしました!」

 それから彼女は眼鏡を外し、結露を拭き取りながら、 ふらふらと歩いてくる。

 彼女は目がとても悪く、その眼鏡には度が入っている。

 眼鏡を外すと、そのぱっちりしたまつげがよく目立つ。

 危なっかしい歩き方。

 途中、彼女は腰を机にぶつけて、よろめく。

 腰に届きそうなストレートの黒髪がゆらゆら揺れる。

 彼女は眼鏡をつけながら席に座る。

 わたしは真鳥に挨拶する。

「こんばんは、真鳥」

 真鳥は目をうろうろさせながら答える。

「こんばんは……」

 わたしはいきなりジョークを思いついたので言う。

「良い知らせと悪い知らせがあるわ。どっちから聞きたい?」

 真鳥が指で耳を撫でながらたずねてくる。

「良い知らせから?」

「わたしたちのつくったサーバはなんの問題もなく、すべて正常に動作しているわ」

「じゃあ、悪い知らせって?」

「22番ポートもきちんと動いてたってことかしら」

 22番ポートというのは、sshサーバが普通使うポートのこと。

 真鳥の顔が青ざめる。彼女は耳たぶをいじりながら質問してくる。

「ポートは開放していなかったはず」

 そう。 sshサーバを動かすなら LAN 内でだけ。そう授業で習った。

 sshサーバを WAN 、つまりインターネットに向けて公開したいときは、 ポートを開放する必要がある。

 普通は、危険なのでしない。

 でも、だれかがそれをしてしまった。

 わたしは髪をかきあげて、平静を装いつつ言う。

「それが開放されていたのよ、どういうわけかね」

 そして、それはたぶん、ソフィーヤがやったこと。

 でも、どうして。

 ソフィーヤなら、危険とわかっていたはず。

 なら、なぜ?

 わたしたちの会話に割り込むように、後藤先生がせきをする。

「こほん。みんな集まりましたね。それでは、これから、みんなに集まってもらった 理由を説明します。夜も遅いのでさっさと進めましょう。 質問などがあればいつでもしてください」

 わたしたちは姿勢を正して聞く。

「まず、状況のまとめから入りましょう。 今日の昼頃、何者かがあなたたち3人のサーバに侵入して、 ある本校のルータにログインし、TCPパケットを改竄して Facebook Searchのすべてのページにマルウェアへの リンクを張りました。なお、このことは今日の午後ある生徒の報告により 発覚しました。ここまではいいですね」

 ネットワークはルーティングという仕組みによって 成り立っている。ルーティングとは、TCPパケットの通り道のことで、 通常、複数のルータをたくさん繋げたもの。 TCPパケットというのは、ウェブサイトなどの情報を小さな単位に 分割したもの。 TCPパケットはルータからルータへ、バケツリレーのように転送される。 もし、その途中のルータがひとつでも偽のデータを転送して しまったら? 最終的に届くのは改竄されてしまったページ。つまり、 そのルータが偽のページを転送したことで、 そのルータを通して通信している〈マシン〉がアクセスするページが 改竄されてしまったということ。

 ソフィーヤが質問する。

「その……マルウェアとはいったいなんでしょう……いえ 一般的な単語の意味ではなく……定冠詞をつけた意味で……」

 後藤先生は答える。

「それが、なんなのかまだよくわかっていないのが現状です。 なにしろ、今日の午後発覚したわけですから」

「なるほど……解析は……可能なのでしょうか……」

「もちろん可能でしょうが、現在、Facebook Searchに該当のリンクは存在せず、 マルウェアの入手さえも困難な状況にあります。感染した〈マシン〉を 調査すればなにかわかると思いますが、なにしろ冬休みでしかも 夜も遅いので関係ない人を働かせるのは後ろめたいものがありまして」

 ていうか、わたしたちはいいのか。まあ関係あると言えばあるけど。

 真鳥が質問する。

「あの、TCPパケットの改竄って、そんなに簡単にできるんですか?」

 後藤先生が答える。

「非常に難しいと思われます。わたしも、専門外なのでよく わからないんですが……Facebook SearchはGGH暗号で暗号化されていますが、 これはRSA暗号などと違って量子コンピュータでも解読できないはずなので、 現在の技術では、理論上不可能なはずです」

 そう。Facebook SearchはGGH暗号で暗号化されている。 そして、現在、GGH暗号を解読できる方法は存在しない……はず。

 でも、事実できてしまったのだから、その認識は改めないといけない。

「Facebook Searchはみなさん知ってのとおり世界有数のトラフィックを 誇る検索サイトです。犯人の目的は、おそらく大量のトラフィックが 集まる場所でマルウェアを配布することで間違ってダウンロード、 インストール、そして実行してしまった人の〈マシン〉を汚染すること だと考えられます」

 それはわかる。というか、それ以外に考えられないだろう。あくまで確認。

 後藤先生は続ける。

「これが現在わかっていることです。そして、今日あなたたちを 呼んだ理由は、ふたつあります。ひとつは、あなたたちの潔白を証明する ためにすこし質問させてもらうこと。ふたつめは、件のサーバを検査して もらうことです」

 わたしは質問する。

「検査とは、具体的には」

「まず第一に、sshサーバを停止などして、 更なる被害を抑えること。これはわかりますね」

 ソフィーヤが申し訳なさそうに答える。

「はい……」

「第二に、ログなど、犯人に繋がる手がかりがないか 調べること。第三に——これはオプショナルとして、可能なら——ログなどの手がかり から犯人を突き止めること」

 真鳥が目を丸くして聞き返す。

「犯人を、わたしたちが捕まえるんですか⁉」

「できなければ諦めてもいいです。でも、それができれば、 学院およびソフィーヤさんをはじめあなたたちの名誉が回復します。 その功績を、わたしは正式に学校に報告します。 できなければ……やはり、この事件を、わたしは正式に学校に報告します。 そのあとどういう処分がなされるかは、もはや、 わたしの手には負えません」

 わたしはぞくりとする。後藤先生が言っているのは、警告だ。 つまり、なんらかの処分を受けたくなければ、犯人を突き止めてみせろと 言っているのだ。

 後藤先生がおそろしげに言う。

「冬休みが明けるまでは、報告を保留しておきます。 1月7日、日曜日、冬休みの最後の日、 わたしはことの経緯とすべての結果を学校に 報告します。今日、とりあえずsshサーバが停止したことを 確認したら、あとは、わたしは関与しません。 わたしは、選択するために必要な知識をきちんと開示したつもりです。 あとは、あなたたち次第です」

 わたしたち次第。処分を回避できるかどうかは、 わたしたちの行動次第。

 わたしは迷う。今回の件で、いちばん悪い処分を受けるのは、 たぶんソフィーヤ、わたしの親友だ。もし、問題を真鳥が起こしたというのなら、 わたしは自業自得だと言って、今日はさっさと帰っていただろう。 でも、問題を起こしたのはソフィーヤだ。もし、わたしがソフィーヤと 無関係な第三者で、この事件をニュースかなにかで知っていたとすれば、 わたしはソフィーヤの自業自得だと言っていただろう。でも、あろうことか、 焦点は大好きな親友に合っているのだ。

 わたしは、ソフィーヤの助けになってあげたい。

 彼女がどう考えてどういう選択をしたのだとしても、それを 支えてあげたい。

 わたしは決意する。

 わたしは立ち上がって、前にどんと踏み出し、叫ぶ。

「ソフィーヤ、真鳥、わたしについてきなさい! こんな事件を起こした 不埒ものを突き止めるのよ」

 ソフィーヤが静かに答える。

「わたしはいいけど……真鳥は……」

 わたしは真鳥をぎらりと睨みつける。

 真鳥はびっくりして素っ頓狂な声をあげる。

「もっ、もちろんっ、わたしも付き合いますよ」

「付、き、合、う?」

「いっ、いえ……言葉を間違えました。後学のために参加させていただきます!」

「よろしい」

 真鳥は耳をいじりながらたずねてくる。

「でも、今日は、その、もう帰らないと……終電が……」

「泊まればいいじゃない、寮があるんだから」

「はっ、はい……」

 こうして、わたしたちはサーバを検査し、 メンテし、犯人の痕跡を調査し、また犯人を突き止めるために、 冬休みのあいだ、寮に泊まり込むことになったのだ。

Methods

First

 2045年12月23日土曜日の午後8時。夜中の学校の廊下は、 吐いた息が白くなる程度に冷え込んでいて、暖房が効いていて暖かい 職員室からでた直後、温度差でわたしは思わず内股になり、足をかくかくさせた。

 こんな時間にわたしたちを呼び出しておいて、後藤先生は 職員室に残って、わたしと、ソフィーヤと、真鳥にサーバを調査させる。 ちなみに、ちょっと考えればわかることだけど、なぜインターネットが 全盛のこのこの時代に、リモートでサーバを管理するのではなくわざわざ 学校まで出向いて管理するのかというと、管理するために SSHでリモート・ログインするのは現状危険なので、物理サーバまで 出向いてLANから管理する方が安全だからだ。

 わたしが廊下を先導するように歩き、それにソフィーヤと真鳥が 並んで続く。

 わたしは両肩を両手で抱くようにして寒さを堪え、 ふとソフィーヤにたずねる。

「ソフィーヤ、モスクワと京都、どっちのほうが寒い?」

 ソフィーヤは小さな声で答える。

「体感では……京都の方が……寒いかも」

 真鳥が意外そうに声をあげる。

「ロシアって、日本より寒いのかと思ってました」

 ソフィーヤが答える。

「気温で測ると……モスクワのほうが寒いと思うけど……というのも……モスクワでは、 雪はもうちょっと降るのと……道路は凍る……でも……京都は廊下に暖房がないから…… 屋内なのに寒い……」

 わたしはそういえばと思って言う。

「日本の家ってセントラル・ヒーティングがないわよね」

 真鳥がたずねてくる。

「セントラル・ヒーティング?」

「まあ、調べてみて」

 それから職員室のある校舎を離れて学生寮へ。

 わたしたちの部屋に戻り、電灯をつける。

 真鳥が部屋を見渡し、感嘆する。

「久しぶり。3日しか離れてないのに、なんだか、 ついに戻ってきたって感じ」

 わたしは言う。

「とりあえず、わたしがキーボード使うから、ふたりは見ててね」

 わたしはさっそく机に座り、静電容量方式タッチ キーボードを起動する。

 3人で来たけど、この部屋にキーボードはひとつしかないので、 実際のところ、サーバをメンテできるのはひとりだけ。

 それから、左手の小指にはめた〈指輪〉を 小指の指の腹で、〈眼鏡〉の右の蝶番を右手の人差し指と 親指で、それぞれ抑えて、2秒間待つ。これは、〈指輪〉や〈眼鏡〉の接続する 先を別の端末に変更するときにする操作だ。2秒後、眼鏡に物理サーバ上で 動作する仮想マシンで動くOSの上で動く ブラウザ上で動く端末エミュレータが表示される。 試しに〈指輪〉を動かすと、端末エミュレータ上でマウスポインタが動く。 いま、わたしの〈指輪〉と〈眼鏡〉がサーバに接続された。

 ソフィーヤと真鳥も、〈眼鏡〉と〈指輪〉をサーバに接続して、わたしの 操作する端末を表示する。

 3人の〈指輪〉のポインタが、サーバ上で共有されて、わたしの〈眼鏡〉に 表示される。このように、ディスプレイとポインタは共有できるけど、 キーボードがひとつしかないので、実際に作業できるのはわたし ひとりだ。

 したがって、ふたりはわたしの作業に注目して、必要なら アドバイスをしてくれるような形になる。

 見られてると、ちょっと恥ずかしい。

 わたしも、ソフィーヤほどではないにしろ、工学の分野に進路をとる女子だ。 サーバのログがどこに保管されているのかくらいはわかる。

 まず、わたしはルータにログインし、ポート・フォワードの設定を変更して、 SSHによるリモート・ログインをできなくする。ポートが開きっぱなしだと、 またいつリモート・ログインされるか、わからない。

 そのあとsshサーバのログを確認する。sshサーバには、確かに 一昨日から何度かログイン履歴があった。12月21日の昼頃のログイン履歴の グローバルIPアドレスは、たしかにわたしの電話帳に登録したソフィーヤの ものと一致していて、つまりこの履歴はソフィーヤのものらしかった。

 そのあと、ソフィーヤは何度かログインしなおしている。 でも、彼女のグローバルIPアドレスは、きっかり一昨日の分だけだ。

 それから、昨日、つまり12月22日の昼頃から、何者かの ログイン履歴があった。IPアドレスはIPv4だ。いまだIPv4を 使ってる人がいるのか……。IPv4からでは、たとえこのIPアドレスが本人の ものであるとしても、個人の特定は不可能だろう。そして、おそらく このIPアドレスは踏み台と呼ばれるものであり、このIPアドレスを 調べることは、労力の無駄だとわたしは考える。

 また、そのIPv4アドレスは、ソフィーヤのアカウントを使っている。 つまり、ソフィーヤの秘密鍵が盗まれているということだ。

 さすがにルートまでは盗られていない。ルートをとれなかったから、 不届きものはログを消すことはできなかったみたいだ。

 今日のログイン履歴はないようだ。

 わたしはみんなに伝える。

「どうやら、ソフィーヤの秘密鍵を使って何者か がソフィーヤの〈マシン〉以外の端末からログインしたことは、 まちがいないみたいね」

 真鳥が質問してくる。

「でも、犯人は、どうやってソフィーヤさんの秘密鍵を盗んだのでしょう」

 ソフィーヤがか細い声で答える。

「たぶん……最初のTCPセッション・ハイジャックで……犯人はサーバにログインした。 それから ~/.ssh/authorized_keys というファイルをコピーした…… これには、わたしの公開鍵が登録されている。そして、そのファイルを量子 コンピュータで並列素因数分解し、公開鍵から秘密鍵を計算…… このようにして、盗人は、わたしの〈マシン〉に直接侵入することなく…… わたしの〈マシン〉にしかないはずの秘密鍵を盗んだのだと思う……」

 真鳥がきょどきょどと言う。

「ということは、不届きものはTCPセッション・ハイジャックをしたはずですね。 ルータにハイジャックの痕跡がないか調べましょう」

 わたしは聞き返す。

「TCPパケットのログを調べるということ?」

「そうです」

「そんな……たしかにわたしたちのサーバのトラフィックは 大したものじゃないけど——悲しいことにね!——でも、 人力でできる量だと思う?」

「ACKパケットだけをフィルタすれば……」

 ソフィーヤが静かに言う。

「やってみてできなければ……諦めればいい……やってみずに諦めるのは……早計」

 たしかにそうだ。わたしは答える。

「わかったわ」

 調べようとしているのは、TCPセッション・ハイジャックの痕跡だ。

 TCPセッション・ハイジャックをする方法はいくつかあるけど、 TCPにおいて代表的なものは、TCPシーケンス番号予測攻撃と呼ばれる方法だ。

 TCPセッションは、TCPパケットというものを送受信する。 TCPパケットにはいくつか種類があるけど、そのすべては 送信元のIPアドレスとシーケンス番号を保持している。

 パケットは、通信するデータを小さな単位に分割したものだけど、 そのすべてが正しく通信できるとは限らない。たとえば、 順番が入れ替わって届いたり、途中で情報が欠落することもあり得る。

 そこで、TCPパケットは、シーケンス番号というものを、メタ情報として 持っている。シーケンス番号は、ある整数であり、 TCPセッションが確立したときに適当な番号が振られ、そのあとは前の TCPパケットのシーケンス番号に1を足した整数が振られる。

 受信側は、TCPパケットを受け取ったあと、シーケンス番号でソートする。 また、もしシーケンス番号が飛んでいたら、 途中でパケットが失われてしまったということなので、 送信側に再送依頼を送る。

 また、シーケンス番号が不正なパケットはすべて無視される。

 ところで、パケットに送信元のIPアドレスがくっついているけど、 じつは、これは簡単に詐称できてしまうのだ。このIPアドレスが正しいか どうか確かめるすべは、受信側にはなく、送られてきたデータを そのまま信用するしかない。

 これらの事実を組み合わせると、面白い攻撃ができる。 それがTCPシーケンス番号予測攻撃と呼ばれるものだ。

 まず、IPアドレスは簡単に詐称できることに注意して。

 それから、プロミスキャス・モードやARPキャッシュポイズニングなどの 方法でネットワークをスニッフィングし、TCPパケットの シーケンス番号を調べる。

 ここで、攻撃者は、正規のデータ送信者が、あるシーケンス番号の TCPパケットを送る前に、そのシーケンス番号を予測し、 そのシーケンス番号のTCPパケットを送信する。

 すると、受信者は、攻撃者のTCPパケットを受信した時点で、 それが本物だと思い込んでシーケンス番号をインクリメントする。 正規のデータ送信者の送ったはずのTCPパケットは、 不正なシーケンス番号なので、無視される。

 このようにして、攻撃者は、不正なデータを本物だと思い込ませて 送信することができる。

 通信というのは、パケットの送受信のことであるから、 不正なデータを送信できてしまえば、もはや、そのTCPセッションは、 乗っ取れたも同然だ。

 でも、そのためには、攻撃者は、TCPセッションを乗っ取るために、 偽のTCPパケットを送信する必要がある。

 つまり、おそらくは、その偽のTCPパケットが、ログに残っている はずなのだ。

 でも、どのパケットが偽のTCPパケットであるかを判別するのは、 難しい。

 ただ、よく使われるものはある。

 それは、ACKパケットと呼ばれるものだ。

 TCPパケットの種類には、次のようなものがある。

  1. FINパケット
  2. SYNパケット
  3. RSTパケット
  4. PSHパケット
  5. ACKパケット
  6. URGパケット

 このうちで、ACKパケットというものを使って、 TCPセッション・ハイジャックをするのが、普通だ。

 そして、これらの種類は、TCPフラグというもので分別できる。 そして、それはログに記録しているはず。

 TCPフラグは、ただの整数で、TCPフラグが

  1. 1——2進数で000001——ならFINパケット、
  2. 2——000010——ならSYNパケット、
  3. 4——000100——ならRSTパケット、
  4. 8——001000——ならPSHパケット、
  5. 16——010000——ならACKパケット、
  6. 32——100000——ならURGパケット

というようになっている。

 フラグの整数値はでたらめではなく、2進数にしたときの 何桁めを1にするかどうかというようにして決まっている。

 これらのうちで、ACKパケットが、TCPシーケンス番号予測攻撃に よく使われるパケットだ。

 つまり、TCPフラグ16であるようなパケットに絞り込んで検索すれば、 見つかる可能性があるということ。

 わたしは、ACKパケットだけをフィルタして検索する。

 でも、TCPパケットのログは大量にある。

 いくらわたしたちのサーバのトラフィックが少ないと言っても、 半端な量ではない。

 でも、検索条件によっては可能性はある。 一昨日の昼頃のACKパケットにかぎれば、それほど多くはない。

 それから2時間ほど黙々と探す。 ソフィーヤと真鳥は暇になってしまったからか、 わたしを放ってベッドに横になりながら本を読んでいる。 何度かソフィーヤや真鳥と交代した。3人で力を合わせて何万行も ログを流し読み続けたとき、怪しいパケットを見つけた。

 同じシーケンス番号のACKパケットが、何度も繰り返し 送られてきている。

 そして、そのほとんどは無視されていて、なおかつ、 途中で一度だけ正常に処理されている。

 明らかにシーケンス番号予測攻撃の痕跡だ。

 真鳥が嬉しそうに言う。

「見つかりましたね」

「そうね。でもIPアドレスは詐称されたものよ」

「犯人を突き止める情報源にはならないけど、これは、 おそらくハイジャックされたという予測ではなく、 確実にハイジャックされたという証拠になります。 これは、ソフィーヤさんが犯人なのではなくて ただ利用されただけなのだという証拠ですよ」

 ソフィーヤが犯人ではない証拠。

 そう、じつは、いままでみんな口にはしなかったけど、 その証拠はなかった。

 そもそも、いままでの情報では、次のような可能性もあったのだ。

 つまり、ソフィーヤが事件を起こした、という可能性が。

 そもそも、情報を簡単に整理すれば、

  1. わたしたちのサーバに何者かがログインし、Facebook Searchを改竄し、
  2. 一昨日、ソフィーヤはサーバにログインした

という事実があった。もし、第三者がこれを聞いたら、 犯人はソフィーヤなのだと考えてると思う。でも、わたしたちは、 そうであってはほしくないという思いから、ソフィーヤは真っ当な理由で ログインし、それを不届きものがハイジャックしたことで事件が起こった と考えた。

 ハイジャックされたということは、つじつまを合わせるために 必要な予想にすぎなかった。

 でも、いまは違う。その予想が、ログによって肯定された。 つまり、ソフィーヤがハイジャックされたというのは、 予想ではなく、事実なのだ。

 それが確信できただけでも、この2時間探したことはむだではなかったと 思う。

 それが終わったのが午後10時。さすがにみんなくたくただった。

 キーボードを叩くのも疲れてきたので、 わたしは真鳥にキーボードを交代する。

 真鳥が、そのほかに、サーバになにか手がかりが残っていないか調べる。

 真鳥がわたしたちにたずねてくる。

「冬休みに入ってから、みんな、ソフィーヤさん以外は、サーバにログインしてい ませんよね?」

 わたしはうなずく。リモート・ログインは禁止されている以上、 冬休みにログインするはずがない。

 真鳥はソフィーヤにたずねる。

「ソフィーヤさんは、サーバ上でなにかファイルを消除しました?」

 ソフィーヤは首を振る。

「なにも……消してないはず」

「おっけー。つまり、冬休みに入った12月21日の昼よりあとに 消除されたファイルは、すべて侵入者が消除したものだと言えますよね」

 わたしは理解して先に言う。

「復元するのね、消除されたファイルを」

「そう。 rm コマンドは、ディスクからファイルを消すわけではなくて、 ファイルへのポインタを消すだけ。すなわち、そのポインタを見つけだせば ファイルを復元できる。もちろん、その場所に新たなデータが書き込まれたり、 0で埋められたりしたら消えてしまうけど。運がよければ、侵入者が消したファイルが 復元できるはず」

 ソフィーヤが言う。

「侵入者が消したファイルには……なにか証拠が残っている可能性があるという ことね」

 わたしはほめる。

「真鳥、あったまいい!」

 真鳥は extundelete コマンドを実行する。 わたしは、もし大量に消除されていたら時間が かかるし、ひょっとしたら寝れなくなるなるんじゃないかなんて 思ったけど、そんなことはなかった。 大した量は消除されていなかったらしく、 コマンドは数秒で完了した。

 ディレクトリに消除されたファイルがすべて復元される。 わたしは期待を感じて思わずつぶやく。

「これが消除されたファイルの一覧ね」

 怪しいファイルがないか、真鳥が探す。 すると、なにやら怪しいファイルが発見される。

 シェルスクリプト。そのファイルを開いてみると、どうやら犯人が 犯行の際に使ったらしいコマンドや関数が記されている。

 その内容を見たとき、みんな、かなり犯人に近づいたと確信した。 というのも、変数にIPアドレスが記述されており、その IPアドレスからマルウェアをダウンロードするらしいコードが 書かれていた。このIPアドレスをたどれば、犯人に近づける可能性がある。

 どうやら、このシェルスクリプトは、 起動されると、そのIPアドレスからマルウェアをダウンロードし、わたしたちの サーバでホスティングしたうえで、バックグラウンドで常駐し、 起動されているあいだずっとFacebook Searchを改竄し、 マルウェアへのリンクを忍ばせ、また、1日ほど経った頃に自動的に プロセスを終了してこのシェルスクリプト自体や関連するファイルを すべて消除するという一連の処理を担っているようだ。

 でも、犯人はちょっと間抜けで、 rm したファイルが即座に消えるわけでは ないということを知らなかったみたいだ。

 わたしは真鳥に命令する。

「ちょっとそのIPアドレスにpingを打ってみてくれないかしら」

 ソフィーヤが口を挟む。

「こちらが調査しているとあちらに知られたら……対策される 可能性がある……ここは一度先生に報告すべきでは……」

 真鳥が反論する。

「でも、わたしたちはすでに侵入されているんですよ。 もし、pingを打っただけで調査していることがばれるほど セキュリティを講じているのなら、こちらのサーバであらかじめ 監視プログラムを走らせておくと思います——たとえば、 だれかがログインしたら所定のサーバにpingを打つようなプログラムを——だから、 その懸念はむだだと思います」

 ソフィーヤがちょっと考えてうなずく。

「たしかに……あなたは正しい」

 わたしは許可を下す。

「わたしが許可するわ。そのIPアドレスを調べましょう」

 真鳥は ping コマンドをその IPアドレスに向かって打つ。

 すると、レスポンスが帰ってくる。

 この IPアドレスは、生きている。

 つまり、犯人へ繋がっている可能性がある。

 わたしは命令する。

「シェルスクリプトのリンクに書かれたマルウェアをダウンロードしましょう。 サンプルとして保存しておいて、あとで仮想環境で検証するのよ」

 真鳥が wget コマンドでマルウェアをダウンロードする。

 リンクは生きてた。マルウェアがダウンロードされて保存される。

 ダウンロードしただけでは危険はない。危険なのは、それを実行してしまった とき。

 真鳥が楽しそうに言う。彼女は、犯人を捕まえるということ 以前に、この事件を楽しんでいるみたいだ。

「whois してみましょう」

 whois というのは、 IPアドレスの所有者を調べるコマンド。

 とはいえ、データベースに登録されていなければわからないし、 そもそも偽装されていることも多い。

 真鳥が whois で IPアドレスを調べる。

 コンソールに No match と表示される。

 どうやらデータベースに登録されていないらしい。

 ソフィーヤがなぜか安心したように胸を撫で下ろして言う。

「残念……」

 シェルスクリプトから得られる手がかりも、もうないようだし。

 マルウェアは放っておいても消えはしない。 それを調査するのは、後回しでもよさそうだ。

 わたしは提案する。

「そのIPアドレスをポート・スキャンしてみましょう。もしかしたら 穴が空いてるかも」

 ポート・スキャンというのは、待ち受け状態にあり、コネクション確立 要求を受け付けているポートを見つけ出すための方法。

 ポート・スキャンで見つけたポートは、開放されている。

 開放されているポートは、うまくすれば乗っ取ることができる 可能性がある。それができれば、こちらからそのIPアドレスにログインし、 さらに調査できる可能性が。

 ソフィーヤが静かに言う。

「するなら……ハーフ・オープン・スキャンを……」

 ハーフ・オープン・スキャンというのは、 ステルス型のポート・スキャンのことで、 TCPコネクションを確立せずにポート・スキャンできるので、 TCPコネクションを記録するツールではログに残らないなどの 特徴がある。

 真鳥が目をうろうろさせる。

「でも、わたし、C言語書けませんよ」

 ハーフ・オープン・スキャンをするのには、専用のプログラムを 書く必要があるのだけど、それを書くのにC言語を使う必要があり、 真鳥は書けないらしいのだ。

 というのも、わたしたち3人はみんな、Standard MLまたはその方言を使い、 C言語のようなプログラミング言語にはうとい。

 ソフィーヤが冷静に言う。

「C言語をどう使うのか知らないけど……ちゃんとハーフ・オープン・スキャンしない と……telnetとかでスキャンしてもいいけど……DoS攻撃と間違われて——もっとも、 ポート・スキャンはほとんどDoS攻撃だし——フィルタされるかも」

 正直、わたしもC言語をうまく使える自信はない。

 できるとすれば、ソフィーヤだけだ。

 わたしはソフィーヤにお願いする。

「ソフィーヤ、あなたは7つの言語を使えるでしょう。C言語も、たぶん できるのよね? プログラミングしてみてくれないかしら」

 ソフィーヤはむすっとした顔をすると、 黙って真鳥の隣りまで行き、キーボードを交代する。

 ソフィーヤは小さな声で言う。

「C言語を書く必要はない……というのも……nmapを使えばいいから」

 真鳥がきょとんとして質問する。

「nmap?」

「そういう……ポート・スキャンをするソフトウェアがある……知らないのも…… 無理はないと思うけど」

 正直、わたしもハーフ・オープン・スキャンというのをどうやるのか 知らなくて、真鳥がそう言ったからてっきりC言語で書く必要があるのかと 思ったけど、ソフィーヤによれば専用のツールがあるみたい。

 ソフィーヤが nmap を使用してポート・スキャンを実施する。

 ポート・スキャンに時間がかかる。端末がのろのろと更新される。

 これは、nmapが遅いのではなくて、たぶんサーバが遅いのだろう。

 わたしはいらいらしてつぶやく。

「やけに遅いサーバね……」

 しばらくしてポート・スキャンが完了する。

 なんと、22番ポートや80番ポートが空いていた。

 つまり、SSHやHTTPがむき出しの状態になっているということだ。

 わたしは大声で言う。

「22番ポートが空いてる! SSHが提供されているということよ。 うまくやれば、ログインできるかもしれないわ」

 HTTPはともかく、この時代にSSHは危険だ。

 逆に言うと、これはチャンスでもある。

 うまく暗号を解読すれば、SSHで犯人のサーバにログインできる可能性がある。

 真鳥が興奮しながら言う。彼女はたいへん楽しそうだ。

「犯人にされたことを、今度はこっちが仕返す版ですね! サーバが稼働して いて、SSHが動いているということは、きっと、近いうちに 犯人はSSHでそのサーバにリモート・ログインしますよ——そうでないと、 ポートを開放している意味がありませんよ——そうですよ。 そうにちがいありません! こちらもプログラムを常駐させて、 TCPセッション・ハイジャックを試みましょう」

 なるほど。たしかに、それは良い手かもしれない。

 ソフィーヤが計画の問題を指摘する。

「でも、そのためには、公開鍵から秘密鍵を計算できる量子コンピュータが 必要……というのも……わたしたちのサーバは256ビットCPUと16TBメモリを 備えているけど……このスペックの古典コンピュータだと何億年かかるか……」

 わたしは疑問を口にする。

「でも、わたしたちのサーバにも量子プロセッサはついてるでしょ?」

「あるけど……コア数やクロック数が足りないと思う」

「でも試してみればできるかも」

「べつに試してもいいけど……わたしは……たぶんできないと思う……あと…… そもそもの問題として……TCPセッション・ハイジャックするプログラム、 書ける、ふたりとも……?」

 真鳥はぶんぶん顔を横に振る。わたしも首を振る。

 真鳥が質問する。

「じゃあ、どうすれば?」

「地道に……さっきダウンロードしたマルウェアの検証をするのが確実だと 思う……」

 たしかに、それが確実だ。わたしは結論を下す。

「じゃあ、そうしましょう」

 時計を見ると、あと15分もすれば12時を回る時間になっていた。

 真鳥が急に目をうっとりとさせ、目をこすって言う。

「今日は……さすかに、もう眠いですね。 仮想環境の構築とマルウェアの検証には、時間がかかるでしょうし、 もう寝ましょう」

 わたしは答える。

「そうね」

 ソフィーヤも答える。

「賛成」

 わたしたちは、今日は寝ることにして、ベッドに潜り込む。

 わたしとソフィーヤは、まだ終電に間に合う可能性もあるけど、 真鳥はほとんど間に合わない。真鳥だけ置いてきぼりにするのも かわいそうだし、3人でひとつのベッドに入る。

 わたしの背が小さいので、わたしが真ん中で、ソフィーヤと真鳥が わたしを囲む。

 ベッドはレースのカーテンで装飾されている。

 枕元のスクリーンを触ると、静電気が発生して電気が消える。

 月が明るく、電気を消しても、お互いの顔がくっきり見えた。

 わたしたちは目を閉じて眠ろうと試みる。

 だれかひとりでも夜更かししてるとつい釣られて みんな夜更かししてしまうので、一緒に寝るときは、 物音を建てないようにする。

 しんと静まり返る。

 そろそろ15分くらい経ったかな。

 12時は過ぎたかも。

 でも、わたしはなんだか眠れなくて、目を開ける。

 わたしの目の前にソフィーヤの背中が現れる。

 ちょっと大きめのパジャマを着ているからか、 はだけて肩が見える。

 透き通った白い肌。

 暗い場所だと、その白さがさらに際立って、青白くも見えた。

 きれいな肌だ。

 わたしはちょっとどきりとしてしまう。

 それから、わたしはその肩がふるふると震えるように動いていることに 気づく。

 彼女の顔のあたりが、ぼんやりと明るい。

 どうやらディスプレイがついていて、彼女はなにか見ているみたいだ。

 起きてる。

 わたしは声をかける。

「ソフィーヤ、起きてるの……?」

 ソフィーヤは細い声で答える。

「うん……」

「なにしてるの?」

「ちょっと……論文を……書いてる……」

「論文?」

「うん……今度……投稿するんだけど……“あること”について……」

 わたしは興味を持ってたずねる。

 親友のことなら、なんだって知りたい。

「“あること”って?」

「それは……」ソフィーヤは身を翻し、くるりとこちらを向く。彼女は 真鳥をちょっと見てから言う。「うん……真鳥は寝てるみたいだし……アリスになら ……言ってもいいかも……」

「教えて。興味ある」

「GGH暗号——格子暗号のひとつ——について。GGH暗号というのは……噛み砕いて 説明すると……格子というのは、n個のm次元ベクトル——ただし、nはm以下——の整数結合の 集合のことで……nがじゅうぶんに大きいと……格子の最短ベクトル問題がNP困難に なることを根拠としている暗号で……」

「ちょっと待って」

「うん」

 わたしは一度深呼吸する。

「続けて」

「……まあ……つまり……その格子の最短ベクトル問題を量子コンピュータで解く アルゴリズムを、わたしは見つけたんだけど……」

「なるほど」

 わかってないけど。わたしは復唱して確認する。

「つまりその、ソフィーヤはGGH暗号を解読できちゃったわけね?」

 と、自分で言ってことの重大さを理解する。

 GGH暗号というのは、たしかFacebook Searchの暗号化にも使われていた 暗号だ。

 そして、今日の午後、そのFacebook Searchの暗号が解読されてページが 改竄された。

 このことから考えられるのって、つまり、ひょっとして……。

 わたしは考えたくないことを考えてしまって、頭をぶんぶん振って振り払う。

 忘れよう。

 たとえそうだったとしても、なにか理由があってのことだろう。

 それに、偶然かもしれない。

 それに、もしそうだとして、わたしが黙っていれば、問題は起こらないはず。

 そう、きっとそうだ。

 わたしはソフィーヤに言う。

「おやすみ、今日は寝るね」

 そう言って、わたしは彼女に背中を向ける。

 忘れよう。

 そう思って目をつむろうとしたとき、眼鏡にメールの着信が通知される。

 わたしはメールの差出人を見て、ぎょっとする。

 真鳥からだ。

 わたしは困惑する。わたしの目の前で寝ているはずの真鳥から、 どうしてメールが。

 そう思った直後、大量のメールが通知される。

 いろんな友達から同じタイトルのメールが何通も届く。

 2通や3通ではなく、2桁、そして3桁だ。

 明らかにただ事ではない。

 わたしは胸をどきどきさせながらメールを開く。

“わたしは格子の最短ベクトル問題を量子コンピュータで O(log n) で解くアルゴリズムを発明した. その証拠として, 2045年12月22日の昼, GGH暗号で暗号化された Facebook Search というウェブサイトのTCPパケットを改竄し, 2014年12月24日午前零時をもって, このメールを一斉送信するソフトウェアを, 同サイトから散布した. 図 1.1 は, 改竄された同サイトの スクリーンショットである. わたしの目的は, アルゴリズムの存在と, その危険性を世界に知らせることである. なお, アルゴリズムの詳細については, 現在まとめているところで, 匿名で, 近日公開予定である. 乞うご期待.”

Latter

 翌朝目覚めると、通知がたいへんなことになっていた。 たった1日で2500件のメールが届いたらしく、受信ボックスがそれで 埋まっていたのだ。

 真鳥も同じ状況になっているらしく、ベッドに横になったまま 律儀に1通ずつ既読としてマークしながら、彼女は狼狽した。

「2500件もスパムが送られてきてますよ……なにがあったんでしょう」

 わたしはベッドにぺたんと座って、毛布を着込むように肩にかけた まま、早朝の刺すような寒さで震えながら叫んだ。

「例の件に決まってるでしょ」

「例の件って?」

「マルウェアよ——Facebook Searchで配布されてたね!——そんなことも 想像つかないの?」

「でも、証拠がないですよ。ぜんぜんべつの件かも」

 ソフィーヤは、昨日夜遅くまで起きていたらしく、まだ可愛らしい寝息を立てて 眠っている。

 わたしは寒くてぶるぶる震えながら言う。

「考えてみれば、わたしたちは、マルウェアがいったいどんな プログラムなのか、ぜんぜん知らないのよ。犯人は、きっと、この マルウェアでなにか遠大な計画を実行しているのにちがいないわ」

 今日の午前零時、最初に送られてきたメールは、なにか 宣言のような内容だった。 GGH暗号を解読できるアルゴリズムを発明した から……とか。

 そのあと、メールは、わたしたちが眠っているあいだにも、 きっかり1時間おきに3桁通送られてきた。量は時間が経つごとに増え、 最初は100通ほどだったのが、現在では一度に500通ほど送られてくる。 現在、平均して1時間に300通ほど送られてきていることになり、 午前8時半現在、計2500件も溜まっていることになる。

 ところで、そのメールはすべて電話帳に登録していたはずの 知り合いのメールアドレスから送られてきている。 つまり、おそらくは、マルウェアに感染した 端末のアドレスを使い、その端末の電話帳を調べて、 送信してきているのだろうと思われる。

 知り合いのアドレスだから、アドレスでフィルタするわけにもいかない。

 タイトルなどの情報も重複がないようにハッシュ値のようなものになっている。

 テキストに至っては、なんと文字コードではなく画像データで エンコードされており、しかもメール1通1通でフォントが違ったり文字幅や 文字間隔が違ったり微妙に傾いていたりしている。

 どうにも機械的にスパムを判定するのは、なかなか難しそうだ。

 内容は午前1時以降はすべて同じで、次のようなものだ。

“これはスパムメールである. あなたは, おそらく, 何百何千と送られてくるこのスパムメールに, うんざりしているであろう. ところが, 幸運なことに, このスパムメールを受信しない方法がある. そうする方法は, 非常に簡単であり, 次のソフトウェアをインストールすれば よろしい. ただし, お使いのOSに注意してください. というのも, 間違ったバイナリをインストールしても, 効果はありません.”

 この文章のあとに、 Linux版、Windows版、Mac版、Android版、 iOS版、Firefox OS版、Windows Phone版、Chrome OS版など、さまざまな プラットフォーム用のバイナリへのリンク画像が列挙してある。

 いま8時半だから、また30分もすれば500件の通知が来るはずだ。

 メールのデスクトップ通知はオフにしてあるとはいえ、 これではメールのチェックがほぼできず、非常に迷惑だ。

 あとで、ソフィーヤが起きてきたら、問いただそうと思ってる。

 この事件の犯人は、たぶんソフィーヤだ。

 証拠はないとはいえ、彼女の発言と、犯人からのメールを比べれば、 じゅうぶん確信できる。

 彼女もGGH暗号を解読したと言っていたし、犯人もそう言ってる。

 おそらく同一人物であると考えるのは、自然なことだと思う。

 でも、ソフィーヤが犯人と考えるのは、状況証拠に過ぎない。

 ほとんど同時に世界の異なる場所で2人が同じような発見をすることは、 シンクロニシティといって、歴史的に見るとよくあることだ。

 もしかしたら、ソフィーヤの発見は、犯人とのシンクロニシティかもしれない。

 まだ、判断できない。

 犯人に繋がる手がかりをもっと集めることができれば、判断ができる かもしれない。

 ソフィーヤはとくに休日は、起きるのが遅い。

 一緒に暮らしてたから、わかる。

 すくなくとも、あと5時間くらいは起きないと思う。

 それまでに、わたしと真鳥だけでもできることはあるはずだ。

 わたしは言う。

「まずは、マルウェアの解析ね。あのマルウェアを仮想環境で走らせてみましょう」

 真鳥は答える。

「そうですね」

 わたしと真鳥は、ベッドから出て、サーバの方へ行く。

 サーバは180コアの256ビットCPUで、 16TBのメモリもある。

 ちなみにサーバの値段は、わたしたちが 買ったわけじゃなくて学校の備品だけど、2年前の相場で言えば、 およそ30万円。今年の相場だとたぶん15万円くらい。

 現在の〈マシン〉の動作に必要な最低限のスペックは、オクタルコアの 128ビットCPU、64GBのメモリだというのが通説だ。

 オクタルコアは8コアのことだから、単純に計算すると、 このサーバのすべての資源を使えば、20つくらいの 仮想〈マシン〉を走らせることができる。

 残りの20コアは、OSやもろもろのプロセスを走らせるのに割り当てた ほうが、無難だろう。

 わたしと真鳥は、サーバに20つの仮想〈マシン〉を用意する。

 それぞれの仮想〈マシン〉にダミーの電話帳とメールアドレスを 登録する。

 マルウェアの解析は主に逆アセンブルなどの方法でソースコードを 検証する静的解析と、安全なサンドボックスの環境で マルウェアを実際に実行してみて動作を観察する動的解析に わかれる。

 わたしたちがいましようとしているのは、動的解析のほうだ。

 仮想〈マシン〉で動的解析ツールを起動する。

 ただマルウェアを実行しても、ディスプレイには表示されない 裏の挙動は見えない。たとえば、秘密裏にファイルをダウンロードしていたり、 サーバへデータを送信していたり、奇妙なAPIを叩いていたりだとかいった ことは、動的解析ツールを使って解析する。

 わたしたちは、まず、結果がどうなるか、仮説を立てる。

 この実験で、なにを明らかにしたいのか。

 わたしは真鳥に言う。

「まずは、本当にこのマルウェアをインストールすると メールを送るのか、確かめましょう。メールが大量に 送られてきたのは、ほんとうはぜんぜんべつの事件という可能性もあるわ」

「そうですね、それがいいと思います」

 わたしは続ける。

「わたしは、このマルウェアをインストールすると、本当に その〈マシン〉はメールを送るようになると思うわ。 つまり、わたしの仮説は“マルウェアをインストールした〈マシン〉は、電話帳を ヒントにして、メールを送る”ということよ。これが 確かめられたとき、大量のメールはこのマルウェアが原因だと 言えるでしょう」

 そこで、わたしたちは、

  1. マルウェアをインストールした仮想〈マシン〉を1つ用意し、
  2. マルウェアをインストールしていない仮想〈マシン〉を1つ用意し、
  3. マルウェアをインストールした仮想〈マシン〉の電話帳に マルウェアをインストールしていない仮想〈マシン〉の アドレスを登録して、

30分待った。

 すると、9時ちょうど、思ったとおり、 マルウェアをインストールした仮想〈マシン〉から、 インストールしていない仮想〈マシン〉へ、 電話帳に登録したメールアドレスにメールが飛んでいた。

 わたしは嬉しくて叫ぶ。

「思ったとおりね! やっぱり、この大量のメールはあのマルウェアが原因 なのよ」

「そうみたいですね!」

 やはり、思ったとおり、マルウェアをインストールした〈マシン〉が、 その〈マシン〉の電話帳をヒントに、メールを送るようだ。

 つまり、このマルウェアは、バックグラウンドに常駐して、 このメールを送り続けるマルウェアなのだ。

 メールの送信は、マルウェアをインストールしないと発生しない。 一方で、メールの受信は、マルウェアをインストールしていなくても、 メールアドレスがだれかの電話帳に登録されているだけで、 発生する。

 わたしのように、マルウェアをインストールしなくても、 知り合いから無期限にメールを受信し続けるわけだ。

「ところで」とわたしは批判的に真鳥を見つめる。「昨日、あなたからも スパムメール、飛んできたんだけど」

 真鳥はぎくりとする。

「あはは……じつは、電車でここに来るとき、間違って実行しちゃいまして…… なにも起こらなかったから……大丈夫かなって、思ってたんですけど……」

「このドアホ! 大丈夫なわけないでしょうに! いますぐ〈マシン〉の /etc/inittab を調べて、再起動しなさい!」

「はい……」

 ところで、そのマルウェアの送ってくるメールはおかしなものだ。

 そのメールの受信を停止したいなら、リンク先のソフトウェアを インストールすればよいのだという。

 本当に停止するのだろうか。

 その前に、そのアドレスが手がかりになる可能性がある。

 試しに、仮想〈マシン〉で受信したメールに張られているリンクのアドレスを 調べてみる。

 でも、手がかりにはならなそうだった。

 というのも、このリンクは、ウェブページへの リンクではなく、Data URI Schemeというスキームであり、 URL自体にプログラムが埋め込まれているからだ。

 それも、メール1通1通ごとに微妙にプログラムが異なっている。 単純なコピーではなく、プログラム自体の意味は変えずに変更することで、 機械的なチェックを切り抜けるようになっている。

 わたしは次の問題を提起する。

「ところで、メールに張られているリンク先のプログラムも問題よね。 犯人はこれでいったいなにをしようとしているのか」

「まずは、実際の状況に近い仮想環境をつくって、 実行してみましょうよ」

 わたしたちは、このプログラムをインストールすることで、 本当にメールが止まるのか、実験することにした。

 真鳥が考えを述べる。

「それにしても、メールを送るマルウェアを配布して、そのメールで メールを止めるプログラムを配布するなんて、妙な人ですよね」

「たしかに、そうね」

「わたしは、メールを止めることができるというのは、 事実だとしても真の目的ではなく、なにか裏の目的のための カモフラージュだと思います」

「わたしも、そう考えていたところよ。 メールを止めることのできるプログラムだというのは偽りよ。 これをインストールしても、きっと、メールは止まらないわ。 このメールは、たぶん、マルウェアのさらなる拡散を目的にしているのよ」

 マルウェアに感染した〈マシン〉は、メールをたくさん 送る。マルウェアに感染していなくても、メールを受信してしまう。 もし、メールを止めるプログラムだというのが偽りで、 そのメールからリンクされたプログラムは、実際には マルウェアを拡散するものだったら、 どうなるだろう。

 世の中の大半は、リテラシーが低い人たちだ。 わたしの感覚では、こんなメールが送られてきても、 インストールはしない。一目見て危険だと判断し、無視する。

 でも、世間の大半の人は、そういう思考をしない。 文言をすっかり信用して、メールを止めるために インストールしてしまう。

 そういうリテラシーの低い層を狙って、大量のメールを 人海戦術的にばらまけば、ほとんどは失敗するにしろ、かなりの 量の人が釣れる。

 スパムメールは、そういう原理になっている。

 したがって、もし、メールを止めるプログラムが、 実際にはマルウェアの拡散を狙っているのだとすれば、 時間を追うごとに、徐々に世界中に広まることになる。

 6次の隔たり。知り合いを6回たどれば世界中のどんな 人にも辿り着く。

 この仮説を支持するなら、6時間もすれば、メールは 世界中に広まっている。

 日本語では拡散力に限界がありそうだけど、言語設定を 調べて英文メールを送るようなことは、できるはず。

 午前1時からすでに6時間以上経っている。

 たぶん、問題は、すでに京都λ抽象学院や、 京都だけでは済まない。

 近畿全体か、あるいは本州、ひょっとすると、日本全体に 波及している可能性がある。

 わたしは冷や汗をかいてつぶやく。

「……なんか、すっごくやばい気がしてきた」

 真鳥が仮説を立てる。

「きっと、このメールに書かれたプログラムをインストールしても、 メールは止まりませんよ。むしろ、インストールすることで、 メールを送るようになってしまうはずです」

「わたしも同意見」

 そこで、わたしたちは、まず、さっきと違う環境を用意した。 さっきの実験が、今回の実験に影響してしまっては、まずいからだ。 わたしたちは、

  1. マルウェアをインストールした仮想〈マシン〉を1つ用意し、
  2. マルウェアをインストールしていない仮想〈マシン〉を2つ用意し、
  3. それぞれを電話帳に登録し合って、

まず、1時間待った。

 マルウェアをインストールした仮想〈マシン〉から、 2つのマルウェアをインストールしていない仮想〈マシン〉へ、 メールが送られた。

 わたしたちは、2つのうち、一方の マルウェアをインストールしていない仮想〈マシン〉で、 そのリンクからメールを止めると銘打ったプログラムをダウンロードし、 それをインストールした。

 他方のマルウェアをインストールしていない仮想〈マシン〉では、 プログラムをインストール しなかった

 そして、待つ。

 日がのぼってきて、部屋がぽかぽかと暖かくなってくる。

 真鳥がうなだれて言う。

「わたし、このメールが短い間隔で何度も送られるのではなくて、 1時間おきに送信されるのがなぜなのか考えていたんですけど、 その理由がわかりました……調査する人を、こうして待たせるためです」

「なるほど……」

 1時間経った。

 午前11時だ。

 確認してみると、 マルウェアをインストールした仮想〈マシン〉から、 マルウェアをインストールしていないけど、メールを止めてくれるらしい プログラムはインストールした仮想〈マシン〉へ、 メールは 送られていなかった

 マルウェアをインストールした仮想〈マシン〉から、 マルウェアをインストールしていないし、メールを止めてくれるらしい プログラムもインストールしていない仮想〈マシン〉へ、 メールは 送られていた

 マルウェアをインストールしていないけど、メールを止めてくれるらしい プログラムはインストールした仮想〈マシン〉から、 ほかの2台へは、メールが 送られていた

 マルウェアをインストールしていないし、メールを止めてくれるらしい プログラムもインストールしていない仮想〈マシン〉から、 ほかの2台へは、メールは 送られていなかった

 真鳥が悔しそうに言う。

「どうやら、メールを止めてくれるらしいというのは、本当みたいですね」

 わたしは指摘する。

「でも、メールは止まる代わりに、やはり電話帳に登録されているアドレスへ メールを送信するようになってしまうようよ」

 これで、メールで送信されてくるプログラムがなにをするのかがわかった。

 どうやらメールに張られたリンクのプログラムを実行すると、 メールの宛先の対象から外してくれるらしい。実行すれば、ひとまず メールは受信しないようになるのだ。ところが、同時に、バックグラウンドで メールを送信するプログラムも動作するようになる。

 これでは、非専門家には、実際にスパムをブロックしてくれる 良質なプログラムかのように見えてしまう。

 スパムが送られてこなくなったという事実だけを見れば、実際に ブロックしてくれているのだから、取り急ぎ問題を解決するために、 ついついインストールしてみたくなる。

 現状、1時間おきに500通ものメールが送られてくる。毎回毎回通知が来ると うっとうしいので、通知をオフにせざるを得ない。その結果として、 現在メールがほぼ使えない。

 メールが使えないと困るので、わたしも、なんだか、とりあえず、 いまだけでも停止プログラムをインストールしてしのぎたくなる。 わたしからもスパムは送信されるけど、500通のうちの1通だ、 そんなに気にする人はいないだろう。

 ところで、500通ものメールの通知が来るのがうっとうしいので、 通知をオフにしていたから気づかなかったけど、どうやら この異常時に反応してメールを送ってきている友人もけっこういるらしい。 受信ボックスを開けてみると、スパムメールの上に何十通か未読 メールがたまっている。

 京都に住んでいる友人や、東京に住んでいる友人、それに、 ドイツに住んでいる友人からも異常事態を報告するメールが届いている。

 この事件は、すでにドイツまで波及しているらしい。

 というか、ドイツはUTC+2だから、現在は3時か4時くらいのはずだ。

 まあ、長期休暇に夜更かししてしまう気持ちはわかる。

 わたしはドイツにいる友人にメールでたずねる。

“メールは日本語で書かれてた? それとも英語?  ひょっとしてドイツ語で書かれてた?”

 彼女は答える。

“普通に英語だったと思うけど……”

 なるほど。どうやら日本語圏以外には英語で送信するようになっているらしい。

“1時間につき何通くらい来た?”

“んー……10件くらいかな……”

 日本よりは格段に少ない。とはいえ、事件発生から10時間足らずで すでに海外まで波及しているのだから、問題はどんどん大きくなるだろう。

“ありがと。あと、夜更かししないで早く寝なさい”

“こんなに面白い事件がリアルタイムで起きているのに寝るなんてもったいないよ”

 どうやら、彼女は事件というよりはショーのように考えているようだ。

 いくつかのブログサイトがこの事件をニュースにしていた。 ブログサイトは、どうやら事件を契機に現在のメールシステムや 〈マシン〉を批判しているようだ。いまどきブログサイトを見るなんて 老人くらいだろし、たぶん、現代のシステムを受けいれられない 層には受けのいい内容だろうと思った。

 犯人の目的は、まだ別にありそうだ。現在、大量の〈マシン〉に マルウェアがインストールされた状態にあるのは、まちがいない。 つまり、世界中の〈マシン〉が、現在犯人の手中にあるわけだ。 犯人はこのマルウェアを操作することで、なにか巨大な計画を 実行しようとしているにちがいない。

 身体中がぞわぞわ震え上がって、頭がくらくらしてくる。 問題がどんどん大きくなる。最初はちょっとしたことだったのに。

 でも、問題はわたしたちの構築したサーバから始まった。 ここで投げ出すわけにはいかない。

 わたしは心を持ち直して、この事件を必ず解決してやるぞと誓う。

 わたしは震える唇を噛みながら、冷静に真鳥に言う。

「ところで、停止プログラムをインストールすれば たしかにメールは停止するけど、技術的には、なにかのシステムがこれを 管理しているはずよ。気になるのは、そのシステムがなんなのか ということ」

 真鳥は閃いたように答える。

「そっか! たしかに、特定の宛先に送らないようにするには、 宛先を管理するサーバが必要ですね」

「そう。つまり、マルウェアはそのサーバと通信しているはずなのよ」

「それを解析すれば……犯人に繋がるかもしれませんね」

 わたしたちは、動的解析ツールを使って、パケットを監視する。

 そして、監視しながら、仮想〈マシン〉に停止プログラムをインストールする。

 インストールした瞬間、 あるIPアドレスへ向けて停止プログラムが送信する暗号化パケットを、 ツールは捉えた。

 わたしは叫ぶ。

「それよ! そのIPアドレスが停止済みアドレスを管理しているサーバだわ!」

 真鳥が興奮しながら言う。

「パケットは暗号化されているみたいです。解読してみないと、 確実なことは……暗号方式はなんでしょう?」

「さあ……ただ、暗号化するためには鍵が必要よ。鍵が見つかれば、 暗号方式もわかるし、ひょっとすれば、復号できるかもしれないわ」

「まずは、プログラムを静的解析しましょう。あるいは、 プログラムに鍵が埋め込まれてるかもしれません」

「いえ、そうじゃなくて、まずは strings コマンドで文字列が埋め込まれていないか確かめましょう」

 真鳥が strings コマンドでバイナリに埋め込まれた文字列を探す。

 すると、バイナリに鍵らしい文字列が埋め込まれていた。

 これは、明らかにRSA暗号の公開鍵だ。

 真鳥が嬉しそうに言う。

「これ、たぶんサーバの公開鍵ですよ! これがあれば、 サーバの秘密鍵も復元できますね」

「でも、それには量子コンピュータが必要だわ」

「でも、このサーバの量子プロセッサでもできるかもしれませんよ」

「それは、できないってソフィーヤが……」

 そこまで言って、もしかしたら、あの発言は嘘だったかもしれないと 考える。

 このサーバの量子プロセッサでは並列素因数分解はできない。 それは、あるいは調査を阻止するための方便かも。

 嘘だとすれば、できるかもしれないということだ。

 わたしは力強く言う。

「できるかできないか、やってみましょう」

 公開鍵から秘密鍵を求める式は、数学的には、単純だ。

 素因数分解。

 数学の苦手なわたしたちでもわかる。

 素因数分解をどう解くかというアルゴリズムはちょっと複雑になる。

 ショアのアルゴリズムを実装すればいいのだけど、 論文のアルゴリズムを自分で実装に落とし込むのは、ちょっと手間がかかる。

  ショアのアルゴリズムを、粛々と QCL という量子コンピューティング言語に 落とし込む。

 わたしや真鳥の得意とする言語は、 Standard ML なんだけど、 これは古典コンピュータの言語だ。

 聞くところによると、C言語の処理系のひとつである Clang は、 量子コンピューティングができるプラグマを提供しているらしいし、 C++の最新の規格である C++45 は、量子コンピューティングを サポートしているらしいのだけど……残念ながら、わたしたちには使えない。

 QCL は昔からある量子コンピューティング言語のひとつであり、 古典プログラミングと量子コンピューティングの両方を サポートしている。 QCL は量子コンピューティング言語として設計されたので、 無理に量子コンピューティングもできるように拡張された古典プログラミング言語で あるC言語やC++よりもシンプルな記法でプログラムを書ける。

 正直なところ、わたしも真鳥も、QCLでhello worldすら したことがないので、まずはドキュメントを読んで、 言語を理解することに時間をかける。

 でも、わたしも、たぶん真鳥も、1時間もドキュメントを読めば、 ひとまずプログラムを書けるようになるはず。

 それから午後。12時過ぎ。

 日が傾き始めて、肌寒くなってくる。

 ベッドでソフィーヤがうめいたかと思うと、 大きなあくびをかいて、のそのそと起きてくる。

 ソフィーヤが目をこすりながら言う。

「おはよう」

 真鳥が元気よく挨拶する。

「おはようございます!」

 わたしは皮肉っぽく言ってやる。

「ソフィーヤ、ずいぶんとたっぷり眠ったわね、12時間くらい?  ひょっとして13時間かしら」

 ソフィーヤはわたしの嫌味にも眉ひとつ動かさず答える。 彼女は感情の表現がへたなのだ。

「わたしは今日……健康的な睡眠時間をとったと思う……つまり……9時間くらい」

 真鳥は呆れたようすで言う。

「夜更かししてたんですか? 気持ちはわかりますけど……」

「そうでもない……というのも……いつもと同じ」

 それより、わたしはソフィーヤに聞きたいことがある。

 こんな事件を起こした、張本人なのかどうか。

 昨日の夜、彼女が言っていたこと。

 それと、昨日の夜、最初に送られてきたメールの文言は一致している。

 偶然とは思えない。

 もちろん、わたしは彼女を責めたいのではない。

 彼女のことだから、なにか理由があってのことだと思う。

 考えてのうえの選択なら、わたしは彼女がどんな道を選んだのだとしても、 その選択を尊重してあげたいと思う。

 親友だから。

 ただ、理由が知りたい。

 秘密にされているのが気に食わないのかもしれない。

 わたしは、彼女とのあいだに壁なんてものはないと、勝手に思ってる。

 だからこそ、わたしたちのあいだに秘密がつくられていたことが、 気に食わない。

 だから、その理由を話してほしい。

 なにを考えて、どういう目的をもってこういうことをしたのかを、 打ち明けてほしい。

 わたしはちょっと声のトーンを落とすようにして、真鳥に言う。

「真鳥、ちょっと、ソフィーヤと2人で話がしたいの」

 真鳥はきょとんとする。

「えっ? い、いいですけど……」

 ソフィーヤは小さな声でたずねてくる。

「どうしたの……?」

「聞きたいことがあって」

 真鳥は元気よく言う。

「あっ、公開鍵から秘密鍵を計算するプログラムは、 わたしが実装しておきますね。おふたりは、必要なだけ話してきてください!」

Results

 わたしはソフィーヤと一緒に部屋からでる。

 部屋の外の廊下は冷えきっており、まるで冷凍庫だ。 なるほど、ロシアより寒いというのもわかる。

 わたしは両手を合わせてこすりながら言う。

「まず、昨日のことから確認しましょう。一昨日、つまり 22日、わたしたちのサーバに何者かが侵入して、Facebook Searchの TCPパケットを改竄して、マルウェアをばらまいたわ」

「うん」

「わたしたちは、その事実を調査した。結論はこう。

  1. まず、ソフィーヤの TCPセッションを奪い、何者かはわたしたちのサーバに侵入した。証拠は、 TCPパケットのログ。ここで、ルートは奪えなかったらしいことに注意。
  2. サーバからauthorized_keys、つまり公開鍵を盗んだ犯人は、 その公開鍵からソフィーヤの秘密鍵を計算した。 秘密鍵があれば、サーバにリモート・ログインできるようになる。 そして、犯人はその秘密鍵でサーバにログインした。 証拠はSSHサーバのログ。
  3. そして、犯人は、サーバであるシェルスクリプトを走らせた。 そのシェルスクリプトが、マルウェアをサーバにホスティングさせ、 ルータからTCPパケットの改竄をしていた。 証拠は復元したシェルスクリプトのソースコード。
  4. そして、そのシェルスクリプトから、わたしたちはマルウェアが ホスティングされているIPアドレスを入手し、マルウェアを入手した」

「うん。それはわかってる」

「そして、今日の午前1時から、大量のスパムメールが届いているわ」

 ソフィーヤは目を逸らしながら答える。後ろめたい気持ちがあるからそういう 仕草をしたのではないだろう、彼女は目を合わせて話すのがもともと苦手なのだ。

「そう……それで?」

「このメールは、例のマルウェアが原因よ」

「本当に……? 証拠は? 偶然時期が重なった可能性もある」

「いいえ。午前中、わたしと真鳥で、昨日入手したマルウェアを調べたの。 その結果、マルウェアをインストールした〈マシン〉は、 1時間おきにメールを送信するということがわかったわ。 また、そのメールに書かれたリンクからダウンロードしたプログラムも、 同様に1時間おきにメールを送信するようになる」

「なるほど……」

「何度やっても再現できると思うわ。なんなら、ソフィーヤもやってみる?」

「いや……いい……アリスを……信用する……」

「よろしい。つまり、この大量のスパムメール事件の犯人と、Facebook Searchを改竄した犯人は同一人物よ」

「なるほど……わかりやすい」

「ところで、スパムメールのうち、面白いメールもあるわ。 今日の午前零時のメール。 GGH暗号がなんとか……これって、昨日、 寝る前にあなたがわたしに話してくれた内容とそっくり一致するわよね、 ソフィーヤ」

 ソフィーヤは即答する。

「うん」

「そんなことってあり得る? 偶然の一致の可能性もあるけど、 わたしは、そんなことはないと思う。犯人はあなたなのでしょう、ソフィーヤ?」

 ソフィーヤはちょっとの間黙って、答えを探すように考えてから、 答える。

「証拠は……ないでしょう?」

「う」

 そう。現在、犯人とソフィーヤを結びつけるものは、午前零時のメールだけ だ。いま、わたしたちのサーバをクラックした犯人=Facebook Search改竄事件の犯人=大量のスパムメール事件の犯人、ここまでは確かな 証拠を見つけている。でも、それとソフィーヤを結びつける証拠は、なにもない。

 ソフィーヤはニヤッと似合わない笑みを浮かべて言う。

「そうなるように……やったから」

 そうなるようにやった。なにを?  証拠が見つからないようにやったということ? それってつまり。

 わたしは確認する。

「あなたがやったってこと?」

 ソフィーヤは黙っている。

 ソフィーヤからしたら、ここでなにか言ったら、それが証拠として 採用される可能性もある。

 うかつなことは言えないのだろう。

 わたしは訴えるように言う。

「ソフィーヤ、わたしはあなたの味方よ。 わたしはあなたを捕まえたいと考えているわけではないのよ。 もちろん、スパムメールは迷惑だから、停止してほしいとは 思ってる。でもあなたの計画を邪魔したいわけではないの。 ただ知りたいのよ、なにを考えて、こんなことをしてるのか……」

「わたしも……アリスのことは……信用してる」

「じゃあ……」

 ソフィーヤは胸のあたりに手をあてて言う。

「アリスにだから言うけど……わたしがやった。 わたしは……“ある問題”を……匿名で提起する必要がある。 “ある問題”は、この社会にとって不都合な事実……わたしの身の安全が 保証されるとは限らない。だから、いままでだれにも言ってなかったけど…… ひとりだけの秘密にして計画を遂行するのは、思ったより つらかった……心が……胸の、内側が……ふたりだけの秘密を、共有できる 友達が欲しかった」

 ソフィーヤは、“ある問題”を提起するために、 こんなことをしているらしい。

 ソフィーヤは続ける。

「わたしは、“ある問題”を提起する必要があるのだけど、 その問題を提起するためには、トラフィックが必要…… というのも…… だれの目にも留まらない場所で提起しても、意味がないから……でも…… 普通にインターネットの文書として公開しても、トラフィックは、 思ったよりぜんぜん伸びないから…… いま……わたしは、世界中の〈マシン〉を汚染し、自由に あらゆる端末からメールを送ることのできる状態にある……つまり…… 世界中の〈マシン〉を使って、わたしは問題を提起する。 トラフィックは申し分がない……新聞や……いろんなサイトにも 掲載されるはず。通るかどうかわからない投稿論文よりも…… 確実……」

 ソフィーヤは、“ある問題”を提起するために、ここまで手の込んだことを しているらしい。

 そもそもの問題は、 ソフィーヤが、TCPセッション・ハイジャックでSSHコネクションを 奪われたことから始まっているけど、たぶん、その 奪った犯人はソフィーヤだ。ソフィーヤはたぶん、 偽装のために、自分自身をハイジャックしたのだ。 マルウェアをばらまいた問題が明るみになれば警察沙汰だけど、 SSHサーバを立てたくらいなら停学か、悪くても退学で済む。 退学と警察沙汰のどっちが悪いかは、まあ人にもよるだろうけど…… 退学のほうが死ぬより悪いと言いそうな友人には心当たりがある。

 それにしても、ソフィーヤがそこまでかけて問題にしている “ある問題”って?

 わたしは緊張してソフィーヤにたずねる。

「ソフィーヤは、なにをそんなに問題としているの?」

 ソフィーヤはつま先で円を描くように床をこする。

「その……それをアリスに話すのは、恥ずかしいというか……」

 ソフィーヤはそっぽを向いて、心なしか顔を赤らめている。

 わたしはちょっとおかしくなって、 なんだかほっとして言う。

「言っちゃいなさいよ」

「でも、寮の、廊下でというのは……寒いし……暗いし…… 汚いし……ちょっと場所を変えたい……かも……」

「じゃあ、どこがいい?」

「うーん……温かい場所……サーバルームとか」

 わたしは思わずくすくす笑う。

「サーバルームは寒いわ。温かかったら熱暴走しちゃうでしょ?」

「あっ、そっか……」

「学校の庭園に行きましょう。あそこは年中同じように草木を咲かせるために、 温度が管理されているわ」

Discussion

 わたしとソフィーヤはふたりで学院の庭園へ。

 冬でも緑色の草木が咲き続けている庭園は、 学院を幻想的に見せる。

 庭園はほとんど、というよりまったく見えないほど 透明なドーム状の壁で囲まれていて、 室内からでも青空が見え、日光が注ぎ込み、 室内は年中暖かく保たれている。

 壁はアーチ状の柱で支えられている。柱は不透明な グレーで、目に見える素材。これも透明にした方がいいんじゃないかな、 とも思うけど、この柱のおかげで壁の位置がわかるし、この柱自体も アーチ状なのでなかなかおしゃれ。

 専門ではないので詳しくは知らないけど、壁のなかに 真空な場所をつくることで、断熱し、外と中との温度差でも 結露が起こらないようになってる。

 扉も透明なので見えないんだけど、扉を縁取るようにして ガーデンアーチがある。透明な扉を開き、わたしたちは庭園に入る。

 そんな庭園の中央にある小さな屋根付きのパティオに、 わたしとソフィーヤは向かい合って座る。

 わたしは話の続きを求める。

「“ある問題”とは」

 ソフィーヤは指をいじりながら語りだす。

「将来の暗号方式の問題……」

「ふむ」

「量子コンピュータが一般的になったのは……格子暗号が実用化されるよりも ずいぶん前のこと。量子コンピュータの量産が始まると…… RSA暗号は簡単に解読できるようになった。もちろんそれ以前にもRSA暗号の 脆弱性はたびたび発見されてて——たとえば、公開鍵のグレブナー基底計算法 とか——それからしばらくして……格子暗号のひとつ…… GGH暗号が実用に堪え得る精度で復号できるようになった。 GGH暗号はむかしからある暗号だけど……ずいぶん前からその問題として 復号の精度が指摘されていて……それが実用的になったのがつい最近。 量子コンピュータはたくさんの計算を高速に処理できたけど…… それは暗号の解読も速くなるということで…… 副作用として……RSA暗号を含め、多くの暗号方式を安全ではなくした。 そんななかで……量子コンピュータにも耐えられる耐量子計算機暗号である GGH暗号は……次世代の暗号方式として期待されていた。 いや……むしろ……わたしに言わせれば、まだ現実に使える 暗号方式が残っているという安心感が」

「ちょっ、ちょっ、ちょっと待って」

「はい」

 わたしは暗号論は専門ではない。というか、わたしは得意なこと なにもないんだけど……。暗号論の言葉が怒濤に並び立てられてちょっと びっくりしてしまった。わたしは眼鏡を持ち上げて目の付け根をしばらく 押さえてから離し、言う。

「続けて」

「うん……ともかく……量子コンピュータの時代にも……まだ実用的な暗号方式は 残っていたの。GGH暗号は……Facebook Searchなど著名なサイトが導入している 方式で……いまいちばん期待されている方式」

「なるほど。それはまあ、知ってるわ、わたしでも……」

「でも……わたしは……GGH暗号をO(log n)で解読できるアルゴリズムを発見した」

 それはすごい。それだけで論文になると思う。 その事実だけ切り取ってほめてあげたい。

 ソフィーヤは続ける。

「ただ……それは主張じゃなくて……事実。 わたしの主張は……ほかに2つある」

「というと」

「ひとつ。わたしは……コンピュータのアーキテクチャが進化すれば…… あらゆる暗号方式には……それを多項式時間で 解読できるアルゴリズムが存在すると思っている。論理ゲートによる論理演算を ベースとした古典回路から量子ゲートによる量子演算をベースとした量子回路に 進化して……いくつかの暗号は安全ではなくなった……ここで、量子回路よりさらに 進化した回路が発明されるかもしれないと考えてみて……。現在存在する 耐量子計算機暗号も安全ではなくなるわ……。つまり……その…… 近い将来……どんな暗号も解読可能になるだろう……ということ」

「暗号論そのものが崩壊すると言いたいわけ?」

 ソフィーヤはうなずく。

 わたしは呆れる。

「そんなことあり得ないと、わたしは思うわ。それで、ふたつめは?」

「わたしはインターネットの仕組みそのものを考え直す必要があると 思ってる——というのも、インターネットは暗号論がないと成り立たない——わたしは 暗号論を仮定しないインターネットを〈オープンネット〉と名付ける——それは、 すべてが自由でオープンなインターネット——〈オープンネット〉には…… HTTPの仕組みをそのまま使える。ただ……認証技術は使えない。それに…… 秘匿通信もできない。“使えない”とか……“できない”といったネガティヴな 言葉より……“使えないように修正されている”とか……“できないように改善されている”と いう……ポジティヴな言葉を使ったほうがいいかもしれない。 つまり……たとえばFacebook Searchだとか…… そういう認証技術が秘匿通信を前提としたウェブサイトを……滅ぼして…… 必要ではない技術でインターネットをつくりなおす」

 〈オープンネット〉? 彼女はいきなりなにを言い出すんだ。 たしかにGGH暗号を解読したのはすごいけど、それにしても、 いきなり突飛過ぎる。

 わたしは手をひらひらさせる。

「なるほど、そういう考え方もアリだと思うわ。 小数派だと思うけどね、わたしはあなたの考えが 間違いだとか誤っているだとか言うつもりはまったくもってないわ、 親友の考えは尊重したいもの。でも、そんな主張をして、どうするの?」

「わたしは、この主張をして、賛同者を集める。 〈オープンネット〉の実現は、ひとりではできない。 仲間が必要」

 彼女の言ってることは論理の飛躍だと思う。 たしかにGGH暗号を解読した事実は称えられるべきものだと思う。 でも、そこからこんな考えに発展するか。実現可能か? インターネット をつくりなおすなんてことが。

「集まると思う? 匿名で公開するんでしょ? それに、 もし名前を出すのだとしても、実績のない学生ひとりに、 賛同者が、本当に集まると?」

 ソフィーヤは力強く言う。

「そのために……まず、わたしは事実をつくる。つまり……現代の暗号化技術が…… ほんとうは安全ではなく…… まったく危険なのだということを……世に知らしめるの。 匿名のだれかが暗号を解読して……ページを改竄した事実を…… わたしは積み重ねる。そして……その事実を世界中に公開する。 そうすれば……きっと……自然と人々は気づくと思う。 安全な暗号なんてものは幻想なんてことに……。 そういう要請が市民から集まれば……自然と、社会は、暗号技術を 必要としないようにインターネットをつくりなおすように動くはず」

 わたしは気が遠くなる思いだった。 彼女は、このことを発端にして、社会の流れを変え、 インターネットを〈オープンネット〉なるものに変えようと 考えているのだ。

 インターネットはもはや社会の根幹とも呼べるインフラだ。 そのインターネットそのものをつくりなおすというのは、 もはや、社会そのものをつくりなおすとも言える。

 これはもはや技術の問題ではなく、社会の問題だ。

 彼女は自分の考えているように社会を変えようとしているのだ。

 ソフィーヤは言う。

「〈オープンネット〉では、情報は、すべて公開されていることを前提としている。 この世界に、秘匿通信なんてものはない」

 わたしはこみかみを抱えながらたずねる。

「それで、その主張をするために、マルウェアをばらまたいの?」

「そう」

 わたしは頭が痛くなってきた。

 もちろん、わたしはその考えを否定しようとまでは思わない。

 親友の考えていることだから、できるだけ尊重してあげたい。

 でも、非現実的というか、スケールが大き過ぎるというか、 わたしの手には負えない。

 それに、インターネットをつくりなおすって、いったいどれだけの 時間がかかるというんだ。

 数年、いやもっと、数十年、ひょっとしたら、数百年はかかるかも。

 そのあいだ、ずっとスパムメールが飛んでくるのは、正直なところ、 ごめんだ。

 迷惑過ぎる。

 わたしは、わたしの結論をくだす。

「ソフィーヤ、あなたの考えはわかったわ。 あなたは、あなたの考えで行動すればいいと思う。 でも、わたしは、わたしの考えで行動するわ。 わたしは、世界中の〈マシン〉で動いている マルウェアを停止して、この問題を解決してみせる。 どうやらあなたはそうとう強い思想に囚われているみたいだから、 わたしは、あなたに訴えるのではなく、技術的に、 この問題に対処してみせるわ」

Conclusion

 わたしとソフィーヤは庭園から寮に戻る。

 真鳥が退屈そうに漫画を読んでいた。

 コミック百合姫で連載されている漫画の単行本だ。

 真鳥がわたしたちを見て、つまらなそうに言う。

「遅いですよ、ふたりとも」

 ソフィーヤが謝る。

「ごめん……つい……議論が白熱して」

 わたしが指摘する。

「白熱してたのは、あなただけじゃない」

「そう……かな……」

 真鳥が割り込む。

「そ、れ、よ、り、もっ。マルウェアに埋め込まれた公開鍵から、 秘密鍵、計算できましたよ!」

 ソフィーヤが怪訝な顔をする。

「本当?」

「はい! ソフィーヤさんは寝てたから知らないでしょうけど、 わたしたち、午前中にマルウェアに公開鍵が埋め込まれていることを 突き止めて、QCLでショアのアルゴリズムを実装して 秘密鍵を求めようとしていたんですよ」

「なるほど……」

「それから、暗号化パケットを解読することができました。 パケットはSSHと同じ手順で、共通鍵のようなものを送っていました。 その共通鍵は単純なAESの鍵で、通信をすべて復号できました」

 わたしはわくわくしてたずねる。

「で、どうだった? もしかして、TCPセッション・ハイジャックできたり しない?」

「いいえ……TCPセッション・ハイジャックをするプログラムは、 わたしには書けません」真鳥は屈託のない笑顔で言う。「諦めました!」

 わたしは思わず笑ってしまう。

「まあ、いいわ」

 わたしは付け加える。

「ところで、真鳥、犯人探しは今日でおしまいよ」

 真鳥が驚く。

「犯人、わかったんですか!?」

「いいえ」わたしは言うべきか迷う。真鳥も友達のひとりだけど、 秘密を守ってくれるかどうかはわからない。わたしは嘘を吐く。 「諦めるのよ! よく考えてみてよ。いまは、冬休みよ? 犯人のために、 わたしたちがこれ以上寮に泊まる必要があるかしら」

 真鳥はあごに指をあてて考え、答える。

「ないですね」

 ソフィーヤが付け加える。

「SSHサーバも止めたし……これ以上は……わたしたちの責任じゃない」

 わたしは指摘する。

「“わたしたち”? 複数形? 大きな主語ね、そこは“わたし”、単数 じゃないかしら、ソフィーヤ」

 ソフィーヤは思案する。

「たしかに……そうかも……」

 そこでわたしが言う。

「でも、犯人を突き止めるのは諦めるけど、マルウェアは止める 必要があるわ」

 真鳥が質問してくる。

「でも、どうやって?」

「考えてみて。メールを停止するプログラムは、あるサーバに 登録されたアドレスのリストで、停止済みかどうか管理しているのよ。 そして、停止したかどうかは、どうやら停止プログラムが起動されたとき、 メールアドレスをサーバに送ることで管理されているようだわ」

「なるほど……こちらから、偽のアドレスを送信するんですね! その サーバに!」

「そう。うまく騙すことができれば、ひとまず、偽のアドレスを送ることで、 そのアドレスへの送信を停止するようにしむけられるはずよ」

 ソフィーヤが冷静に指摘してくる。

「それは……むだ……というのも……対策済み……だから」

 真鳥が疑問を浮かべる。

「“対策済みだから”? どうしてそうわかるんですか?」

 ソフィーヤがぎくりとする。

「日本語をまちがえた……対策済み……“だろう”から」

 真鳥が納得する。

「たしかに、その可能性は高いですね」

 わたしはさり気なくたずねる。

「どうやって対策したのかしら」

 ソフィーヤは嘘を吐くのが苦手だ。

 一緒に暮らしていれば、自然とわかる。

 ソフィーヤは答える。

「秘密鍵で認証してる……つまり……秘密鍵ひとつにつき、 停止できるアドレスはひとつまで……だ ……と思うというか……わたしならそうする」

「なるほど、たしかにそれなら偽のアドレスを送るのは困難ね。 でも、そうなると、マルウェアはひとつひとつ異なる 秘密鍵を持っているということになるわね。 さらに、動的な公開鍵登録機構も必要なはず。 どうやってそれを実現しているのでしょう」

「すでに登録されている秘密鍵から……公開鍵を登録できるようにしてある ……んだと思う」

 真鳥が意見を述べる。

「すると、すでに登録されている秘密鍵からなら、 偽の公開鍵を送り込めることになりますね」

 ソフィーヤがぎくりとする。

「その可能性は……ある」

 わたしが決定する。

「その手で行きましょう。まずは、公開鍵を動的に登録する パケットを解析するのよ」

 真鳥が元気よく飛び上がる。

「了解!」

 マルウェアを仮想環境で走らせて、公開鍵を登録するパケットを 送信していないか、解析する。

 マルウェアがメールを送信すると同時に、 怪しいパケットがサーバに送られる。

 パケットを解読すると、明らかに公開鍵が。

 公開鍵の数は、メールの数とぴったり一致する。

 つまり、秘密鍵も、おそらくメールの数とぴったり 一致する数、新たに生成されているだろうということだ。

 秘密鍵は、たぶん、メールにリンクされた停止プログラムに 埋め込まれているのだろう。

 ということは、ひとつのアドレスへのメール配信を停止するには。 ひとつにつき、公開鍵と秘密鍵のペアを生成して、 このマルウェアの秘密鍵を使って署名し、サーバに送信すればいい。 そして、その秘密鍵を使ってアドレスを送信すれば、めでたく そのアドレスへのメール配信は止まる。

 わたしは言う。

「試しに、わたしのアドレスへのメール配信を停止してみるわ。 もう何時間も、何千通も、うっとうしくてしょうがないから」

 理屈に従えば、

  1. まず、マルウェアを仮想環境にインストールする。
  2. 公開鍵と秘密鍵のペアを生成して、 そのマルウェアの秘密鍵で公開鍵を署名して、 サーバに登録する。
  3. 新たに生成された秘密鍵で、わたしのアドレスを署名して、 サーバに登録する。

という手順を踏めば、わたしへのメール配信はとりあえず止まり、 さらに、わたしの〈マシン〉は、マルウェアには感染しないはずだ。

 わたしはその手順で実際にやってみる。

 それから1時間が経つ。

 ソフィーヤはコンビニへ買い物へ行くと言って部屋から出て行ってしまった。 買い物にしては帰りがずいぶん遅い。 たぶん、買い物へ行ったのではなくて、本格的な設備のある場所へ行って、 わたしに対抗しようとしているのだ。

 通知が遅いなと思っていると、実際にメールの送信は止まっていた。

 わたしは嬉しくて思わず高い声をあげる。

「やった! 成功よ」

 これでメールは送られてこないはずだ。 わたしはるんるんとした気分でメールのデスクトップ通知をオンにする。 これでちゃんとメールのチェックができる。

 真鳥は受信したメールを律儀に1通ずつ確認して言う。

「アリスさんから、メールは来ていないみたいです」

「当然よ」

 あとは、この手順を、世界中の人に適用すればいい。

 ただ、問題は、世界中の人のメールアドレスを、どうやって 探し出すかということ。

 その方法が思い浮かばない。

 わたしが爪を噛みながら考えていると、動的解析をしている 真鳥が叫んだ。

「なんだか、マルウェアをインストールした仮想環境に妙なパケットが 流れてきてます」

 わたしはいらいらしながら答える。

「妙? なにが妙なの? それはわたしの思考を邪魔するに足る ものなの?」

「暗号化されていましたけど、復号してみると、 シェルスクリプトみたいです。どうやら、これは…… マルウェアがインストールされた〈マシン〉に、 命令を送っているようです」

「命令? 遠隔操作してるってこと?」

「そうです。あるIPアドレスへ向けて〈マシン〉にpingを打たせています。 どうやら、生きている〈マシン〉を特定しているみたい」

「つまり……どういうことよ」

「どうやら、マルウェアがインストールされた〈マシン〉は、 犯人によって一斉に操作できるようになってるみたいです」

「ふん。それがいったい……」と言ったところで、思いついた。 「逆に、それが利用できないかしら。こちらから偽の 命令を送ることができれば……」

 こちらから偽の命令を送ることができれば。 任意の命令を送ることができるのだから、“マルウェアを消除せよ”という命令も 送れるはず。それができれば、一気に世界中からマルウェアを 消し去ることができる。

「それは、わたしも考えましたけど、どうやって送るんです?」

「犯人と同じやり方をとりましょう」

「というと?」

「インターネットはルーティングで成り立っているのよ。 京都の一定数の人の〈マシン〉からインターネットへの ルーティングは、この学院のルータを通すはず。 学院のルータから返信するパケットを改竄して、 マルウェアへの命令にしましょう。 そうすれば、京都のマルウェアを、このサーバから操ることができる」

「でも、それだと京都のマルウェアは操れますけど、 世界中のは、とても……」

「だから、犯人とまったく同じ手を使うのよ。 マルウェアへの命令は“京都λ抽象学院のサーバへアクセスするリンクを 掲載したメールを、電話帳に載った友人へ送ったあと、 マルウェア自体を消除する”よ」

「そっか……! このサーバからは、常に命令を送信する パケットを送り続けるんですね」

「そう。そうすれば、メールを見た人をこのサーバへ 誘導して、このサーバから命令を送ることができる。 メールを見た人からその友人へリンクも送ることで、 最終的には、世界中の人をこのサーバへ誘導し、 マルウェアを消除できるはずよ」

 ただ、それをするプログラムを組むのは、たいへんそうだ。

 難しいプログラムではないと思う。ただ時間はかかりそう。

 気づくと、もう夕暮れが見えていた。

 空は暖色を帯びている。

 これからプログラムを書くとすると、とくに兵庫に住んでいる真鳥は、 今日、帰れるかどうか怪しい。

 わたしは確認する。

「いまからやると、今日は帰れないかもね」

「そうですね」

「やる? それとも、明日にする?」

 真鳥は力強く宣言する。

「やりましょう! マルウェアを、この世界から取り除くんです」

 頼もしい。

「よしきた。でもね、真鳥、キーボードはひとつだけなのよ。 わたしがやるから、真鳥は帰ってもいいわよ」

「いいえ、それでは、プログラムがちゃんと動くか心配です」

「それってどういう意味よ」

「わたしがレビューします」

「ふん。気に入らないけど。わかったわ」

 わたしはプログラムを書く。

 久しぶりの Standard ML。

 Socket モジュールは Standard ML の Basis Library のひとつ。 オプショナルだから、実装されていない可能性もある。

 Socket モジュールの関数を使ってコードを書く。

 そうしてコードを書くこと5時間ほど経過する。

 もう午後の9時だ。

 真鳥は眠くなってしまったのか、ベッドで横になっている。

 たまに話しかけると返事が返ってくるので、寝たわけではないみたいだけど、 ぐったりしていて、漫画を読む気力もないみたいだ。

 日もすっかり落ちた頃。

 やっとプログラムが完成した。

 わたしはキーボードから飛び退いて、ベッドに大の字で飛び込んで 真鳥に言う。

「できた。レビューして」

「はい……」

 わたしは、さすがに体力の限界だ。

 真鳥は真鳥で、疲れているようだ。なにもしなくても、 ここ2日、気を張りっぱなしだったからな。

 真鳥はレビューを終えて言う。

「ちゃんと動くと思います。仮想環境でテストしてみますか?」

「いいえ、いいわ。自信は……あるわけじゃないけど、もう、 疲れたから……もしバグってたら、もう1回やってみましょう」

「了解。あ、でも、ちょっとプログラム、変えますね」

 わたしはいらっとする。信用されてないってこと? わたしは不機嫌になって 怒鳴る。

「どうしてよ」

「いいえ、ちょっとしたことです。どの程度の数マルウェアが 消除できたか、ログをとろうと思いまして」

「なるほど」 頭がうまくまわっていなかったので、わたしはあまり考えずに返答してしまう。 「それは良い案ね」

「マルウェアがうまく消除できたら、アリスさんのアドレスに メールを送るようにしました」

「良い仕事。……って、え?」

 つまり、わたしのアドレスに世界中からメールが送られてくるってこと?

「では起動しますね」

「……ちょ、ちょ、ちょっと待ったぁ!」

「えっ、もう起動しちゃいましたけど」

 すると、それから怒濤の勢いでわたしの眼鏡に通知が来る。 128通、256通、512通、1024通、2048通……どんどん増える。 通知が多過ぎて、〈指輪〉を動かしても反応がない。 フリーズした。もはやDoS攻撃だ。

 それでも止まることのない通知。通知の数は 京都の人口を軽々と越え、近畿の人口の数にまでのぼっている。

 〈マシン〉と〈眼鏡〉が熱くなってきた。なんかやばいにおいがする。 わたしは〈眼鏡〉をはずし、〈マシン〉をポケットからだして机の上に置く。 見てられない。

 わたしは真鳥を痛烈に批判する。

「そもそもログをとろうという考えがまちがいだったわ。 世界中の億レベルのトラフィックのログをとったら ディスクがたいへんなことになる」

 真鳥は申し訳なさそうに言う。

「すいません……」

「ま、プログラムが正常に動いているのがわかるから、 とりあえずよしとするわ」

 ちなみに億レベルのトラフィックでもわたしたちのサーバは 大丈夫だ……と、思う、たぶん。

 まだ帰ることのできる時間ではあった。でも、 今日はクリスマス・イヴだし、せっかくだから寮に泊まることにした。 もしかしたら、ソフィーヤが帰ってくるかもしれないし。

 それから数時間後、ソフィーヤが戻ってきた。 彼女はケーキを買って帰ってきた。

 真鳥が嬉しそうに目をきらきらさせる。

「ケーキ! そういえば、今日ってクリスマス・イヴですね」

 ソフィーヤはつぶやく。

「ちゃんと……年の数……ろうそくも買ってきた」

 真鳥がたずねる。

「今日って、だれかの誕生日なんですか?」

 ソフィーヤがわたしを指差す。

 そういえば、昨日、12月23日はわたしの誕生日だ。

 ソフィーヤが言う。

「今日じゃないけど……ついでです」

 彼女はそれを机の上におくと、不機嫌そうにベッドに横になり、 ぶっきらぼうに言う。

「負けた」

 真鳥がきょとんとする。

「負けたって、なにがです?」

 どうでもいいけど、真鳥は、ここまできて気づかないのか。 鈍感にもほどがある。いや、わたしが知ってるから そう思うだけなのか。

 ソフィーヤがわたしに言う。

「24時間もすれば……マルウェアはみんな消えると思う……実際…… どんどん応答がなくなってる……」

 わたしは勝ち誇った笑みを彼女に向ける。

「わたしの勝ちね」

「うん。わたしの負け」

 真鳥がベッドから降りて、ケーキをキッチンへ運んで、 笑顔でみんなに言う。

「事件も解決したことですし、今日はみんなで ケーキを食べましょう!」

 真鳥が鼻歌を歌いながらケーキを切り始める。

「6等分でいいですよね」

 ともあれ、こうして、ソフィーヤの起こした事件は、無事解決した。

 わたしたちはその夜、急遽クリスマスの用意をすることになり、 午後10時でもまだ空いているお店を調べて、できるだけ豪華な 飾りを寮に施した。

 冬休みなので、学生寮に、わたしたちのほかに生徒はいない。

 正真正銘、3人きりのクリスマス・イヴだ。

 月はすこし欠けていて、やや雲がかかった夜だった。

 暖房はかけていなかったけど、みんなでいると、 心なしか寮は暖かかった気がした。

 わたしたちは、午前4時頃までばか騒ぎして事件の解決を祝った。

 わたしの〈マシン〉と〈眼鏡〉は、熱暴走でいかれてしまい、 起動しなくなったので、後日修理にだすことになった。 修理費はもちろん、真鳥とソフィーヤに負担させた。

 ところで、あとで真鳥から聞かされた話がひとつだけ。

 わたしたちがマルウェアを駆逐するプログラムを書いているあいだに、 じつは、マルウェアは面白いメールを1通だけ、世界中に送信していた。

 その内容が次の文章だ。

“わたしは格子の最短ベクトル問題を量子コンピュータで O(log n) で解くアルゴリズムを発明した. そして, それを匿名で公開する予定 であったが, 残念ながら, わたしに対抗するハッカーが 本プログラムを消除するプログラムを開発中である. そのため, 前言撤回 させて頂く. というのも, アルゴリズムの詳細は, まだ文章としては まとまっておらず, 対策される前に公開することは難しい. そのため, ここは, わたしは子の最短ベクトル問題を量子コンピュータで O(log n) で解く真に驚くべきアルゴリズムを見つけたが, この納期はそれを書くには短過ぎるという ことで, ひとつ手を打っていただきたい. では, これにてさらばである. 追伸: わたしの親愛なる友人へ. お誕生日おめでとう.”

(* Local Variables: *)
(* Continued-from: nil *)
(* Continued-on: nil *)
(* Revision: "78f480c7b2b41f7e620c7fda17e25bbbabee3875" *)
(* End: *)