最簡單的基于IP的攻擊可能要數著名的死亡之ping(英文:ping of 死亡, POD),這種攻擊主要是由于單個包的長度超過了IP協議規范所規定的包長度。產生這樣的包很容易,事實上,許多操作系統都提供了稱為ping的網絡工具。在為Windows操作系統中開一個DOS窗口,輸入ping -l 65500 目標ip -t (65500 表示數據長度上限,-t 表示不停地ping目標地址)就可達到該目的。unix系統也有類似情況。早期的電腦大部分無法處理大于IPv4最大封包大小(65,535字節)的ping封包,因此發送這樣大小的ping可以令目標電腦崩潰。在1997-1998年后,幾乎所有的現代系統都已經修正了這個問題。
工作
死亡之ping是如何工作的呢,首先是因為以太網長度有限,IP包片段被分片。當一個IP包的長度超過以太網幀的最大尺寸(以太網頭部和尾部除外)時,包就會被分片,作為多個幀來發送。接收端的機器提取各個分片,并重組為一個完整的IP包。在正常情況下,IP頭包含整個IP包的長度。當一個IP包被分片以后,頭只包含各個分片的長度。分片并不包含整個IP包的長度信息,因此IP包一旦被分片,重組后的整個IP包的總長度只有在所有分片都接受完畢之后才能確定。
在IP協議規范中規定了一個IP包的最大尺寸,而大多數的包處理程序又假設包的長度超過這個最大尺寸這種情況是不會出現的。因此,包的重組代碼所分配的內存區域也最大不超過這個最大尺寸。這樣,超大的包一旦出現,包當中的額外數據就會被寫入其他正常區域。這很容易導致系統進入非穩定狀態,是一種典型的CPU緩存溢出(Buffer Overflow)攻擊。在防火墻一級對這種攻擊進行檢測是相當難的,因為每個分片包看起來都很正常。
由于使用ping工具很容易完成這種攻擊,以至于它也成了這種攻擊的首選武器,這也是這種攻擊名字的由來。當然,還有很多程序都可以做到這一點,因此僅僅阻塞ping的使用并不能完全解決這個漏洞。預防死亡之ping的最好方法是對操作系統打補丁,使內核將不再對超過規定長度的包進行重組。
在早期TCP/IP的實現中,這種攻擊方式能影響到眾多系統,如unix、Linux、麥金塔、Windows、打印機、路由器等。這是一種專門針對一種弱點的非常簡單的攻擊。一般而言,在ICMP規范中,ICMP回送消息在數據包的數據部分只有65,536個字節。送出超過65,536字節ping封包對IP通訊協定而言不是合法的用法,若送出ping封包時分成多個片段,目標電腦必須不斷重組封包,期間可能引發緩沖區溢位,而導致系統崩潰。
現象
這個問題出現在早期的Windows內,不過在接近Windows Me的時候已經見不到了。不僅已經ping不到65500以上,各大網站限制數據包傳入大小來防止有人用多臺電腦同時ping一個ip導致癱瘓,一般大型網站把數據包壓到3000以下;而服務器或者dns一般把數據包壓到10000以下來防止這個問題,超過數值會提示連接超時。
參考資料 >