SF映画「トロン:レガシー」のシェル入力履歴シーンを詳しく見てみるとこうなる

映画「トロン:レガシー」の一幕に主人公が父親のコンピューターにアクセスを試みるシーンがありますが、じっくり見ると非常に興味深い点があると、PuTTYやxtermの開発者として知られる Simon Tatham氏が自身のブログで指摘していました。
Nitpicking the shell history scene in ‘Tron: Legacy’
https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/tron-legacy/

「トロン:レガシー」は2010年に公開されたSFアクション映画であり、本格的にCGを取り入れた世界初の映画といわれている「トロン」から28年ぶりに制作された続編に当たります。
トロン:レガシー Blu-ray 新価格!今すぐチェック

問題のシーンは主人公のサム・フリンが、父親のケヴィンが謎の失踪を遂げる直前に何をしていたのかを解き明かそうと、父親の書斎にあるコンピューターにいくつかのコマンドを入力する場面です。

サムがコンピューターを操作するまで画面右のターミナルウィンドウには何も入力されていない状態だったことから、ターミナルウィンドウに表示されている内容はすべてサムが入力したコマンドおよびコマンドの出力結果だということになります。以下はターミナルウィンドウの表示内容を文字起こししたもの。
$ whoami
flynn
$ uname -a
SolarOS 4.0.1 Generic_50203-02 sun4m i386
Unknown.Unknown
$ login -n root
Login incorrect
login: backdoor
No home directory specified in password file!
Logging in with home=/
# bin/history
488 cd /opt/LLL/controller/laser/
489 vi LLLSDLaserControl.c
490 make
491 make install
492 ./sanity_check
493 ./configure -o test.cfg
494 vi test.cfg
495 vi ~/last_will_and_testament.txt
496 cat /proc/meminfo
497 ps -a -x -u
498 kill -9 2207
499 kill 2208
500 ps -a -x -u
501 touch /opt/LLL/run/ok
502 LLLSDLaserControl -ok 1
# ▮
◆スクリーンショットから読み取れること
ストーリー序盤のワンシーンの一見すると何気ないスクリーンショットですが、ターミナルウィンドウ開発者のTatham氏が詳しく確認するといろいろと興味深いものが見えてきました。
・コマンド履歴
Tatham氏が最初に注目したのは、コマンド履歴を確認するためにサムが使用したコマンドが「history」ではなく「/bin/history」であることでした。コマンド履歴はシェルプロセス自体が保持するものであるため「/bin/history」といった外部コマンドで情報を得るのは困難であり、したがって「history」はシェルの組み込みコマンドである必要があります。また実際のhistoryコマンドはコマンド履歴を出力する前にhistoryコマンド自体がコマンド履歴に載るため、出力されるリストの最後にhistoryコマンドが表示されるはずです。
Tatham氏は/bin/historyコマンドについては実際のコマンドの代わりに「コマンド履歴」を出力する簡単なシェルスクリプトだったと考えており、「あたかもワイヤーアクションでうっかりワイヤーが見えてしまったようなもの」と評しています。
・コンピューターのアカウント設定
サムが初めに目にしたのはログインプロンプトではなくシェルプロンプトでした。つまり父親のケヴィン・フリンはログインしたまま失踪したということになります。サムはログインアカウントを確認するためにまず「whoami」コマンドを実行すると「flynn」と表示されたことから父親は特権を持たない一般アカウントでログインしたものと推測しました。調査をするには特権が必要と考えたサムは「root」アカウントでログインしようと試みますが失敗したため、代わりに「backdoor」アカウントでログインを試みると成功しました。一見rootアカウントによるログインではないので無意味に思えますが、シェルプロンプトが一般ユーザーの「#」に変わっていることからシェルがrootと同じ「UID 0」で動作していることがわかります。つまりbackdoorアカウントはrootアカウントとUIDを共有しているのでホームディレクトリ(古いUnixシステムでrootのホームディレクトリに設定されている「/」)やコマンド履歴も共有しているものと推測できます。
ただしTatham氏は「ユーザーの切り替えにsuコマンドではなくloginコマンドを使用している点」「父親の個人所有のコンピューターにbackdoorアカウントが用意されていた理由が説明できない点」について疑問を持っています。backdoorアカウントについては「脚本家の手抜き」と考えることもできますが、より物語の世界観に即した納得のいく説明として以下を提示しています。
・元々父親は息子にrootアカウントを使わせていた
・息子は父親に内緒でbackdoorアカウントを作成した
・父親が何らかの理由によりrootアカウントを息子が使用できないよう変更した
上記の筋書きであればサムが最初rootアカウントでログインしようとした点についても説明できます。
・Unixシステム
サムが最初に実行したもう一つのコマンドは「uname -a」であり、調査しているOSがどのようなUnixシステムなのかを確認することができるコマンドです。unameコマンドが出力したOS名は「SolarOS」となっており、Sun MicrosystemsのUnixシリーズである「SunOS」と「Solaris」を組み合わせたかのような名前です。unameコマンドの出力結果に「sun4m」という文字列が含まれていることもSun MicrosystemsのOSをモチーフとしている可能性を裏付けています。
一方で、左上のターミナルウィンドウはtopコマンドを実行しているように見えますがそのスタイルはLinuxのものと一致しています。さらにウィンドウ右側に表示されている列にはLinuxに典型的なプロセス名(kthreadd・scsi_eh_XXX・migration・ksoftirqd・watchdogdなど)が並んでいます。また左下のターミナルウィンドウはiostatコマンドの出力に見えますがやはりSolarisよりもLinuxのスタイルに似ています。つまり、物語上はSolarisマシンを想定しているものの配役はLinuxマシンであり、衣装・メイク担当が配役をそれっぽく仕立てる細かな仕事を疎かにしたかのように見えるとTatham氏は指摘しています。
さらに趣深いのがアーキテクチャ情報で、unameの出力に「sun4m」と「i386」の両方が表示されているという間違いが起こっています。sun4mはSPARCベースのハードウェアであるためx86ハードウェアと共存することは考えられません。
・configureコマンドの実行順
Tatham氏はコマンド履歴を確認しているうちにコマンドの実行順がおかしいことに気付きました。具体的にTatham氏が疑問を呈したのはコマンド履歴490〜493あたりの以下のコマンドの呼び出し順についてです。
・make
・make install
・./configure -o test.cfg
通常はconfigureスクリプトにより設定を行った後にmakeコマンドでビルドするため最初に実行されるのはconfigureスクリプトのはずです。ただしその場合にはconfigureスクリプトがAutoconfによって生成されたという前提があるのですが、今度はAutoconfが作ったconfigureスクリプトには存在しないはずの「-o test.cfg」オプションの存在が問題となります。ないはずのオプションが存在するということは、コマンド履歴に載っているconfigureはAutoconfが生成するスクリプトと偶然同じ名前を持つ全く別の存在ということになります。実際のところ複雑な設定ファイルを用意する必要があるソフトウェアパッケージがひな形の設定ファイルを自動生成するスクリプトを提供するのは合理的といえます。コマンド履歴を改めて確認すると、configureスクリプトでひな形の設定ファイルであるtest.cfgを生成し、viでtest.cfgを編集して問題点を修正している様子が見て取れます。
一方で、コマンド履歴の最後にレーザーコントローラーと思しきLLLSDLaserControlコマンドを実行した形跡がありますが、ここでtest.cfgが使用されているとは到底考えられません。なぜかというと、コマンド履歴を確認する限りtest.cfgはソースコードディレクトリ内に生成されており、ファイル名も相まってソフトウェアがデフォルトで読み込むとは思えないからです。もしtest.cfgをソフトウェアに読み込ませようとするならば適切なディレクトリに移動させるなり起動オプションでパスを指定するなりするはずですが、編集後のtest.cfgを使用しようとした痕跡は全く見られませんでした。Tatham氏は最後にプログラムに設定ファイルを使うよう指示して完了させるのを忘れた製作者のミスであると考えつつも、実際のシェルのコマンド履歴が間違った操作だらけである点も考慮するとあながちミスとは言い切れないかもしれないと述べています。
・プロセス終了によるメモリ解放
レーザーコントローラーを実行するには大量の空きメモリを消費するものと思われ、コマンド履歴496〜500を見るとメモリを解放しようとしたように見えます。まず父親は「cat /proc/meminfo」により空きメモリの容量を確認していますが、どうやら満足な空きメモリ容量がなかったものと思われ、次にpsコマンドを実行して実行中プロセスの一覧を表示してメモリを大量に消費するものと思われるいくつかのプロセスに対してkillコマンドを実行しています。最後に再度psコマンドを実行し、終了させたプロセスが本当に一覧から消えていることを確認しています。
一連の行動は一見すると整合が取れているように見えるもののTatham氏は疑問を呈しています。何故ならば父親が取った行動の目的はあくまで「メモリ解放」が目的だったはずであり、したがって最後に実行するべきコマンドはpsコマンドではなく「cat /proc/meminfo」によって十分な空きメモリが確保されたことの確認であるはずです。ただ、父親が「慌てていた」「気が散っていた」「興奮していた」などの理由からうっかり本来取るべきでない行動をおこなってしまった様子を映画製作者が忠実に描写した可能性についても言及しています。
・レーザーコントローラーの二重安全機構
レーザーコントローラー「LLLSDLaserControl」を実行する直前に父親は「touch /opt/LLL/run/ok」を実行しています。touchコマンドには2つの機能があり、存在するファイルに対してはタイムスタンプを更新し、存在しないファイルに対してはそのファイルを作成します。作中のケースではおそらく元々「/opt/LLL/run/ok」というファイルは存在しておらずファイルを作成する目的でコマンドを実行したものと推測されます。では何故「/opt/LLL/run/ok」ファイルを作成したのかというと、ファイルが存在しない場合はレーザーコントローラーが実際にレーザーをコントロールしないようになっているものと考えられます。つまり「/opt/LLL/run/ok」ファイルの有無はレーザーが誤って作動する可能性を低減する安全機構だといえます。
レーザーコントローラーにはもう一つの安全機構があります。最後のコマンド履歴でレーザーコントローラーを起動する際に「-ok 1」というオプションが指定されていました。つまりレーザーコントローラーは実行時に「本当に実行してもいい」という意思を2通りの方法で確認するようになっているということです。
二重の安全対策を取るという手法は現実のUnixソフトウェアでも見られるものであり、特にGitでは様々な部分で採用されています。例えばgit-daemonはリポジトリディレクトリ内に「git-daemon-export-ok」というファイルが存在しない限りHTTP経由でGitリポジトリを提供しないようになっていたり、git-cleanは-fオプションを指定しない限り実際のファイル削除を行わないようになっていたりします。
ただし、二重安全機構があるからといってこのレーザーコントローラーがISO 26262のような厳格な安全基準の要件を満たすかどうかについてTatham氏は懐疑的です。例えばコマンドラインオプションで「-ok 1」を指定する場合について考えると、作中でもhistoryコマンドの出力にそのまま表示されている描写があることからもわかる通りコマンド履歴を呼び出して再実行すればいいだけなので安全機構としての意味合いは薄れてしまいます。また「/opt/LLL/run/ok」ファイルは一度作成するとファイルは存在し続けるという問題があります。レーザーコントローラーは秘密裏に開発されたものなのでまず間違いなく「地下室で1人か2人がコーディングしている」ようなスタイルのソフトウェアであり、自分なりの安全基準を満たそうとはしているものの業界標準レベルの安全性には及ばないと指摘しています。
・遺言書ファイル
レーザー発射前に父親は「~/last_will_and_testament.txt」というファイルを編集しています。ファイル名を和訳すれば「遺言書」となることからも、父親がこれからレーザーを使用して行う行為がいかに危険であることをうかがい知ることができます。実際に父親が何を行ったかというと、レーザーを自分に向けて発射して肉体を完全に消滅させデジタル化するというものでした。父親(前作「トロン」の主人公ケヴィン・フリン)はかつて敵対するマスター・コントロール・プログラム(MCP)によって同じ目にあわされた経験があり、今回は前回と異なり遺言を残す時間があること、またデジタル化そのもののリスクや現実世界への帰還の困難さを理解していることから遺言書を作成することにしたのだと考えられます。
ただ、父親が遺言書を作成した際に冷静だったのかについては定かではないとTatham氏は指摘しています。一般的に遺言書というものは署名や立会人を必要とし、何より死後に実際に誰かが発見できる場所に保管しておく必要があるはずです。死後に誰かがPCを調べてホームディレクトリにある「遺言書」というファイルを見つけてくれるかもしれないという偶然に頼るべきではありませんし、そもそも故人のホームディレクトリを調べ上げるには遺言書の検認を受けるための別の遺言書が必要になるものと考えられます。さらに言えば、父親はrootアカウントで遺言書を作成しているので遺言書ファイルはrootアカウントのホームディレクトリである「/」に作成されているため、たとえ故人のマシンを調べる許可を得られたとして遺言書を探すべき場所として思いつく場所とは言えません。
一方で、サムは父親の遺言執行者である可能性がかなり高く、実際に彼は遺言書を見つけることができました。ただし署名も立会人もない遺言書の有効性は低いことが予想されます。さらに深く考察すると「コンピューターのアカウント設定」のところで分析された通りサムが遺言書を発見できたのはbackboorアカウントを使ったからであり、backdoorアカウント自体が父親の想定外の存在だったかもしれない可能性を考えると「rootアカウントで遺言書を作成した」という父親の行動が遺言書を見つけてもらうことを念頭に置いて行動していたようには見えません。ただTatham氏は世界観に沿った父親のうっかりミスの演出だった可能性についても言及し「もし私が死ぬかもしれない未検証の手術を自分自身に行うと仮定し、しかも事前に誰にも伝えられていないとしたら、私だって冷静にはなれない」と述べています。
・ターミナルウィンドウでのテキストレンダリング
これまでに挙げられた疑問点はターミナルウィンドウに表示されたテキストの内容についてですが、ターミナルウィンドウそのものに関しても奇妙な点が挙げられていました。一般的にターミナルウィンドウでは等幅フォントが使用されますが、スクリーンショットのメインのターミナルウィンドウを見てみるとテキストがプロポーショナルフォントで表示されています。「Login incorrect」という行とその後に続く「login: backdoor」という行を見ればプロポーショナルフォントを使用していることがよくわかります。等幅フォントであれば「Login」と「login」は単語レベルで幅が一致するはずですが、プロポーショナルフォントでは大文字の「L」と小文字の「l」の幅が異なるため単語レベルでも幅が異なっています。

また、ターミナルウィンドウ中のテキストが「ワードラップ」と呼ばれる単語単位で改行する表示となっていますが、通常のターミナルウィンドウではあり得ません。通常のターミナルでは単純なコマンドラインプログラムがstdoutに出力がターミナルの幅を超えた場合、一般的には単語の区切りを無視して画面幅を超えた分だけきっちり次の行に折り返し、ごくまれなケースでは画面幅を超えた文字がすべて右側の余白に重ねて表示されます。「uname -a」は通常すべての情報を1行で出力するため本来であれば「Unknown.Unknown」は他の情報と同じ行に出力されるはずですが、スクリーンショットを見るとワードラップが発生し丸ごと次の行に表示されてしまっています。

スクリーンショットを様々な面から検証してきたこれまでの結果から実際のUnixシステムが関わっていた可能性が高いので、もしかするとプロポーショナルフォントを使用しワードラップに対応したターミナルプログラムが存在するのかもしれませんが、奇妙なことにスクリーンショット左上の「top」の出力を表示しているターミナルウィンドウは見た目こそ非常に似ているものの等幅フォントが使用されています。各プロセスの4文字に着目してみると文字の違いにかかわらず同一の文字幅をしていることがわかります。

・最後の謎
スクリーンショットから読み取れる様々な謎について追及・検証してきたTatham氏は最後に「もしroot権限で実行されたレーザーコントローラーがコンピューターの椅子の背後からレーザーを発射して座っている人をデジタル化させてしまったのだとしたら、なぜコンピューターはrootとしてログインしたままではなく、サムが見つけたときには一般ユーザーアカウントでログインした何も表示されていないターミナルウィンドウだったのだろう?もしかしたらrootアカウントでログインしたまま放置していると一定時間後にタイムアウトさせるような巧妙なシステムが存在するのだろうか?」と締めくくっています。
◆読者からの指摘
Tatham氏がブログを公開すると読者から様々な反応が寄せられました。その中にはTatham氏達が考えつかなかった考察もあったとのこと。
・vi内でtest.cfgを編集中に「:w」コマンドを使用してlaser.cfgとして適切なパスに保存した可能性
・Linux以外のUnix系OSではloginコマンドでsetuidできるものがある
・『トロン:レガシー』のVFXアーティストによる記事でemacsとそのeshellモードを使ってシェルセッションの記録を作成したことに触れている
・シェルセッションが手作業で1フレーム分ずつワードラップやプロポーショナルフォントを使用するアプリケーションに貼り付けて再生された可能性
・「LLL」に関するイースターエッグ:オリジナルの「トロン」がLawrence Livermore Laboratoryで撮影されたことに由来
