Fortify漏洞之Insecure Randomness(不安全随机数)
繼續(xù)對(duì)Fortify的漏洞進(jìn)行總結(jié),本篇主要針對(duì) Insecure Randomness 漏洞進(jìn)行總結(jié),如下:
1、Insecure Randomness(不安全隨機(jī)數(shù))
1.1、產(chǎn)生原因:
成弱隨機(jī)數(shù)的函數(shù)是 random()。
電腦是一種具有確定性的機(jī)器,因此不可能產(chǎn)生真正的隨機(jī)性。偽隨機(jī)數(shù)生成器 (PRNG) 近似于隨機(jī)算法,始于一個(gè)能計(jì)算后續(xù)數(shù)值的種子。
PRNG 包括兩種類型:統(tǒng)計(jì)學(xué)的 PRNG 和密碼學(xué)的 PRNG。統(tǒng)計(jì)學(xué)的 PRNG 可提供有用的統(tǒng)計(jì)資料,但其輸出結(jié)果很容易預(yù)測(cè),因此數(shù)據(jù)流容易復(fù)制。若安全性取決于生成數(shù)值的不可預(yù)測(cè)性,則此類型不適用。密碼學(xué)的 PRNG 通過(guò)可產(chǎn)生較難預(yù)測(cè)的輸出結(jié)果來(lái)應(yīng)對(duì)這一問(wèn)題。為了使加密數(shù)值更為安全,必須使攻擊者根本無(wú)法、或極不可能將它與真實(shí)的隨機(jī)數(shù)加以區(qū)分。通常情況下,如果并未聲明 PRNG 算法帶有加密保護(hù),那么它有可能就是一個(gè)統(tǒng)計(jì)學(xué)的 PRNG,不應(yīng)在對(duì)安全性要求較高的環(huán)境中使用,其中隨著它的使用可能會(huì)導(dǎo)致嚴(yán)重的漏洞(如易于猜測(cè)的密碼、可預(yù)測(cè)的加密密鑰、會(huì)話劫持攻擊和 DNS 欺騙)。
示例: 下面的代碼可利用統(tǒng)計(jì)學(xué)的 PRNG 為購(gòu)買產(chǎn)品后仍在有效期內(nèi)的收據(jù)創(chuàng)建一個(gè) URL。
String GenerateReceiptURL(String baseUrl) {
Random ranGen = new Random();
ranGen.setSeed((new Date()).getTime());
return (baseUrl + ranGen.nextInt(400000000) + ".html");
}
這段代碼使用 Random.nextInt() 函數(shù)為它所生成的收據(jù)頁(yè)面生成獨(dú)特的標(biāo)識(shí)符。因?yàn)?Random.nextInt() 是一個(gè)統(tǒng)計(jì)學(xué)的 PRNG,攻擊者很容易猜到由它所生成的字符串。盡管收據(jù)系統(tǒng)的底層設(shè)計(jì)也存在錯(cuò)誤,但如果使用了一個(gè)不生成可預(yù)測(cè)收據(jù)標(biāo)識(shí)符的隨機(jī)數(shù)生成器(如密碼學(xué)的 PRNG),會(huì)更安全一些。
1.2、修復(fù)方案:
當(dāng)不可預(yù)測(cè)性至關(guān)重要時(shí),如大多數(shù)對(duì)安全性要求較高的環(huán)境都采用隨機(jī)性,這時(shí)可以使用密碼學(xué)的 PRNG。不管選擇了哪一種 PRNG,都要始終使用帶有充足熵的數(shù)值作為該算法的種子。(諸如當(dāng)前時(shí)間之類的數(shù)值只提供很小的熵,因此不應(yīng)該使用。)
Java 語(yǔ)言在 java.security.SecureRandom 中提供了一個(gè)加密 PRNG。就像 java.security 中其他以算法為基礎(chǔ)的類那樣,SecureRandom 提供了與某個(gè)特定算法集合相關(guān)的包,該包可以獨(dú)立實(shí)現(xiàn)。當(dāng)使用 SecureRandom.getInstance() 請(qǐng)求一個(gè) SecureRandom 實(shí)例時(shí),您可以申請(qǐng)實(shí)現(xiàn)某個(gè)特定的算法。如果算法可行,那么您可以將它作為 SecureRandom 的對(duì)象使用。如果算法不可行,或者您沒(méi)有為算法明確特定的實(shí)現(xiàn)方法,那么會(huì)由系統(tǒng)為您選擇 SecureRandom 的實(shí)現(xiàn)方法。
Sun 在名為 SHA1PRNG 的 Java 版本中提供了一種單獨(dú)實(shí)現(xiàn) SecureRandom 的方式,Sun 將其描述為計(jì)算:“SHA-1 可以計(jì)算一個(gè)真實(shí)的隨機(jī)種子參數(shù)的散列值,同時(shí),該種子參數(shù)帶有一個(gè) 64 比特的計(jì)算器,會(huì)在每一次操作后加 1。在 160 比特的 SHA-1 輸出中,只能使用 64 比特的輸出 [1]。”
然而,文檔中有關(guān) Sun 的 SHA1PRNG 算法實(shí)現(xiàn)細(xì)節(jié)的相關(guān)記錄很少,人們無(wú)法了解算法實(shí)現(xiàn)中使用的熵的來(lái)源,因此也并不清楚輸出中到底存在多少真實(shí)的隨機(jī)數(shù)值。盡管有關(guān) Sun 的實(shí)現(xiàn)方法網(wǎng)絡(luò)上有各種各樣的猜測(cè),但是有一點(diǎn)無(wú)庸置疑,即算法具有很強(qiáng)的加密性,可以在對(duì)安全性極為敏感的各種內(nèi)容中安全地使用。
實(shí)際解決方案:
將原本 Random sr = new Random() 換成SecureRandom sr = new SecureRandom()
1.3、預(yù)防該漏洞的開發(fā)規(guī)范:
1、需要?jiǎng)?chuàng)建隨機(jī)數(shù)時(shí),不使用 new Random() 的方式創(chuàng)建,可以選擇使用new SecureRandom() 的方式創(chuàng)建。
總結(jié)
以上是生活随笔為你收集整理的Fortify漏洞之Insecure Randomness(不安全随机数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ajax刷新iframe页面,通过ifr
- 下一篇: annexb avcc