WindowsのIPフラグメント再構成問題


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


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




Windowsファミリーに対する新しいリモートDoS(動作妨害)攻撃方法が報告[1]された。これは、Windowsマシンに対して同一内容のフラグメントされたIPデータグラムを連続的に送信することにより、ターゲットのWindowsマシンが動作不能に陥るというものだ。マイクロソフトはこの問題に対してセキュリティ情報MS00-029[2](J053767[3])および、各OSに関する修正モジュールを公開した(ただし本原稿執筆時点では英語版のみ)。




IPフラグメントとは


IPデータグラムを発信するホストは、接続しているネットワークの最大転送単位(MTU: Maximum Transfer Unit)を最大サイズとするパケットを生成し、送信することができる。理想的な通信経路上では、発信元ホストから送信されたIPデータグラムは生成されたサイズそのままで宛先ホストへ到達することになるが、通信経路上に小さなMTUを持つネットワークが存在する場合、IPデータグラムはその境界にあるルータで細分化して送られる。これがIPフラグメントである(図1)。


図1 ホストAがMTU=1500のネットワークに送信したデータサイズ1000オクテット のIPデータグラムが、ルータ1を経由してMTU=620のネットワークに転送 される際、ルータ1によって二つのデータグラムにフラグメント化される。 ホストBではフラグメント化された二つのデータグラムを受信し、それを 元通りに再構成する。


ルータは、おおむね以下に基づいてIPデータグラムのフラグメント化を行なう(図2)。
  • フラグメント化された各IPデータグラムは、各々MTUのサイズ以内となる。
  • データ部は、末端を除き各々8の倍数のサイズとなるよう細分化される。
  • フラグメント化データグラムのIPヘッダは、以下を除き基本的に 元データグラムのIPヘッダがコピーされる。
    • フラグフィールドの第3ビット(more fragments)に1をセット。 ただし末端のフラグメントデータグラムには0をセット。
    • フラグメントオフセットフィールドにデータのオフセット値をセット。

図2 データサイズ1000オクテットのIPデータグラムがフラグメント化される 様子の例。IPヘッダのFlagsフィールドはフラグメント化の状態を制御。


フラグメント化されたIPデータグラムを元の形に戻す(フラグメントの再構成)のは、最終的な宛先となるホストの役割である。宛先ホストでは、以下の情報を基にしてフラグメント化されたIPデータグラムを再構成する。
    - データグラム識別子(Identification)
    - ソースアドレス(Source Address)
    - デスティネーションアドレス(Destination Address)
    - プロトコル(Protocol)
    - フラグメントオフセット(Fragment Offset)
    - フラグフィールド(Flags)
データグラム識別子〜プロトコルは元データグラムを一意に識別するために用いられる。前述の通り、フラグメント化されたデータグラムのIPヘッダは基本的に元データグラムと同一ヘッダ情報を持つため、これらの情報から元データグラムを識別することが可能となる。フラグメントオフセットの値は、フラグメント化された各データグラムのデータが元データグラムのデータ部のどの位置にあたるかを示している。

フラグフィールドの第3ビットは、フラグメント化された一連のデータグラム群の末端データグラムを識別するために用いられる。そのビットが1ならばそのデータグラムは末端ではなくまだ後続のフラグメントがあることを意味し、0ならば自分が末端データグラムであることを意味する。




攻撃の仕組み


今回のWindowsに対するフラグメント攻撃は、BindviewのRAZOR Security Teamによって報告された。この攻撃は比較的単純なもので、
    同一内容のIPフラグメントデータグラムを連続して多量に送りつける
ことによって実現する。すなわちフラグメント化されたデータグラムのコピー(IPヘッダ、データ共に同一内容を持つ)を大量に連続して攻撃対象のWindowsマシンに送信するのである(図3)。


図3 IPフラグメント攻撃のイメージ。同一内容を持つ大量のフラグメント化 データグラムを連続して送信する。


通常、同一内容のフラグメント化されたデータグラムがこのように連続して送られることはないため、何らかの異常時処理をするべきなのであろうが、WindowsのTCP/IPスタックのデータグラム再構成機能の不具合によりこのような一連のデータグラム処理のためにCPUに異常に負荷がかかっているのだと想像することができる。

彼らのセキュリティ勧告文書によると、おおよそ一秒あたり150個の割合で同一フラグメントデータグラムをターゲットに対して送信する必要があるらしい。おそらくこれを下回ると効果が出ないのであろう。送信するIPデータグラムの内容は特に問わないので、ICMPでもTCPでも良い。この攻撃により攻撃の間中、ターゲットホストはCPUの使用率が100%となり、ネットワーク機能やGUI機能が事実上使用不能になる。

実際にフラグメント化した多量のICMPパケットを生成し、NT4.0サーバに対してこの攻撃を行なったところ、勧告文書に書かれている通りCPUの使用率が急上昇、攻撃実行中はコンソールからは操作不能(マウスもキーボードも動かない)となり、ネットワークアクセスも不可能となった(図4および図5)。攻撃を停止するとほとんどの場合、元の状態に戻る。ICMPではなくフラグメント化したTCPパケットで攻撃しても、同様の結果となった。


図4 IPフラグメント攻撃を受けているWindows NTマシンのタスクマネージャ。 CPU使用率が急激に上昇しているのがわかる。この時点でほとんどの場合 コンソール上からの操作は不可能。



図5 攻撃対象Windows NTマシンに対してpingを送り、その反応を見てみる。 攻撃が始まったとたんにRequest timed out(反応が無い)状態になる ことがわかる。





影響を受けるプラットフォーム


マイクロソフトの技術文書によると、この問題の影響を受けるのは以下のWindows製品とされている。
    - Microsoft Windows 95
    - Microsoft Windows 98
    - Microsoft Windows NT 4.0 Workstation
    - Microsoft Windows NT 4.0 Server
    - Microsoft Windows NT 4.0 Server, Enterprise Edition
    - Microsoft Windows NT 4.0 Server, Terminal Server Edition
    - Microsoft Windows 2000 Professional
    - Microsoft Windows 2000 Server
    - Microsoft Windows 2000 Advanced Server
これは恐らくWindowsファミリーのTCP/IPスタックに共通する問題だと推測される。

筆者はこの中の、
    - Microsoft Windows 98
    - Microsoft Windows NT 4.0 Server
    - Microsoft Windows 2000 Professional
について実際に試してみたが、いずれも若干の挙動の違いはあるものの、攻撃中に使用不能状態に陥ることについては共通していた。筆者の手元にあるWindows 2000 Professionalは攻撃中止後も正常な状態に戻ることはなく、再起動する必要があった。




対策方法


根本的な対策方法は、マイクロソフトが提供する修正モジュールをダウンロードし、適用することである。マイクロソフトは影響を受ける各々のOSごとに、修正モジュールを提供している。ただし前述の通り、本原稿執筆時点では日本語版の各Windows OS用の修正モジュールはまだ提供されていない。

別の回避策として、経路上のルータ等(例えばインターネットとの境界ルータやファイアウォール)でフラグメント化されたIPデータグラムを通さないように設定することがあげられる。もちろんそのルータ等がその機能を持っている必要がある。ただしそのような設定をした場合、正規のフラグメント化されたIPデータグラムが通過できなくなるため、修正モジュール適用までの一時的な回避策と考えた方がよいだろう。

ちなみにアプリケーションレベルのゲートウェイ(プロクシサーバ等)は通常、フラグメントを再構成した後に処理する(すなわちIPレベルでは転送しない)ため、アプリケーションゲートウェイは外部からのフラグメント攻撃から内部ネットワークセグメントを保護する上で有効である。ただしこのゲートウェイマシンがWindowsであった場合、ゲートウェイマシン自体はフラグメント攻撃にさらされるため、そのマシンに対する修正モジュールの適用は必須である。

今回のフラグメント攻撃は、以下の理由により非常に重要視すべき問題だと考えられる。
  • ほとんどすべてのWindows OSが影響を受ける
  • 攻撃を受けている間はほぼ確実に機能が停止する
  • 攻撃方法が比較的簡単なため、攻撃プログラムを作成するのが容易
  • IPレベルで到達可能であれば攻撃が可能(上位プロトコルを問わない)
  • IPソースアドレス詐称が可能なため、ソースアドレスでのフィルタ リングが困難
インターネットからアクセス可能なネットワークセグメントにNTやWindows 2000を設置している場合は特に、早急な対策を施されたい。



[1]  Jolt2 - Remote Denial of Service attack against Windows 2000 
     and NT4
     http://razor.bindview.com/publish/advisories/adv_Jolt2.html

[2]  MS00-029: Patch Available for "IP Fragment Reassembly" 
     Vulnerability 
     http://www.microsoft.com/technet/security/bulletin/ms00-029.asp

[3]  [NT] 同一の断片化された ICMP パケットの問題
     http://www.microsoft.com/japan/support/kb/articles/J053/7/67.htm


2000年5月執筆
塩月 誠人
インターナショナル・ネットワーク・セキュリティ株式会社