Ping of death

ping of death（しばしばPoDと略記される）とは、規格外や悪意のあるpingを送りつけることによる、コンピュータシステムへの攻撃の一種である。
通常であればpingパケットのサイズは56バイト（IPヘッダを入れて64バイト）である。また、Internet Protocolを規定しているRFC 791では、（pingを含む）全てのIPv4パケットの最大サイズは65,535バイトと規定しており、多くのコンピュータシステムは最大パケットサイズを超える大きさのpingパケットを適切に処理できるように設計されていない。しかし、IPフラグメントの仕様の欠陥をついて最大サイズを超える大きさのpingを送信することができ、これを受信したコンピュータでバッファオーバーフローが発生して、システムがクラッシュする可能性がある。
TCP/IPの初期の実装では、このバグは悪用されやすく、Unix、Linux、Macintosh、Windows、および周辺機器を含む様々なシステムに影響を及ぼす可能性がある。ファイアウォールなどでping of deathへの対策が施されるようになると、pingを利用したと呼ばれる別の種類の攻撃が行われるようになった。これは、通常のトラフィックがシステムに到達できないほど多くの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で修正された。この脆弱性に対するはCVE-2013-3183である。