ネットワークは盗聴される可能性がある――。多くの人は,この事実を聞いたことがあるだろう。にもかかわらず,脅威だと思っていなかったり,他人事だと思っている。「はがきの内容は誰かに読まれる可能性がある」ということは誰でも容易に想像できるが,ネットワークのような目に見えない電気信号は実感しにくい。それをのぞき見るという行為は,特殊な技術を持った産業スパイだけが行えるものだと思いがちである。

 しかし,実際に不正行為を行う者から見ると,ネットワーク盗聴ほど手軽で,ばれる可能性が低く,効果の大きい不正アクセス手段はない。そして,このことがネットワーク盗聴行為を助長しているのである。

 サーバ侵入などの不正アクセス行為は,サーバに向かって何らかのパケットを送信しなければならない。この場合,サーバやネットワーク・モニタ,不正侵入検知ツール(IDS)などに,確実にログが残る。事件が発覚して,ログを調査されれば追跡される。

 これに対して,ネットワーク盗聴はパケットを一切送信する必要がなく,ネットワーク管理者などにネットワーク盗聴の行為自体を発見されることはまずない。また,特殊な装置も必要ない。一般に使われているPCにネットワーク盗聴用のソフトウェアをインストールするだけで,手軽に実行できてしまう。実際,あなたの隣の席の同僚が,あなたのメールを盗聴している可能性もあるのだ。

ネットワーク盗聴の実態

 盗聴されるネットワーク・データは,パスワードや電子メール,Webコンテンツなどが多い。なかでも電子メールは,現在のビジネス・シーンにおいて重要なコミュニケーション手段になっている。これを盗聴するだけで,企業の機密情報が盗み出されてしまう恐れがある。もちろん,PGP(Pretty Good Privacy)などの暗号化を使っていれば,盗聴される心配はない。が,メールに暗号化を施している人の比率は,まだ少ない。技術的に対策が可能でも,事実上,暗号メールは使えないのが現状である。

 メールだけではなく,ネットワーク上のサーバとクライアント間でやり取りするログイン・パケットも盗聴の対象になる。サーバにログインするためのパケットを盗聴されると,ユーザ・アカウントとパスワードの両方が盗まれ,結果としてサーバへの不正侵入を許す。さらには,次の不正アクセスへとつながってしまう。

 特に,FTPやTelnetなどのUNIXで古くから利用されているサービスの認証,メールで使うPOP3や,あるいはWebサイトのHTTP基本認証などで使うパスワードの多くは,平文のままネットワーク上を飛び交っている。これらのパケットを盗み見されるだけで,ユーザ・アカウントとパスワードを他人に盗まれてしまう。

 Windowsで使うパスワードは,平文ではなく暗号化されてネットワーク上を流れる。しかし,このパスワードもパスワード解析ソフトウェアによって,容易に解析することができてしまう。

ネットワーク盗聴の発見手法

 前述した通り,ネットワーク盗聴の最大の問題点は,盗聴者を発見できないことである。もし,ネットワークを盗聴している人を発見することができるなら,盗聴者は捕まる可能性を考えなければならず,安易な目的での実施は少なくなると期待できる。もちろん,ゼロになるわけではないが,少なくとも便乗犯やスクリプト・キディ(Script Kiddie)による盗聴はある程度抑止できるだろう。つまり,ネットワーク盗聴を発見する技術,および暗号化機構の普及が盗聴対策における大きな課題になっているのだ。

 ネットワークを盗聴しているPCを,ネットワーク側から検出する方法はいくつかある。以下では,最も実用的な「ARPパケットを用いたネットワーク盗聴ノードの検出原理」を説明する。

 まず,ネットワーク盗聴を発見するためには,ネットワーク盗聴の原理を技術的に知っている必要がある。一般に,企業内ネットワークや学校内ネットワークはEthernetで構成されていることが多い。いわゆるLANとか10BASE-T,FastEthernetなどと呼ばれているものである。パソコンをネットワークに接続するには,パソコンにNIC(Network Interface Card)を装着し,PC上でTCP/IPの設定をし,ハブに接続しているだろう。

 ネットワーク盗聴とは,LANの中を流れている自分に関係のない他人のパケットを取り込んでしまうことである。取り込むといっても,ネットワーク内のパケットは電気信号であり,データを取り込んでも元データがなくなるわけではない。イメージ的には写真を撮って,そのまま元に戻しているようなものだ。元の通信自体には何の影響も与えない。

 通常の状態で,ネットワークを利用しているPCは,自分に関係のあるパケット以外を,NICを通過する段階で破棄する仕組みになっている。逆に言えば,自分に関係のないPC間の通信データはNICが捨ててしまい,受信(盗聴)することができない。

図1 NICをプロミスキャス・モードにすると,ネットワーク上の全データを取り込む
 このため,ネットワーク盗聴を行うためには,まずNICの状態を通常ではない「プロミスキャス」という特殊なモードに切り替えて,NICによるフィルタリングが無効になるようにしなければならない。NICの状態をプロミスキャス・モードに設定しておくと,接続されたネットワーク内を流れているすべてのパケットが捨てられることなくPCに取り込まれる(図1[拡大表示])。その中から欲しいパケットだけをソフトウェアによって抽出すれば,ネットワーク盗聴が可能になるのだ。

いくつかあるNICの動作状態

 ネットワーク盗聴を検出することは,プロミスキャス・モードになっているNICを探し出すこととほとんど同じである。

 初めに,プロミスキャスの動作を理解するために,いくつかあるNICの動作状態について説明しておく。一般に,NICには(1)ユニキャスト,(2)ブロードキャスト,(3)マルチキャスト,(4)オール・マルチキャスト,(5)プロミスキャスの5種類のフィルタリング機能が備わっている。NICは,この中から必要なものを選択して動作する。

(1)ユニキャスト

 このフィルタは,パケットのあて先アドレスが,自分のアドレスを指している場合に取り込むものである。逆に,他人あてのパケットは取り込まない。最も一般的なフィルタで,NICの通常の状態である。ここで言う自分のアドレスとは,6バイトから成るMACアドレス(ハードウェア・アドレス)で,市販されているNICには,世界でただ一つのMACアドレスが,NIC自体に設定されている。

(2)ブロードキャスト

 このフィルタは,ブロードキャスト・パケット(すべてのノードが受信しなければならないパケット)を受信するフィルタである。ハードウェア・ブロードキャスト・アドレスは「FF-FF-FF-FF-FF-FF」の6バイトのアドレスで,このブロードキャスト・フィルタが設定されているノードは,あて先MACアドレスが「FF-FF-FF-FF-FF-FF」になっているパケットをすべて受信する。後で説明するARPリクエスト・パケットも,このブロードキャスト・アドレスあてで発信される。

(3)マルチキャスト

 マルチキャスト・フィルタは,あらかじめ登録されたグループ・アドレスあてのパケットを受信するフィルタである。自ノードがどのグループ・アドレスあてのパケットを受信すべきかは,NIC内のマルチキャスト・リストに登録されている。マルチキャスト・リストには,ソフトウェアを使ってあらかじめアドレスを設定できる。TCP/IPにおいては,あて先MACアドレスを「01-00-5E-xx-xx-xx(xx-xx-xxはグループ番号)」という6バイトのアドレスにすれば,マルチキャストされる。

(4)オール・マルチキャスト

 オール・マルチキャスト・フィルタは,グループ・アドレスに関係なく,すべてのマルチキャスト・パケットを受信するフィルタである。実際には,MACアドレスの中のグループ・ビットがオンになっているすべてのパケットを受信する。グループ・ビットとは,MACアドレスの1バイトめの最下位ビットである(別掲記事「オール・マルチキャストとマルチキャスト」を参照)。例えば,あて先MACアドレスが「01-02-03-04-05-06」だった場合,これを2進数にすると「00000001-00000010-00000011-00000100-00000101-00000110」になる。この場合,1バイトめの最下位ビットは「1」で,グループ・ビットは有効になっている。

(5)プロミスキャス

 これは前述の通り,すべてのパケットを受信するフィルタである。

表1 WindowsやLinuxにおけるNICのデフォルト設定
図2 ifconfigコマンドでNICがプロミスキャス・モードだと判断したところ。「PROMISC」と表示される
図3 盗聴ノードを発見するための基本原理。本来は聞こえないはずの呼びかけに,盗聴ノードが応答してしまう可能性を探る

NICのデフォルト状態と盗聴状態

 WindowsやLinuxにおいて,NICのフィルタリングのデフォルト設定は表1[拡大表示]のようになっている(以後,この状態をノーマル・モードと呼ぶ)。盗聴が行われているノードでは,前述のようにNICがプロミスキャス・モードに設定され,すべてのパケットが受信できるようになっている。Linuxでifconfigコマンドを動かすと,図2[拡大表示]のようにプロミスキャス・モードを表す「PROMISC」が表示される。

プロミスキャス発見のアプローチ

 盗聴しているPC(プロミスキャス・ノード)は,盗聴の証拠となるようなパケットを一切出さない。だからこそ,盗聴を発見することが難しいと言われている。

 しかし,検出できる可能性は持っている。前述のように,ノーマル・モードとプロミスキャス・モードでは,NICの動作が異なっている。この違いを巧みに利用して,盗聴ノードを検出するのだ。例えば,次のような場面を想像してほしい(図3[拡大表示])。

 会議室で,重要な会議をしていたとしよう。その会議を盗聴しようとするAさんは,会議室の隣の部屋に隠れて,壁に耳をつけて会議の内容を盗み聞きしている。会議をしているメンバは壁を透視する能力など持っていない。当然,Aさんが盗み聞きしていることを知る方法はない。しかし,もし会議室の中で「Aさんはいらっしゃいますか」と,そこにはいないはずのAさんに話しかけたとしよう。この時,壁の向こうで盗み聴きしていたAさんが反射的に「ハイ!」と返事してしまう可能性はないだろうか。

 つまり,本来なら聞こえないはずの呼びかけが,盗聴していることによって聞こえてしまい,その声に反射的に反応する可能性があるのでは,という考え方だ。コンピュータの場合,人間のようにあいまいな判断はしない。プログラムされた通りに動作する。誤って応答することは期待できないが,聞こえれば応答してしまうパケットが存在すれば,盗聴ノードを検出できる可能性がある。

オール・マルチキャストとマルチキャスト

 NICのフィルタリング動作を見ていくと,マルチキャストとオール・マルチキャストに矛盾を感じないだろうか。マルチキャスト・アドレスは「01-00-5E-xx-xx-xx」なのに,オール・マルチキャストはグループ・ビットの1ビットだけで判断している。オール・マルチキャストでも,「01-00-5E」の3バイトを判断すればよさそうなものである。

 しかし,これは間違いではない。なぜなら,実際のNICはTCP/IPで利用されるとは決まっていない。IPXやAppleTalkなどのプロトコルで使われる場合もある。マルチキャスト・アドレスの定義も,それぞれのプロトコルで異なっている。各プロトコルが共通で認識できるマルチキャスト・アドレスの特徴がグループ・ビットとなる。

 この差異が,プロミスキャス・ノード検出の重要な要素の一つとなる。


Daiji Sanai
筆者は,ネットワークセキュリティ研究チーム「SecurityFriday.com」のリーダ。2001年7月に米国ラスベガスで開催された有名なセキュリティ技術カンファレンス「The Blackhat Briefings '01」において、「ARPパケットを用いたプロミスキャスノード検出技術」についての発表を行った。