NTにおけるIPソースアドレス詐称

Windows NT World 2000年4月号
月刊セキュリティレポート No.4

本文書は、Windows NT World誌に寄稿した記事の原稿を、IDGジャパン編集部殿の許可を得た上で掲載したものです。








 今回はWindows NTにおけるIPソースアドレス詐称 (IP Source Address Spoofing) の話題を取り上げる。ご承知の通りIPネットワーク上では、IPアドレスでホストを識別し、相互に通信を行なう。IPパケットの送信元ホストのIPアドレスを「ソースアドレス(Source Address)」、送信先ホストのIPアドレスを「デスティネーションアドレス(Destination Address)」と呼ぶ。「IPソースアドレス詐称」とは、送信するIPパケットのソースアドレスを意図的に「ごまかす」ことにより、実際の送信元である自分自身のホストを他のホストに見せかけることを指す。
 IPサーバプログラムによっては、受信したIPパケットのソースアドレスに依存した認証を行なうものがある。良い例はUNIXのrlogindやrshdといったプログラムで、これらは(そのように設定された場合であるが)指定されたIPアドレスをソースに持つ接続をパスワード等による認証なしで受け入れる。また多くのWebサーバプログラムは、IPソースアドレスでアクセス先を許可あるいは拒否する機能を持つ。このようなサーバプログラムは、IPソースアドレスを詐称されることによって、攻撃者に不正にアクセスを許してしまう可能性がある。
 さらに通常、IPサーバプログラムにはどのホストからどのようなアクセスがあったかというログを残す機能があるが、アクセス元のホストの情報としては一般的にソースアドレスを記録する。すなわち攻撃者はあるターゲットサイトを攻撃する際に、ソースアドレスを詐称することであたかも別のホストから攻撃しているように見せかけ、自分自身の本来のIPアドレスを隠すことができる。
 ここでは、IPソースアドレス詐称による攻撃方法として知られる、

  • ソースルーティング
  • TCPシーケンス番号予測

の二つについて、NTがターゲットとなった場合の危険性および回避方法について記述する。

ソースルーティングとは


 「ソースルーティング(Source Routing)」とはIPのオプション機能の一つで、IPパケットのルート(経由するルータ)を、パケット送信元が意図的に指定することを指す。
 通常、IPパケットが送信元ホストから送信先ホストへ送られる際には、経路上の個々のルータが次の送り先ルータを決定する。そのため送信元ホストは転送経路について関知しない。これに対し、ソースルーティング・オプションは送信元ホストに転送経路上のルータを明示的に指定する機能を提供する。すなわちソースルーティングを行なうことで送信元ホストは、希望するルータを必ず経由して送信先ホストへ到達するようなIPパケットを発信することが可能になる。一般的にソースルーティングは、ネットワークのテストや標準経路の不具合を回避する目的で使用される。

 ソースルーティングには次の二つの形式がある。
  1. ストリクト・ソースルーティング (Strict Source Routing)
    IPパケットが経由するすべてのルータを、送信元ホストが指定する。
    指定したルータを厳密に順序通りに経由するため、各々のルータ同士が直接ネットワークで接続されていない場合、到達不能になる。

  2. ルーズ・ソースルーティング (Loose Source Routing)
    IPパケットが経由すべきルータを、送信元ホストが指定する。
    指定したルータを指定順序で経由するが、ルータ間の経路は通常通りルータに任されるため、指定しないルータを経由することも可能。
いずれの場合も、指定できるルータの最大数は9である。
ソースルーティングの概要を図1に示す。

ソースルーティングの概要。発信元ホストSから最終宛先ホストDへ、ルータR1およびR2を経由して到達する場合。
図1



ソースルーティングによるソースアドレス詐称


 このソースルーティングを利用することにより、送信元ホストのIPアドレスを詐称して送信先ホストとIP通信を行なうことが可能となる。
 図2にネットワーク構成例を示す。

図2  ソースルーティングを利用した攻撃の例。攻撃元ホストは信頼ホストのIPアドレスを詐称してターゲットホストにアクセス。
図2


この図でターゲットサイトにある「ターゲットホスト」は攻撃対象となるホストである。この「ターゲットホスト」は同じサイト内にある「信頼ホスト」を信頼しているとしよう。すなわち「ターゲットホスト」上のサーバプログラムは、「信頼ホスト」のIPアドレスをソースアドレスに持つIP接続を無条件で受け入れ、それ以外のIPアドレスからの接続は拒否するものと仮定する。
 「攻撃元ホスト」から「ターゲットホスト」上のサーバプログラムへ通信を行なう際、通常のIP通信では当然のことながら、

Source Address 「攻撃元ホスト」のIPアドレス (ip-origin)


となる。そのため、「ターゲットホスト」はこの接続を拒否する。

 それではルーズ・ソースルーティングを利用してみよう。「攻撃元ホスト」はソースルートとして「攻撃元ルータ」を指定し、ソースアドレスがターゲットサイト上の「信頼ホスト」のアドレスであるようなIPパケット送出する。

Source Address 「信頼ホスト」のIPアドレス (ip-trusted)
Source Route Data 「攻撃元ルータ」のIPアドレス (ip-router)


 このIPパケットは、「攻撃元ルータ」を経由して「ターゲットホスト」へたどり着く。「ターゲットホスト」はこのパケットに対する応答を、ソースルートに従って「信頼ホスト」へ返そうとする。すなわち、「攻撃元ルータ」を必ず経由するように返すのである。

Source Address 「ターゲットホスト」のIPアドレス (ip-target)
Source Route Data 「攻撃元ルータ」のIPアドレス (ip-router)


 攻撃者は自分の管理下にある「攻撃元ルータ」に、「信頼ホスト」のIPアドレスへのルートを「攻撃ホスト」に向けるような設定を予め行なっておく。それにより、「信頼ホスト」のIPアドレスがデスティネーションであるようなIPパケットを、「攻撃ホスト」へ転送することができる。
 このようにルーズ・ソースルーティングを利用することで、攻撃者はソースアドレスを詐称した形でTCP/UDPの通信を行なうことが可能となる。上の例では分かりやすくするために「攻撃元ルータ」をソースルート指定したが、「攻撃元ホスト」に複数のIPアドレスを割り当て、その片方をソースルート指定することにより、「攻撃元ホスト」一台でソースルーティングを利用したアドレス詐称を行なうことも可能である。
 ソースルーティングによるソースアドレス詐称は、TCP、UDPいずれについても通常のコネクション同様にデータの送受信ができるため、危険度はかなり高い。

TCPシーケンス番号予測


 ソースアドレス詐称のもう一つの手法として、「TCPシーケンス番号予測」がある。これはTCPセッションにおけるソースアドレス詐称手法で、TCPセッション確立時にサーバプログラムが発行する初期シーケンス番号(Initial Sequence Number:ISN)を予測することにより、あたかもクライアント-サーバ間でTCPセッションが確立したかのようにサーバプログラムをだまし、不正なTCPパケットを受け入れさせるものである。
 通常、クライアント-サーバ間のTCPコネクションは、次のような手順で確立される。

図3 TCPコネクション確立手順の概要。
図3


  1. クライアントは接続したいサーバのTCPポートに対し、クライアント側の ISN(図の例では100)を含むSYN(Synchronize)パケットを送る。
  2. サーバはそれに対し、サーバ側のISN(図の例では200)を含むSYNパケットを送る。その際にクライアントのSYNに対する確認応答としてISN+1(すなわち101)のACK(Acknowledgement)を返す。
  3. クライアントは、サーバから送られてきたSYN+ACKに対し、確認応答としてサーバのISN+1(図の例では201)のACKを返す。

 この手順がいわゆるTCPのスリーウェイ・ハンドシェイクである。この手順を見て分かる通り、TCPコネクションを確立するためにはクライアント側はサーバのISNを知る必要がある。
 クライアントが単純に別のソースアドレスを持つTCPパケットをサーバに送信した場合、サーバからのSYN+ACKパケットはクライアントに到達しないため、クライアントはサーバのISNを知ることができず、サーバに対する正常なACKを返すことができない。そのためTCPのコネクションは確立されない。それでは、サーバが発行するISNを、クライアントが何らかの方法で知ることができるとすればどうであろうか。クライアントはサーバからの返答パケットを一切受け取ることはできないものの、サーバに対してあたかも詐称したソースアドレスを持つホストとのTCPコネクションが確立したように思い込ませ、不正なTCPパケットを送り込むことが可能になる。

図4  TCPシーケンス番号予測による攻撃の例。攻撃元ホストはターゲットホストの初期シーケンス番号を予測し、信頼ホストのIPアドレスを詐称してアクセス
図4


 サーバのISN(初期シーケンス番号)が容易に予測できるかどうかは、該当するOSの実装に依存する。
 前述のソースルーティングによるソースアドレス詐称とは異なり、TCPシーケンス番号予測による攻撃では、攻撃側のホストはサーバからの返答パケットを受け取ることができない。単にTCPパケットを送り込むだけである(ブラインド・アタック)。またISNを的確に予測することは、ターゲットOSにもよるが、一般的にそれほど簡単ではない。しかしISNが非常に単純なロジックで生成されており、またサーバプログラムがソースIPアドレスに極めて依存した認証を行なっているような場合、この攻撃手法は有効と考えられる。

NT4.0における脅威


 さて、それではソースルーティングやTCPシーケンス番号予測によるソースアドレス詐称が、NT4.0で実際にどの程度脅威となり得るのであろうか。
 まずソースルーティングであるが、NT4.0はデフォルトでソースルートされたIPパケットの送受信を許可する。そもそもソースルーティングの制御はサービスパック5(SP5)でNTに導入された機能であるため、SP4以前では制御することができない。SP5で初めてソースルートされたIPパケットの転送を禁止する機能が組み込まれた。その後、SP5におけるソースルーティング制御機能に不備があることが指摘され、ホットフィックスが提供された。(Spoof-fix)
 Spoof-fixはSP5のソースルーティング制御機能の不備を修正すると同時に、ソースルートされたパケットの転送禁止のみならず、受け入れ禁止の機能が追加された。これらの機能はSP6aにも引き継がれている。ただしSP5+Spoof-fix、SP6aいずれの場合も、後述するレジストリの設定が必要なため、デフォルトではソースルーティングによるソースアドレス詐称の脅威にさらされることに変わりはない。
 では、TCPシーケンス番号予測についてはどうだろう。以下は、標準的なNT4.0サーバのTCPポート139番に対して約2秒間隔でコネクションを確立させた際の、サーバ側ISNをリストしたものである。

時刻 IP アドレス,ポート サーバISN
サーバ - クライアント
19:54:44.849923 192.168.113.2.139 > 192.168.113.28.1074 S 2615516766
19:54:46.782437 192.168.113.2.139 > 192.168.113.28.1075 S 2615518704
19:54:48.710258 192.168.113.2.139 > 192.168.113.28.1076 S 2615520626
19:54:50.636534 192.168.113.2.139 > 192.168.113.28.1077 S 2615522548
19:54:52.566569 192.168.113.2.139 > 192.168.113.28.1078 S 2615524485

 この実例でサーバISNの増分は、1938、1922、1922、1937のように極めて似通った間隔になっている。つまり次の2秒後にコネクション開設要求を出した場合、おおよそどの位のサーバISNになるか、比較的容易に予測可能であることが分かる。
 TCPシーケンス番号予測の脆弱性については、英語版NT4.0に関するホットフィックスは提供されているものの、日本語版NT4.0に関するホットフィックスは本原稿執筆時点ではまだ提供されていない。このフィックス適用により、Windows2000で採用されているのと同様の、よりランダムなISN生成のアルゴリズムが使用されるようになる。
 ソースアドレス詐称によってサーバプログラムが脅威にさらされるかどうかは、初めに述べた通りサーバプログラムの機能や設定に依存する。NTの基本的な機能であるファイル共有やプリンタ共有に関する認証(SMB認証)については、IPソースアドレスに依存した処理は行なわれないため、例えソースアドレスが詐称されても基本的には問題ないはずである。しかしNTサーバ上で稼動する、いわゆるインターネット・サービス・プログラムについてはどうであろう。
 例えばIIS(Internet Information Server)には仮想サーバやディレクトリごとに、IPアドレスでのアクセス制限を行なう機能がある。その場合、本来はアクセスできないはずのクライアントマシンからのアクセスを、ソースアドレス詐称によって許可してしまうことが考えられる。またIISはWebクライアントからのアクセスの記録をログファイルに書き込むが、ログの中でクライアントを特定する部分はソースIPアドレスである。つまり、IISに対して攻撃を行なう際に、ソースアドレスをごまかすことで発信元を分かりにくくする、あるいは他のホストからの攻撃のように見せかけるといったことも考えられる。
 DNSやSMTPサーバについても同様である。DNSゾーン転送のIPアドレスによる制限、SMTP不正中継のIPアドレスによる制限などを、ソースアドレス詐称で回避し、不正にアクセスすることも可能であろう。またプロクシ・サーバ、RRAS(Routing and RAS)によるIPフィルタリング、SNMPへのアクセス等、NT上のプログラムでソースIPアドレスに依存したセキュリティを実現しているものは多々ある。これらは基本的にソースアドレス詐称によって、何らかのセキュリティ侵害を受ける危険性がある。

対策方法


 IPソースアドレス詐称の脅威を低減させるには、以下の方法が有効であると考えられる。
  1. 境界となるルータで不正なソースIPアドレスをフィルタする
     あるネットワークセグメント上で同一セグメント上のホストを信頼しているような場合、そのセグメント上のIPアドレスをソースに持つパケットが外部セグメントから入ってこないように、境界ルータでソースアドレスのフィルタリングを行なう。また同様に、自分のネットワークアドレス以外のIPアドレスをソースに持つパケットが出て行かないように境界ルータでフィルタすることも、内部から外部への不正アクセスを防ぐために重要である。

  2. 境界となるルータでソースルートされたIPパケットをドロップする
     通常のルータは、ソースルーティングオプションが有効になったIPパケットを通過させないように設定する機能を持つ。境界ルータでその機能を有効にすることで、ソースルートされたIPパケットの侵入および侵出を防ぐことができる。

  3. NTホスト上でソースルートされたIPパケットをドロップする
     前述の通り、NT4.0 SP5にSpoof-fixをあてるか、もしくはSP6aをインストールすることにより、NT上でソースルートされたIPパケットをドロップすることが可能となる。ただし以下のレジストリ設定を行ない、リブートしなければ、この機能は有効にならないので注意が必要である。レジストリ値を2に設定することにより、ソースルートされたIPパケットの転送および、自分自身への受け入れ双方について、拒否することができる。

    key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
    Services\Tcpip\Parameters
    Name DisableIPSourceRouting
    Type REG_DWORD
    Value 0 : ソースルーティングを有効にする(デフォルト)
    1 : IP転送が有効の時にソースルーティングを有効にする
    2 : ソースルーティングを完全に無効にする


  4. ISN(初期シーケンス番号)の生成をよりランダムにする
     NT4.0英語版ではSP6aにホットフィックスを適用することで、よりランダムなISN生成が可能となるため、TCPシーケンス番号予測による攻撃の危険性は減少する。ただし前述の通り、日本語版NT4.0については現時点ではまだフィックスが提供されていない。

  5. アプリケーションの構築や運用での考慮 (機能、設定等)
     TCP/IPアプリケーションプログラムの構築時あるいは運用時に、ソースアドレス詐称の危険性を考慮することで、脅威を低減させることが可能である。

    例)
    • ソースアドレスのみに依存した認証を行なわない (他の認証を併用)
    • ソースアドレス依存の認証機能を利用しない
    • ログにソースルーティング経路情報を記録する
    • サーバプログラムでIPオプションを削除する


以上、今回はNTにおけるソースアドレス詐称の脅威について述べた。TCPシーケンス番号予測による攻撃は比較的難易度が高いため、あまり頻繁に行なわれることはないかも知れない。一方でソースルーティングを利用した攻撃は、攻撃者にとってみれば簡便かつ効果的(データの送受信が可能)であるので、危険度は大きいと言える。インターネットからアクセスされるサーバについては、境界ルータまたはファイアウォールでソースルートされたパケットをドロップするように設定する場合が多いが、特に組織内LANではそのようなルータ設定をしていないケースも少なくないと思われるため、十分な注意が必要であろう。

2000年3月執筆
セントラル・コンピュータ・サービス株式会社
塩月 誠人