IP フラグメンテーション攻撃は、インターネット プロトコル(IP) がデータをどのように送信および処理する必要があるかに基づく、コンピュータ セキュリティ攻撃の一種です。具体的には、 IP フラグメンテーションを呼び出します。IP フラグメンテーションは、ネットワークの 1 つの層からのメッセージ (サービス データ ユニット(SDU)、通常はパケット) を、下位層のプロトコル データ ユニット(PDU)内に収まる複数の小さなペイロードに分割するプロセスです。すべてのネットワーク リンクには、送信できるメッセージの最大サイズがあり、これを最大転送単位(MTU) と呼びます。リンク層で追加された SDU とメタデータが MTU を超える場合、SDU をフラグメンテーションする必要があります。IP フラグメンテーション攻撃は、このプロセスを攻撃ベクトルとして悪用します。
TCP/IP スイートの一部であるインターネット プロトコル (IP) は、このモデルのインターネット層に存在します。IP は、ネットワーク エンドポイント間のパケットの送信を担当します。IP には、フォールト トレランス (存続時間、チェックサム)、トラフィックの優先順位付け (サービス タイプ)、および大きなパケットを複数の小さなパケットに分割するサポート (ID フィールド、フラグメント オフセット) の基本的な手段を提供する機能が含まれています。大きなパケットの分割のサポートは、元のパケットがサポートするデータリンク フレームに対して大きすぎる場合に、ルーターがパケットを小さなパケットに分割できるようにするプロトコルを提供します。IP 分割エクスプロイト (攻撃) は、IP 内の分割プロトコルを攻撃ベクトルとして使用します。
[Kurose 2013] によると、IP フラグメンテーション攻撃の 1 つのタイプでは、「攻撃者はターゲット ホストに小さなフラグメントのストリームを送信しますが、そのフラグメントのオフセットはいずれも 0 ではありません。ターゲットは、縮退したパケットからデータグラムを再構築しようとするときに崩壊する可能性があります。」 [ 1]別の攻撃では、オフセットが揃っていない重複フラグメントを送信します。これにより、脆弱なオペレーティング システムが何をすべきか分からなくなり、クラッシュする可能性があります。[1]
プロセス

IP パケットはデータリンク フレームにカプセル化されるため、リンク MTU は大きな IPパケットに影響し、IP パケットを MTU サイズと同じかそれより小さいサイズに分割するように強制します。
これはいくつかのアプローチで実現できます。
- IPパケットサイズを直接接続されたメディアと同じかそれより小さく設定し、パケットのそれ以降の断片化をすべてルーターに委任します。つまり、ルーターが現在のパケットを再断片化するかどうかを決定します。これにより、ルーターに多くの作業がオフロードされ、パケットが複数の IP ルーターによって次々にセグメント化される結果、非常に特異な断片化が発生する可能性があります。
- 送信元と送信先の間のすべてのリンクをプレビューし、一意のルートがあると仮定して、このルートで最小の MTU を選択します。この方法では、選択した MTU よりも小さいパケット サイズを使用して送信者がフラグメンテーションを実行し、途中でそれ以上のフラグメンテーションが発生しないことが保証されます。Path MTU Discoveryと呼ばれるこのソリューションにより、送信者は、ルーターに依存して IP レベルのフラグメンテーションを実行するのではなく、長いインターネット パケットをフラグメント化/セグメント化できます。これは、より効率的で、よりスケーラブルです。したがって、現在のインターネットではこれが推奨される方法です。このアプローチの問題は、各パケットが個別にルーティングされることです。通常は同じルートをたどりますが、そうでない場合もあります。そのため、フラグメンテーションを判断するためのプローブ パケットは、後のパケットがたどるパスとは異なるパスをたどる場合があります。
IP ヘッダーの 3 つのフィールドは、断片化と再構成を実装するために使用されます。「識別」、「フラグ」、および「フラグメント オフセット」フィールドです。
フラグ:
- パケットが断片化されたデータ フレームの一部であるかどうかを示す 3 ビットのフィールド。
- ビット 0: 予約済み、ゼロでなければならない (パケットが RFC 3514 に準拠していない場合)
- ビット 1: (AF) 0 = フラグメント可能、1 = フラグメント不可。
- ビット 2: (AF) 0 = 最後のフラグメント、1 = その他のフラグメント。
フラグメント オフセットは、元のパケット内のフラグメントの位置を 8 バイト単位で指定します。
したがって、最後のフラグメントを除くすべてのフラグメントには、8 バイトの倍数のデータが含まれている必要があります。フラグメント オフセットは 8192 (2^13) 単位を保持できることは明らかですが、IPヘッダーの「合計長」フィールドにはヘッダーとデータを含む合計サイズが記録されるため、パケットには 8192 * 8 = 65,536 バイトのデータを含めることはできません。IP ヘッダーは少なくとも 20 バイトの長さであるため、「フラグメント オフセット」の最大値は 8189 に制限され、最後のフラグメントに 3 バイトの余裕が残ります。
IP インターネットはコネクションレス型であるため、あるパケットのフラグメントが宛先で別のパケットのフラグメントとインターリーブされることがあります。「識別フィールド」は、特定のパケットのフラグメントを一意に識別します。
送信元システムは、インターネット上のパケットの存続期間中、同じ送信元 IP アドレス、宛先 IP アドレス、および「プロトコル」値を使用するすべてのパケットに対して、各パケットの「識別」フィールドを一意の値に設定します。これにより、宛先は、どの着信フラグメントが一意のパケットに属しているかを識別し、最後のフラグメントが受信されるまでそれらすべてをバッファリングできます。最後のフラグメントは「More Fragment」ビットを 0 に設定し、これにより、すべてのフラグメントが受信された場合に受信ステーションにデータの再構築を開始するように指示します。
以下は実際の断片化の例です。
以下は、Etherealプロトコル アナライザーを使用してICMP エコー要求パケットをキャプチャした結果です。これをシミュレートするには、ターミナルを開いて「ping ip_dest -n 1 -l 65000」と入力します。
結果は次のとおりです。
番号 時間 送信元 宛先 プロトコル 情報
1 0.000000 87.247.163.96 66.94.234.13 ICMPエコー(ping)要求
2 0.000000 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=1480)
3 0.002929 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=2960)
4 6.111328 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=4440)
5 6.123046 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=5920)
6 6.130859 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=7400)
7 6.170898 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=8880)
8 6.214843 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=10360)
9 6.239257 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=11840)
10 6.287109 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=13320)
11 6.302734 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=14800)
12 6.327148 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=16280)
13 6.371093 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=17760)
14 6.395507 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=19240)
15 6.434570 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=20720)
16 6.455078 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=22200)
17 6.531250 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=23680)
18 6.550781 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=25160)
19 6.575195 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=26640)
20 6.615234 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=28120)
21 6.634765 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=29600)
22 6.659179 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=31080)
23 6.682617 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=32560)
24 6.699218 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=34040)
25 6.743164 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=35520)
26 6.766601 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=37000)
27 6.783203 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=38480)
28 6.806640 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=39960)
29 6.831054 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=41440)
30 6.850586 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=42920)
31 6.899414 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=44400)
32 6.915039 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=45880)
33 6.939453 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=47360)
34 6.958984 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=48840)
35 6.983398 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=50320)
36 7.023437 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=51800)
37 7.046875 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=53280)
38 7.067382 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=54760)
39 7.090820 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=56240)
40 7.130859 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=57720)
41 7.151367 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=59200)
42 7.174804 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=60680)
43 7.199218 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=62160)
44 7.214843 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=63640)
45 7.258789 87.247.163.96 66.94.234.13 IP 断片化された IP プロトコル (proto=ICMP 0x01、off=65120)
最初のパケットの詳細:
No.時間 送信元 送信先 プロトコル 情報
1 0.000000 87.247.163.96 66.94.234.13 ICMPエコー(ping)要求
フレーム 1 (ワイヤ上で 1514 バイト、キャプチャされた 1514 バイト)
イーサネット II、ソース: OmronTat_00:00:00 (00:00:0a:00:00:00)、宛先: 40:0f:20:00:0c:00 (40:0f:20:00:0c:00)
インターネット プロトコル、送信元: 87.247.163.96 (87.247.163.96)、送信先: 66.94.234.13 (66.94.234.13)
インターネット制御メッセージプロトコル
タイプ: 8 (エコー (ping) 要求)
コード: 0
チェックサム: 0x6b7d
識別子: 0x0600
シーケンス番号: 0x0200
データ (1472 バイト)
2 番目のパケットの詳細:
番号 時間 送信元 宛先 プロトコル 情報
2 0.000000 87.247.163.96 66.94.234.13 IP 断片化されたIPプロトコル (proto=ICMP 0x01、off=1480)
フレーム 2 (ワイヤ上で 1514 バイト、キャプチャされた 1514 バイト)
イーサネット II、ソース: OmronTat_00:00:00 (00:00:0a:00:00:00)、宛先: 40:0f:20:00:0c:00 (40:0f:20:00:0c:00)
インターネット プロトコル、送信元: 87.247.163.96 (87.247.163.96)、送信先: 66.94.234.13 (66.94.234.13)
データ(1480バイト)
最初のフラグメントのみに ICMP ヘッダーが含まれ、残りのフラグメントはすべて ICMP ヘッダーなしで生成されることに注意してください。
ここで重要な点が 2 つあります。
- イーサネットなどの一部のデータリンク プロトコルでは、最初のフラグメントのみに完全な上位層ヘッダーが含まれており、他のフラグメントは先頭が切り離されたパケットのように見えます。
- すべてのフラグメントに独自の IP ヘッダーが含まれているため、ネットワークに追加のオーバーヘッドが発生します。追加のオーバーヘッド = (number_of_fragments - 1) * (ip_header_len);
エクスプロイト
- IPフラグメントが重複しています
- IP フラグメント重複エクスプロイトは、同じ IPパケット内に含まれる 2 つのフラグメントに、パケット内での位置が互いに重複していることを示すオフセットがある場合に発生します。これは、フラグメント A がフラグメント B によって完全に上書きされているか、フラグメント A がフラグメント B によって部分的に上書きされていることを意味します。一部のオペレーティング システムでは、このように重複するフラグメントが適切に処理されず、重複するフラグメントを受信すると例外がスローされたり、その他の望ましくない動作をしたりする場合があります。これがティアドロップ攻撃のベースです。重複するフラグメントは、侵入検知システムをバイパスするために使用される場合もあります。このエクスプロイトでは、攻撃の一部が追加のランダム データとともにフラグメントで送信されます。将来のフラグメントによって、ランダム データが攻撃の残りの部分で上書きされる可能性があります。完成したパケットが IDS で適切に再構成されない場合、攻撃は検出されません。
- IPフラグメンテーションバッファがいっぱいです
- IP フラグメンテーション バッファ フル エクスプロイトは、保護されたネットワーク上で不完全なフラグメント化されたトラフィックが過剰に検出された場合に発生します。これは、不完全なフラグメント化されたパケットが過剰に多い、個々のパケットのフラグメントが多数ある、または不完全なパケットの量と各パケットのフラグメントのサイズ/数の組み合わせが原因である可能性があります。このタイプのトラフィックは、攻撃活動を意図的にフラグメント化することで、セキュリティ対策または侵入検知システムを回避しようとする試みである可能性が最も高いです。
- IPフラグメントオーバーラン
- IP フラグメント オーバーラン エクスプロイトは、再構成されたフラグメント化されたパケットが宣言された IP データ長または最大パケット長を超えた場合に発生します。定義により、IP パケットは 65,535 バイトを超えてはなりません。このような大きなパケットを処理しようとするシステムはクラッシュする可能性があり、サービス拒否攻撃の兆候となる場合があります。
- IPフラグメントパケットが多すぎます
- 「パケットが多すぎる」というエクスプロイトは、ネットワーク上で不完全な断片化されたパケットが過剰に検出された場合に識別されます。これは通常、サービス拒否攻撃またはセキュリティ対策を回避しようとする試みのいずれかです。「パケットが多すぎる」、「不完全なパケット」、および「フラグメントが小さすぎる」の例としては、ローズ攻撃があります。[2]
- IPフラグメント不完全パケット
- このエクスプロイトは、データが欠落しているためにパケットを完全に再構成できない場合に発生します。これは、サービス拒否攻撃またはパケット フィルタ セキュリティ ポリシーを破ろうとする試みを示している可能性があります。
- IP フラグメントが小さすぎます
- IP フラグメントが小さすぎる場合、そのフラグメントは意図的に作成された可能性が高いことを示します。最終フラグメント以外の 400 バイト未満のフラグメントは、小さすぎるとみなされる可能性があります。小さなフラグメントは、サービス拒否攻撃や、セキュリティ対策や検出をバイパスするために使用される可能性があります。
回避のための断片化
ルーター、ロード バランサー、ファイアウォール、IDSなどのネットワーク インフラストラクチャ機器は、断片化されたパケットを一貫して認識できません。たとえば、デバイスは最初のフラグメントを厳密な検査と監査の対象としますが、追加のフラグメントはすべてチェックなしで通過させる場合があります。一部の攻撃では、この事実を利用して、フラグメントに有罪を示すペイロード データを配置することで検出を逃れる場合があります。 「フル」プロキシ モードで動作するデバイスは、通常、この策略の影響を受けません。
参考文献
外部リンク
- W. リチャード スティーブンスのホームページ
- RFC 1858
- RFC791 の翻訳
