ping of death (しばしばPoD と略記される)とは、規格外や悪意のあるping を送りつけることによる、コンピュータシステムへの攻撃の一種である。
通常であればpingパケット のサイズは56バイト (IPヘッダ を入れて64バイト)である。また、Internet Protocol を規定しているRFC 791 では、(pingを含む)全てのIPv4 パケットの最大サイズは65,535バイトと規定しており、多くのコンピュータシステムは最大パケットサイズを超える大きさのpingパケットを適切に処理できるように設計されていない[ 1] 。しかし、IPフラグメント の仕様の欠陥をついて最大サイズを超える大きさのpingを送信することができ、これを受信したコンピュータでバッファオーバーフロー が発生して、システムがクラッシュ する可能性がある。
TCP/IP の初期の実装では、このバグは悪用されやすく、Unix 、Linux 、Macintosh 、Windows 、および周辺機器を含む様々なシステムに影響を及ぼす可能性がある。ファイアウォール などでping of deathへの対策が施されるようになると、pingを利用したping flood と呼ばれる別の種類の攻撃が行われるようになった。これは、通常のトラフィックがシステムに到達できないほど多くのping requestを対象のコンピュータに送りつける、DoS攻撃 の一種である。
詳細な説明
RFC 791 で定義されているように、IPヘッダを含むIPv4パケットの最大パケット長は65,535(=216 − 1)バイトである。これは、IPヘッダにおけるパケット長を格納するフィールドが16ビット幅であることによる制限である。
IPの基礎となるデータリンク層 では、ほとんどの場合に、MTU(Maximum Transmission Unit )として最大フレームサイズに制限が設けられている。イーサネット では、MTUは通常1500バイトである。この場合、MTUを超える大きなIPパケットは、MTU以下のサイズの複数のIPパケットに分割される(これをフラグメント という)。受信側では、分割されたパケットから元のIPパケットを再構成する。
フラグメントが実行されるとき、それぞれの分割されたパケットは、元のIPパケットのどの部分であるかの情報を運ぶ必要がある。この情報は、IPヘッダのFragment Offsetフィールドに保持されている。このフィールドは13ビット長で、元のIPパケット内の現在のIPフラグメント内のデータのオフセットを含む。オフセットは8バイト単位で与えられる。これにより、最大オフセットは65,528(=(213 -1)×8)まで可能になる。これに20バイトのIPヘッダを追加すると、最大長は65,548バイトになり、最大パケット長を超える。これは、最大のオフセット値を持つIPフラグメントパケットに含まれるデータが7バイト以下でなければ、最大パケット長の制限を超えてしまうことを意味する。悪意のあるユーザーは、最大のオフセット値を持つIPフラグメントパケットに8バイト以上のデータ(物理層で許容されるサイズ以上)を送信し、攻撃に利用する。このようなパケットを受信したコンピュータでは、IPフラグメントパケットを再構成したときに、65,535バイトより大きいIPパケットが生成されることになる。 これは、受信側のコンピュータで受信パケットに割り当てたメモリバッファをオーバーフロー させ、様々な問題を引き起こす可能性がある。
上記の説明から明らかなように、これはIPフラグメントの再構成プロセスにおける問題であり、pingやICMP に限らず、IPを利用するあらゆるタイプのプロトコル(TCP 、UDP 、IGMP など)で起こり得る。
対策として、再構成プロセスにチェック機構を追加する手法がある。各着信IPフラグメントパケットについて、IPヘッダ内の"Fragment Offset"フィールドと"Total length"フィールドの合計値が65,535以下であることを確認する。合計値が大きければ、そのパケットは無効であり、IPフラグメントは無視される。このチェックは、バグが修正されていないホストを保護するために、一部のファイアウォール で実行されている。別の対策として、パケットの再構成に65,535バイトを超えるメモリバッファを割り当てる方法もあるが、これはRFCで規定されている以上のパケットの受信を許可することになり、仕様に反する。
IPv6のping of death
2013年、Microsoft Windows でIPv6 のping of deathの脆弱性が発見された。不正な形式の受信したICMPv6 パケットを処理するときに、Windows TCP/IPスタックがメモリ割り当てを正しく処理しなかったため、リモートからサービス拒否が起こる可能性がある。この脆弱性は2013年8月にMS13-065で修正された[ 2] [ 3] 。この脆弱性に対するCVE-ID (英語版 ) はCVE-2013-3183である[ 4] 。
関連項目
脚注
外部リンク