死亡之Ping
死亡之Ping
最簡單的基於IP的攻擊可能要數著名的死亡之ping,這種攻擊主要是由於單個包的長度超過了IP協議規範所規定的包長度。產生這樣的包很容易,事實上,許多操作系統都提供了稱為ping的網路工具。在為Windows操作系統中開一個DOS窗口,輸入ping -l 65500 目標ip -t (65500 表示數據長度上限,-t 表示不停地ping目標地址)就可達到該目的。UNIX系統也有類似情況。
死亡之ping(Ping of Death)
死亡之ping是如何工作的呢?首先是因為乙太網長度有限,IP包片段被分片。當一個IP包的長度超過乙太網幀的最大尺寸(乙太網頭部和尾部除外)時,包就會被分片,作為多個幀來發送。接收端的機器提取各個分片,並重組為一個完整的IP包。在正常情況下,IP頭包含整個IP包的長度。當一個IP包被分片以後,頭只包含各個分片的長度。分片並不包含整個IP包的長度信息,因此IP包一旦被分片,重組后的整個IP包的總長度只有在所在分片都接受完畢之後才能確定。
在IP協議規範中規定了一個IP包的最大尺寸,而大多數的包處理程序又假設包的長度超過這個最大尺寸這種情況是不會出現的。因此,包的重組代碼所分配的內存區域也最大不超過這個最大尺寸。這樣,超大的包一旦出現,包當中的額外數據就會被寫入其他正常區域。這很容易導致系統進入非穩定狀態,是一種典型的緩存溢出(Buffer Overflow)攻擊。在防火牆一級對這種攻擊進行檢測是相當難的,因為每個分片包看起來都很正常。
由於使用ping工具很容易完成這種攻擊,以至於它也成了這種攻擊的首選武器,這也是這種攻擊名字的由來。當然,還有很多程序都可以做到這一點,因此僅僅阻塞ping的使用並不能完全解決這個漏洞。預防死亡之ping的最好方法是對操作系統打補丁,使內核將不再對超過規定長度的包進行重組。