我們很難用一臺電腦去生成一些不可預(yù)測的數(shù)字,因為,計算機被設(shè)計成一種以重復(fù)和準(zhǔn)確的方式去執(zhí)行一套指令的機器。所以,每個固定的算法都可以在其他機器上生成同樣的結(jié)果。如果能夠推斷遠程主機的內(nèi)部狀態(tài),攻擊者就可以預(yù)測它的輸出;即使不知道遠程主機的PNRG函數(shù),但因為算法最終會使ISN回繞,按一定的規(guī)律重復(fù)生成以前的ISN,所以,攻擊者仍然可以推斷ISN。幸運的是,目前條件下,ISN的重復(fù)可以延長到幾個月甚至幾年。但是,仍然有部分PRNG生成器在產(chǎn)生500個元素后就開始回繞。解決偽隨機數(shù)的方法是引入外部隨機源,擊鍵延時,I/O中斷,或者其它對攻擊者來說不可預(yù)知的參數(shù)。把這種方法和一個合理的HASH函數(shù)結(jié)合起來,就可以產(chǎn)生出32位的不可預(yù)知的TCP ISN的值,同時又隱蔽了主機的PNRG的內(nèi)部狀態(tài)。不幸的是,很少的TCP ISN產(chǎn)生器是按這種思路去設(shè)計的,但即使是這樣設(shè)計的產(chǎn)生器,也會有很多的實現(xiàn)上的漏洞使這個產(chǎn)生器產(chǎn)生的ISN具有可猜測性。
RFC1948的建議提供了一種比較完善的方法,但是,對攻擊者來說,ISN仍然存在著可分析性和猜測性。其中,PRNG的實現(xiàn)是個很關(guān)鍵的地方。
Spoofing 集合 需要知道一點是,如果我們有足夠的能力能夠同時可以發(fā)出232個包,每個包由不同的ISN值,那么,猜中ISN的可能性是100%。但是,無論從帶寬或計算機的速度來說都是不實際的。但是,我們?nèi)匀豢梢园l(fā)大量的包去增加命中的幾率,我們把這個發(fā)出的攻擊包的集合稱為Spoofing集合。通常,從計算機速度和
網(wǎng)絡(luò)數(shù)據(jù)上傳速率兩方面來考慮,含5000個包的Spoofing的集合對眾多的網(wǎng)絡(luò)用戶是沒有問題的,5000-60000個包的Spoofing集合對寬帶網(wǎng)的用戶也是不成問題的,大于60000個包的Spoofing集合則超出一般攻擊者的能力。網(wǎng)絡(luò)的速度和計算機性能的不斷增加會提高那種使用窮盡攻擊方法猜測ISN的成功率。從攻擊者的立場,當(dāng)然希望能夠通過定制一個盡可能小的Spoofing集合,而命中的幾率又盡可能高。我們假定我們攻擊前先收集50000個包作為ISN值的采樣,然后,我們把這些ISN用作對將來的ISN的值猜測的依據(jù)。
一種稱為“delay coordinates”的分析方法
在動態(tài)系統(tǒng)和非線性系統(tǒng)中,經(jīng)常使用一種叫做“delay coordinates”的分析法,這種方法使我們可以通過對以前的數(shù)據(jù)的采樣分析來推想以后的數(shù)據(jù)。
我們試圖以建立一個三維空間(x,y,z)來觀察ISN值(seq[t])的變化,其中t取0,1,2, ……

(圖6)
方程組(E1)
現(xiàn)在,對采樣了的50000個ISN序列seq[t] 按照上面的三個方程式來構(gòu)建空間模型A。這樣,就可以通過A的圖像特征來分析這個PNRG生成的ISN值的規(guī)律。A呈現(xiàn)的空間模型的3D特性越強,它的可分析性就越好。
接著,我們根據(jù)這個模型,去分析下一個ISN值seq[t],為此,我們用一個集合K(5000個)去猜測seq[t]。
如果我們知道seq[t-1],要求seq[t],那么,可以通過在這個三維空間中找出一個有良好特性的節(jié)點P(x,y,z),將P.x+seq[t-1],我們就可以得到seq[t]?,F(xiàn)在,我們將注意力放到怎樣在這個三維空間中選擇一些點來構(gòu)成Spoofing集合,也就是怎樣通過seq[t-1],seq[t-2],sea[t-3]來推知seq[t]。
由于seq[t-1],seq[t-2],seq[t-3]都可以很容易地在遠程主機上探測到,于是,P.y和P.z可以通過以下的公式求出

(圖7)
而對于P.x=seq[t]-seq[t-1], 由于seq[t-1]已知,所以,我們可以把它當(dāng)作是空間的一條直線。如果,在對以前的ISN的采樣,通過上面提到的構(gòu)成的空間模型A呈現(xiàn)某種很強的特征,我們就可以大膽地假設(shè),seq[t]在直線與A的交點上,或者在交點的附近。這樣,seq[t]就這樣確定了,于是,seq[t+1],seq[t+2]……,我們都可以推斷出來。

(圖8)
于是,我們大致將構(gòu)造Spoofing集合分成3個步驟:
先選取L與A交點之間的所有點。如果,L與A沒有交點,我們則選取離L最近的A的部分點。
假設(shè)現(xiàn)在 seq[t-1]=25
seq[t-2]=50
seq[t-3]=88
于是,我們可以計算出
y = seq[t-1] - seq[t-2]=25
z = seq[t-2] - seq[t-3]=33
而我們在集合A中找不到滿足y=25,z=33這個點,但是,我們找到y(tǒng)=24,z=34和y=27,z=35這兩個點,所以,我們要把它們加入Spoofing集合。
我們按照上面的方法,把在A附近(半徑<=R1的空間范圍內(nèi))點集M找出來,然后,我們根據(jù)這些點的相應(yīng)的x值去推導(dǎo)相應(yīng)的seq[t](按照一定的算法,后面會提到),于是,我們就得到很多的seq[t]。
根據(jù)點集M(j),我們在一定的變化浮動范圍U里(-R2<=U<=+R2)處理其x值,得出以下的集合K:
M(j).x+1 M(j).x-1 M(j).x+2 M(j).x-2 M(j).x+3 M(j).x-3 …… M(j).x+R2 M(j)-R2
接著我們確定R1和R2的值
R1值的選取的原則:使M不為空集,一般為1-500個。
R2值的選取的原則:使K的個數(shù)為5000。
對TCP ISN的PRNG分析的總體流程: