李芳馨,劉嘉勇
(四川大學(xué) 電子信息學(xué)院信息安全研究所,四川 成都 610065)
傳輸控制協(xié)議(TCP,Transmission Control Protocol)重組主要應(yīng)用于安全產(chǎn)品中,入侵檢測中尤為常見,還有各類防火墻等。但是由于現(xiàn)今由于網(wǎng)絡(luò)數(shù)據(jù)流的激增,為了減少中央處理器(CPU,Central Processing Unit)的處理壓力,各類安全產(chǎn)品都紛紛采取硬件實現(xiàn)。硬件實現(xiàn)的好處非常多,可以自己提供緩存,大量減少內(nèi)核與應(yīng)用的交互,而且提高包截獲的速度同時準(zhǔn)確進(jìn)行包過濾。設(shè)計繁雜的采集卡甚至可以在硬件上實現(xiàn)TCP處理,但是同時帶來的成本問題也比較驚人。
而重組軟件中常常使用的是網(wǎng)絡(luò)入侵檢測開發(fā)庫(libnids,Library Network Intrusion Detection System),由于設(shè)計問題局限于對單個文件的處理,不適于對數(shù)據(jù)流的不間斷處理,同時對數(shù)據(jù)包的處理極容易出現(xiàn)差錯。
大量的數(shù)據(jù)極有可能是同時到來的,并且雜亂無章,首要的工作是要對數(shù)據(jù)流的信息進(jìn)行篩選。這部分的篩選條件包括有數(shù)據(jù)包長度,數(shù)據(jù)包頭,數(shù)據(jù)包內(nèi)容等。首先是要剔除無用雜亂的信息,其中不含內(nèi)容成分的數(shù)據(jù)包包括有長度有限且不含有特殊標(biāo)志位的純確認(rèn)字符(ACK,ACK nowledge Character)確認(rèn)包、Internet控制報文協(xié)議(ICMP ,Internet Control Message Protocol)數(shù)據(jù)包,地址解析協(xié)議(ARP,Address Resolution Protocol)數(shù)據(jù)包等等,進(jìn)行網(wǎng)絡(luò)互連協(xié)議(IP,Internet Protocol)還原的話要對硬件地址(MAC,Media Access Control)頭進(jìn)行解析分辨,確認(rèn)需要進(jìn)行處理的IP協(xié)議包,這個過程中由于網(wǎng)絡(luò)類型的緣故還可能要考慮點到點連接協(xié)議(PPPoE,Point-to-Point Protocol over Ethernet)數(shù)據(jù)包的解析。接下來進(jìn)行TCP重組的重點首先是要分辨出各個連接,分辨根據(jù)是四元組。這里面對的問題是IP分片,因為IP分片會導(dǎo)致網(wǎng)絡(luò)層頭部缺失。將需要還原的連接按四元組組建鏈條,將數(shù)據(jù)按照相應(yīng)的順序排列存儲,繼而根據(jù)數(shù)據(jù)包的內(nèi)部信息進(jìn)行進(jìn)步一處理,將內(nèi)容寫入文件當(dāng)中保存,即還原結(jié)束。這部分試圖模擬計算機(jī)終端中的處理過程,意即在經(jīng)過各個層次的數(shù)據(jù)包頭剝離之后將數(shù)據(jù)本身推入應(yīng)用層中。但是在網(wǎng)絡(luò)尤其是骨干網(wǎng)中進(jìn)行,則會面對數(shù)據(jù)量巨大,無應(yīng)用層檢錯,數(shù)據(jù)回環(huán)、數(shù)據(jù)重復(fù)等種種問題。同時導(dǎo)致了數(shù)據(jù)處理變得復(fù)雜和內(nèi)存緊張。以下提出一部分的解決方案。
每個數(shù)據(jù)包都要進(jìn)行讀取和分析,以獲取四元組分辨屬于哪個連接來進(jìn)行下一步的還原。四元組的匹配是個重要的問題,在沒有IP分片的情況下可以考慮使用針對四元組的散列算法(Hash)方式節(jié)省空間,加快匹配速度,但是這樣可能會由于Hash算法的復(fù)雜性影響整個程序[1]。
IP分片只有在第一個包中帶有網(wǎng)絡(luò)層數(shù)據(jù)包頭,意即IP分片的后續(xù)內(nèi)容中只能獲取 IP地址而沒有端口無法湊出四元組進(jìn)行分辨,此類數(shù)據(jù)包可以模糊匹配,將它設(shè)定生存期后加入到IP相合的鏈條中去,根據(jù)該連接的實際情況進(jìn)一步處理。連接在生存期中始終不出現(xiàn)第一個分片的話即認(rèn)為連接并沒有出現(xiàn)分片,將分片丟棄。IP頭中的分片順序作為IP分片排序方式,可以重組被分片的報文,但是重復(fù)的順序無論如何處理都可能會導(dǎo)致一定的差錯出現(xiàn)。
這樣的處理可能會導(dǎo)致內(nèi)存被重復(fù)數(shù)據(jù)占用。但實際上TCP連接中極力避免出現(xiàn)IP分片的出現(xiàn),影響比較微小。即便是用戶數(shù)據(jù)包協(xié)議(UDP,User Datagram Protocol),同時出現(xiàn)兩個分片連接可能性也不大[2]。
TCP頭中包含有當(dāng)前數(shù)據(jù)包的標(biāo)志位,含有創(chuàng)建、結(jié)束連接、數(shù)據(jù)確認(rèn)等,有效辨別是必須的,同時可以提高數(shù)據(jù)處理速度。TCP建立連接需要三次握手,其中包含有兩次建立連接(SYN,synchronize)標(biāo)志置位,選擇從SYN標(biāo)志開始建立連接鏈,那就需要把重復(fù)的 SYN忽略掉。而出現(xiàn)的第一個結(jié)束連接(FIN,finish)包則意味著這次連接宣告結(jié)束,可以做結(jié)束處理,及時將連接完全清空,而對重復(fù)的FIN也要忽略。連接生存期的設(shè)定可以固定,同時也可以通過是否有新連接來判定是否連接已經(jīng)結(jié)束。同樣的四元組新出現(xiàn)SYN包或者復(fù)位(RST,Reset the connection)包,即該連接宣告結(jié)束,清空連接鏈,停止該連接的重組。
由于 UDP不可靠性沒有自檢能力且沒有前后順序,只要將依次捕獲的數(shù)據(jù)包的包頭剝離,獲取數(shù)據(jù)即可,但是必須要進(jìn)行生存期處理,因為 UDP的結(jié)束沒有數(shù)據(jù)包進(jìn)行提示。但是可靠連接的TCP則相反,為了獲取相對有效數(shù)據(jù),就需要在程序中進(jìn)行比較復(fù)雜的可靠性處理。
最重要的依據(jù)就是TCP頭中的序列號字段,這部分標(biāo)志著數(shù)據(jù)包中的內(nèi)容在整個要還原內(nèi)容的位置,可以輔助檢錯并部分糾錯。正常情況下,序列號加上這次的數(shù)據(jù)長度即是下次序列號的大小。但是很容易出現(xiàn)小于或者大于預(yù)定的序列號的情況。
出現(xiàn)較小的序列號有幾種可能性:①由于超時重傳或者其他相關(guān)原因,出現(xiàn)的是純粹重復(fù)的數(shù)據(jù)包,這個最容易處理,可以直接丟棄?;蛘呤侵丿B的數(shù)據(jù)包,將預(yù)計的序列號大小減去實際的序列號大小,計算出重疊的數(shù)據(jù)長度,將這部分剔除即可獲取真實的數(shù)據(jù);②新的數(shù)據(jù)包雖然有重復(fù),但實際上是由于上一個數(shù)據(jù)包被客戶端認(rèn)定為錯誤或者其他有必要重新傳送的原因而再一次被傳遞,這個時候可以采取的措施是將新的數(shù)據(jù)包取代舊的相同序列號的數(shù)據(jù)包并入連接鏈中區(qū),這樣做可能會影響到緊跟在后面的數(shù)據(jù)包內(nèi)容。這個時候難以確認(rèn)新的數(shù)據(jù)包究竟是出于什么原因出現(xiàn)是個難題,究竟是時延太長還是新發(fā)送的內(nèi)容,同時還會影響到數(shù)據(jù)排序后的進(jìn)一步處理;③出現(xiàn)數(shù)據(jù)回環(huán),32 bit的序列號在數(shù)據(jù)包流中不斷遞增,發(fā)送序號在增長到頂峰之后,開始重新啟用較小的序列號開始重新計算。這個時候可以參考防止重復(fù)報文(PAWS,Protect Against Wrapped Sequence numbers)算法使用時間戳[3],時間戳對每個將要發(fā)送的窗口加一或者更大,可以作為判斷基準(zhǔn)。RST標(biāo)志未置位、TCP曾收到過對端發(fā)送的有效非零時間戳,當(dāng)前報文段中的時間戳小于原先收到的時間戳以上三個條件同時為真,則認(rèn)定該報文段重復(fù)丟棄。反之,則保留重新計算序列號。如果連接出現(xiàn)了很長時間的空閑,則收到的報文段時間戳值也會回繞導(dǎo)致了PAWS測試失敗。這個可能性雖然微小,但是依然不可忽視需要進(jìn)一步研究。
出現(xiàn)較大的序列號則是明顯出現(xiàn)了丟包的情況。也就是在預(yù)定的序列號和現(xiàn)在獲取的數(shù)據(jù)包中間有缺失。這個缺失的數(shù)據(jù)包可能會在一段時間后再度捕獲,但也可能是出現(xiàn)了捕獲數(shù)據(jù)流不全出現(xiàn)丟包現(xiàn)象。即時分析中想要做出判斷是十分困難的,只能進(jìn)行短暫的等待以及容忍必要的缺失。否則會影響數(shù)據(jù)處理速度和內(nèi)存占用。
在使用軟件進(jìn)行重組還原的情況下,每個數(shù)據(jù)包的處理都要先將數(shù)據(jù)包的內(nèi)容讀入內(nèi)存。并且還要進(jìn)行實時分析,新的數(shù)據(jù)會不斷涌入。這樣為了保證內(nèi)存不被擁堵,就要盡量快速的處理數(shù)據(jù)包,減少相關(guān)數(shù)據(jù)滯留在內(nèi)存的時間,盡快將數(shù)據(jù)包送出內(nèi)存[4]。
在此選擇的處理方式向客戶終端學(xué)習(xí),將數(shù)據(jù)及時推入應(yīng)用層。在這里表現(xiàn)為寫入文件。這樣在內(nèi)存中保留文件句柄,不斷將數(shù)據(jù)從內(nèi)存寫入硬盤,減少了內(nèi)存的占用。要考量的則是寫入的時機(jī)。這里同樣參考終端主機(jī)操作系統(tǒng)的處理方式。
UDP的數(shù)據(jù)沒有順序性,不過在分片情況下重組時還是會出現(xiàn)數(shù)據(jù)排序的情況。在沒有分片或者分片重組已經(jīng)結(jié)束的情況下,每來一個數(shù)據(jù)包都可以直接剝離數(shù)據(jù)包頭,將數(shù)據(jù)頂入應(yīng)用層[5]。
TCP的數(shù)據(jù)情況要復(fù)雜得多,在經(jīng)過一系列的判斷后可能采取拋棄重復(fù)報文,剪裁重復(fù)報文段等手段。但是缺包情況則在必要情況下適當(dāng)忽略,這部分參考標(biāo)志位推入(PSH,push)標(biāo)志,對于操作系統(tǒng)來說,出現(xiàn)PSH就要把數(shù)據(jù)推入應(yīng)用層進(jìn)行處理,在數(shù)據(jù)流重組的相同情況下,可以選擇近似的處理,對丟失的包進(jìn)行適當(dāng)忽略,以防止程序崩潰和緩沖區(qū)擁堵[6]。采取此種解決方式可能會出現(xiàn)的問題即是無法完善處理包只是延時而并未丟失的情況。補充完善的一種方式就是重新寫入文件,但這樣需要保留前面所有連接內(nèi)容的情況,付出的代價過大。事實上PSH字段出現(xiàn),即意味著所發(fā)出的包基本已經(jīng)到位,可以降低以上風(fēng)險。
網(wǎng)絡(luò)流匹配還原是一項非常有用的工作。網(wǎng)絡(luò)在現(xiàn)實生活中占有的比重越來越大,所承載的信息量也是越來越多,如何從同樣日漸繁雜增多的數(shù)據(jù)量中獲取有意義的數(shù)據(jù)是非常重要的[7]。而研究網(wǎng)絡(luò)數(shù)據(jù)流的即時還原獲取的信息更具有及時性。軟件實現(xiàn)這個功能要盡量用有限的資源獲取最大的信息量,并且要求有足夠的穩(wěn)定性[8]。
[1] 鄧月華.基于寬帶網(wǎng)絡(luò)的TCP報文還原與應(yīng)用研究[D].成都:四川大學(xué), 2006.
[2] 劉益洪,戴冬梅.TCP/IP的擁塞控制策略[J].通信技術(shù),2008,41(07):135-137.
[3] GARY R W, RICHARD STEVENS W.TCP/IP詳解卷二:實現(xiàn)[M].北京:機(jī)械工業(yè)出版社,2010:636.
[4] 侯新宇,王晟,駱光明.基于接收端的TCP流量控制及優(yōu)化研究[J].通信技術(shù),2007,40(10):21-22,48.
[5] DANIEL P B, MARCO Cesati.深入理解Linux內(nèi)核[M].第2版.北京:中國電力出版社,2005:223.
[6] 趙軍偉,劉勛,董浩.基于TCP協(xié)議的遠(yuǎn)程監(jiān)控系統(tǒng)的實現(xiàn)[J].中國測試,2010(01):23.
[7] 金甌,施勇,薛質(zhì).基于TCP協(xié)議的網(wǎng)絡(luò)數(shù)據(jù)實時篡改[J].信息安全與通信保密,2010(04):37.
[8] 張藝瀕,張志斌,趙詠,等.TCP與UDP網(wǎng)絡(luò)流量對比分析研究[J].計算機(jī)應(yīng)用研究,2010(06):58.