沈佳威
(杭州師范大學錢江學院 計算機科學與技術系,浙江 杭州 310012)
隨著蠕蟲技術的不斷友展,關于蠕蟲的定義也在不斷發展,下面給出了一個就目前而言比較全而的定義:“網絡蠕蟲是一種智能化、自動化,綜合網絡攻擊、密碼學和計算機病毒技術,不需要計算機使用者干預即可運行的攻擊程序或代碼。它會掃描和攻擊網絡上存在系統漏洞的節點主機,通過局域網或者國際互聯網從一個節點傳播到另外一個節點。”該定義體現了新一代網絡蠕蟲智能化、自動化和高枯術化的特征。
蠕蟲進行漏洞攻擊和復制感染之前首先需要進行主機掃描。TCPSYN,ACK,RST,FIN 以及IcmP PING 包都可實現對主機的掃描。良好的掃描策略能夠加速蠕蟲的傳播,理想化的掃描策略能夠使蠕蟲在最短時間內發現網絡中全部可以感染的主機。按照蠕蟲對目標地址空間的選擇方式進行分類,掃描策略可分為:隨機掃描和順序掃描等。
隨機掃描會對整個地址空間的IP 隨機抽取進行掃描,所選的目標地址按照一定的算法隨機生成,互聯網地址空間中未分配的或者保留的地址塊不在掃描之列。例如,Bogon 列表中包含近32個地址塊,這些地址塊對網絡中不可能出現的一些地址進行了標識。隨機掃描具有算法簡單、易實現的特點,若與本地優先原則結合,則能達到更好的傳播效果。但選擇性隨機掃描容易引起網絡阻塞,使得網絡蠕蟲在爆發之前易被發現,隱蔽性差。CodeRed,Slapper 和Slammer 的傳播采用了選擇性隨機掃描策略。
順序掃描是指被感染主機上蠕蟲會隨機選擇一個C 類網絡地址進行傳播。根據本地優先原則,蠕蟲一般會選擇它所在網絡內的IP 地址。若蠕蟲掃描的目標地址IP 為A,則掃描的下一個地址IP 為A+1。一旦掃描到具有很多漏洞主機的網絡時就會達到很好的傳播效果。該策略的不足是對同一臺主機可能重復掃描,引起網絡擁塞。W32.Blaster 是典型的順序掃描蠕蟲。
在基于P2P 的分布式蠕蟲檢測系統中,各節點采用旁路偵聽的方式監控各自對應的邊界網絡,需要對出入該網絡的所有網絡報文進行報文還原,即進行IP 分片重組和TCP 數據流還原,才能進一步進行蠕蟲的檢測和分析。但是,隨著網絡規模的擴大、帶寬的增長、技術的進步、用戶數量的急劇暴漲,高速網絡環境越來越多,當前旁路偵聽遇到的一個突出問題是數據處理速度受到極大的挑戰。所以,如何解決蠕蟲檢測系統的數據處理能力是急需解決的問題。
報文捕獲就是將某個網絡設備看到的數據報文完整的收集起來,不管這些報文是發往哪個地址,哪個端口,然后對其進行進一步的處理和分析。報文一般不通過操作系統的協議棧進行處理。而是直接由應用程序進行直接處理。因為報文捕獲程序處理的一般都不是發往本機的數據報文,而是根據應用有特殊要求的,所以不能通過系統的協議棧進行處理,需要應用程序將報文捕獲井實現用戶態下的協議棧,以實現IP 分片重組和TCP 數據流的還原,再送至上一層進行處理和分析。
隨著百兆以太網、ATM、千兆以太網廣泛應用,主機對網絡報文的處理性能逐漸成為一個瓶頸。而同時,SMP 體系結構的計算機的應用,大大提高了硬件系統的處理能力,但是單線程的程序卻無法充分發揮SMP 體系結構計算機的性能,這是因為當前的操作系統無法將單線程的程序同時在多個CPU 上運行。
3.3.1 多線程協議棧處理技術
為了充分發揮SMP 計算機的性能,只有將單線程的程序進行多線程化。因此,我們將傳統的單線程協議棧改造成多線程并行TCP/IP 協議棧,也就是在系統中同時運行多個TCP/IP 協議棧處理線程,讓它們在多個CPU 上并行操作,來充分利用硬件系統的計算能力。
3.3.2 抵御蠕蟲掃描的協議棧優化
蠕蟲進行漏洞攻擊和復制感染之前首先需要進行主機掃描。TCPSYN,ACK,RST,FIN 以及IcmP PING 包都可實現對主機的掃描,其中利用TCP SYN 報文進行掃描占主要部分。因此一旦蠕蟲爆發后網絡中將出現大量的無用TCP SYN 包,即只完成TCP 三次握手連接過程中的第一次握手。通常報文捕獲系統會以TCP SYN包的出現作為一個TCP 連接建立的開始而為這個TCP 連接分配一個TCP 描述符,以記錄該連接的上下文信息。而一旦網絡中出現大量的無用TCP SYN 包后,系統將會為這些大量的實際不存在的TCP 連接分配描述符,而系統所具備的TCP 連接描述符的數量是有限的,因此真正建立連接的TCP 連接將會因為TCP 連接描述符被占盡而無法被處理。這個現象類似于針對服務器的SYN Flood 攻擊。對此,我們修改目前協議棧對TCP 連接的處理過程:系統預先分配一個輕量級描述符LWD(lightweight descriptor)緩沖池。在這個LWD 中,只保存源地址、目的地址、源端口、目的端口、TCP 序號以及TCP 應答序號,這個輕量級描述符相對于TCP 連接描述符來說代價非常小。當系統捕獲一個TCP SYN包即三次握手中的第一次握手后,不會立即分配一個TCP 連接描述符,而是分配一個LWD,而等到系統捕獲后續的第二次握手和第三次握手后,說明當前TCP 連接已經建立成功,此時才給當前TCP 連接分配一個TCP 連接描述符,并將對應的LWD 釋放。為了提高杳找相應連接對應的LWD 的速度,采用可以唯一確定一個TCP連接的四元組(源地址,源端口,目的地址,目的端口)信息作為散列值,創建散列表。把散列值相同的LWD 了中用鏈表表聯系起來。對此,我們修改目前協議棧對TCP 連接的處理過程,系統先分配一個輕量級描述符LWD(lightweight descriptor)緩沖池。在這個LWD 中,只保存源地址、目的地址、源端口、目的端口、TCP 序號以及TCP 應答序號,這個輕量級描述符相對于TCP連接描述符來說代價非常小。當系統捕獲一個TCP SYN 包即三次握手中的第一次握手后,不會立即分配一個TCP 連接描述符,而是分配一個LWD,而等到系統捕獲后續的第二次握手和第三次握手后,說明當前TCP 連接已經建立成功,此時才給當前TCP 連接分配一個TCP 連接描述符,將對應的LWD 釋放。為了提高查找相應連接對應的LWD 的速度,采用可以唯一確定一個TCP 連接的四元組(源地址,源端口,目的地址,目的端口)信息作為散列值,創建散列表。把散列值相同的LWD 使用鏈表聯系起來。
我們在曙光服務器上以小同的線程數啟動報文還原程序處理同樣的數據樣本,其中測試環境為Intel Xeon 3.06GHz X 4CPU} 4G 內存,操作系統為Redhat9.0SMP。從測試結果可以看出:在單線程的情況下,程序只能串行執行,因而無法發揮多處理器的能力,隨著線程數的增長,協議棧的吞吐量也隨之升高。另外從測試結果也可以看出,協議棧線程數大于CPU 的數目的時候,提高線程數仍然可以提高吞吐量,這是因為Linux 采用的是時間片輪轉的調度算法,當協議棧的井發線程數增加的時候,單位時間內協議棧程序分配到的時間片就會相應增加,因而吞吐量也會相應增加。
我們設定協議棧井發線程數目為8個線程,分別運行優化了TCP 連接處理的報文還原程序和沒有優化TCP 連接處理的報文還原程序,采用SmartBits 產生測試的100000pps 的TCP 流量,其中1%的數據包是無用的,TCP SYN 包以模擬蠕蟲掃描過程產生的大量TCP SYN 包,運行30分鐘后分別記錄兩個協議棧所處理的應用層數據量,有測試結果可以看出優化前由于對每個TCP SYN 報都分配描述符,導致協議棧實際處理的數據僅為54570MBytes,而優化后的協議棧處理的數據為76475Mbytes,大大提高了協議棧所處理的實際數據量。
[1]文偉平,卿斯漢,蔣建春,王業君.網絡蠕蟲研究與進展,軟件學報,2004年.
[2]卿斯漢,文偉平,蔣建春等.一種基于網狀關聯分析的網絡蠕蟲預警新方法,軟件學報,2004年.