互聯網控制報文協議(ICMP)安全剖析
ICMP全稱Internet Control Message Protocol,中文名為互聯網控制報文協議。它工作在OSI的網絡層,向數據通信中的源主機報告錯誤。ICMP可以實現故障隔離和故障恢復。網絡本身是不可靠的,在網絡傳輸過程中,可能會發生許多突發事件并導致數據傳輸失敗。網絡層的IP協議是一個無連接的協議,它不會處理網絡層傳輸中的故障,而位于網絡層的ICMP協議恰好彌補了IP的缺限,它使用IP協議進行信息傳遞,向數據包中的源端節點提供發生在網絡層的錯誤信息反饋。
ICMP的報頭長8字節,結構如圖1所示。
圖1 ICMP報頭結構
其各字段具體含義如下:
· 類型:標識生成的錯誤報文,它是ICMP報文中的第一個字段;
· 代碼:進一步地限定生成ICMP報文。該字段用來查找產生錯誤的原因;
· 校驗和:存儲了ICMP所使用的校驗和值;
· 未使用:保留字段,供將來使用,缺省值設為0;
· 數據:包含了所有接收到的數據報的IP報頭。還包含IP數據報中前8個字節的數據。
ICMP協議提供的診斷報文類型如表1所示。
表1 ICMP診斷報文類型
ICMP提供多種類型的消息為源端節點提供網絡層的故障信息反饋,它的報文類型可以歸納為以下5個大類:
· 診斷報文(類型8,代碼0;類型0,代碼0);
· 目的不可達報文(類型3,代碼0-15);
· 重定向報文(類型5,代碼0-4);
· 超時報文(類型11,代碼0-1);
· 信息報文(類型12-18)。
ICMP安全問題分析
由于在早期的階段,路由器對包的最大尺寸都有限制,許多操作系統對TCP/IP棧的實現在ICMP包上都是規定64KB,并且在對包的標題頭進行讀取之后,要根據該標題頭里包含的信息來為有效載荷生成緩沖區,當產生畸形的,聲稱自己的尺寸超過ICMP上限的包也就是加載的尺寸超過64KB上限時,就會出現內存分配錯誤,導致TCP/IP堆棧崩潰,致使接收方宕機。這就是所說的“ping of death”,現在網絡上很多號稱能夠致使系統死機的軟件都基于這個原理,我們所熟悉的Windows上的攻擊工具“Winnuke”就是一個典型的例子。
對路由器而言,向Intel Express Switch或其后的主機發送畸形的ICMP包可能導致系統崩潰。通過本地或遠程發送的畸形包能蒙騙服務器。當服務器收到畸形的ICMP包時,它將繼續檢查才對,不然它將丟失所有的路由功能,而且將不檢查其他連接了。主要影響Intel Express Switch 500 系列。另外,Windows也有拒絕服務漏洞,對 Windows 98/NT/2000都有影響 ,當如上系統收到非法碎片包,包含不合法碎片 ICMP ECHOs(pings)和UDP packets攻擊,Windows系統會拒絕服務,直至CPU占用率達到100%,最后系統崩潰。
ICMP重定向提供了一種相當有效的DoS(Denial of Services,拒絕服務攻擊)。不像ARP入口,這些特定主機路由入口永不過期。注意,攻擊沒有要求必須從局域網內發起,事實可以從廣域網上發起。如果子網所用DNS位于網關外,產生一個到該DNS的錯誤路由是很容易的。
另外,大量的ICMP消息發送給目標系統,使得它不能夠對合法的服務請求做出響應。中美黑客大戰中的多數中國黑客采用的正是此項技術。ICMP FLOOD攻擊實際上是一種兩敗俱傷的攻擊方式,在主機“瘋狂”地向攻擊目標發送ICMP消息的時候,主機也在消耗自身的系統資源。如果自身的網絡資源小于目標的話,這種攻擊就是“蚍蜉撼大樹”。因此,ICMP FLOOD攻擊為了達到很好的效果,往往要聯合多臺機器同時攻擊同一臺機器,從而形成分布式拒絕服務攻擊(DDoS)。
出于系統安全性的考慮,在ICMP中有八條配置命令,可以分別用來禁止或使能四種類型的ICMP報文的發送。
· ICMP echo enable,ICMP echo disable,利用這兩條命令可以使能或禁止ICMP的echo reply報文的發送。一旦禁止該類型的報文,從其他機器利用ping命令搜索該路由器時,路由器將不作出反應。
· ICMP mask enable,ICMP mask disable,利用這兩條命令可以使能或禁止ICMP的Mask Reply報文的發送。當在路由器上禁止該類型的報文時,路由器對于來自其他機器的mask reguest請求不作出反應。
· ICMP unreach enable,ICMP unreach disable,利用這兩條命令可以使能或禁止Destination Unreachable報文的發送。當在路由器上禁止該類型的報文時,路由器對于其無法轉發的IP報文將不再向其源地址發送Destination Unreachable的報文。利用show ICMP命令可以觀察當前ICMP以上各項的設置。
· ICMP redirect enable,ICMP redirect disable,利用這兩條命令可以使能或禁止ICMP的重定向(redirect)報文的發送。當在路由器上禁止該類型的報文時,路由器對于可能的路由錯誤不作出反應。
避免ICMP重定向欺騙的最簡單方法是將主機配置成不處理ICMP重定向消息,在Linux下可以利用防火墻明確指定屏蔽ICMP重定向包。
另一種方法是驗證ICMP的重定向消息。例如檢查ICMP重定向消息是否來自當前正在使用的路由器。這要檢查重定向消息發送者的IP地址并校驗該IP地址與ARP高速緩存中保留的硬件地址是否匹配。ICMP重定向消息應包含轉發IP數據報的頭信息。報頭雖然可用于檢驗其有效性,但也有可能被窺探儀加以偽造。無論如何,這種檢查可增加你對重定向消息有效性的信心,并且由于無須查閱路由表及ARP高速緩存,所以做起來比其他檢查容易一些。