程式碼安全測試第十六期:使用不安全的隨機值漏洞

zktq2021發表於2021-06-09

一、什麼是使用不安全的隨機值?

軟體依賴於不可預測的數值使用了不充分的隨機數導致的安全性降低。

產生原因:計算機是一種按照既定演算法執行的機器,因此不可能產生真正的隨機性。偽隨機數生成器 (PRNG) 近似於隨機演算法,始於一個能計算後續數值的種子。

PRNG包括兩種型別: 統計學的PRNG密碼學的PRNG

統計學的PRNG可提供有用的統計資料,但其輸出結果很容易預測,因此資料流容易複製。若安全性取決於生成數值的不可預測性,則此型別不適用。密碼學的PRNG透過可產生較難預測的輸出結果來應對這一問題。為了使加密數值更為安全,必須使攻擊者根本無法、或極不可能將它與真實的隨機數加以區分。通常情況下,如果並未宣告PRNG演算法帶有加密保護,那麼它有可能就是一個統計學的PRNG,不應在對安全性要求較高的環境中使用。

Java API中提供了java.util.Random類實現PRNG(),該PRNG是可移植和可重複的,如果兩個java.util.Random類的例項使用相同的種子,會在所有Java實現中生成相同的數值序列。

二、使用不安全的隨機值漏洞構成條件有哪些?

滿足一以下條件,就構成了一個該型別的安全漏洞:

1、使用存在風險的產生隨機數方法;

2、使用不可信資料作為種子。

三、使用不安全的隨機值漏洞會造成哪些後果?

關鍵詞:旁路保護機制;獲得特權或假定身份;其他

可能會導致嚴重的安全漏洞如易於猜測的密碼、可預測的加密金鑰、會話劫持攻擊和 DNS 欺騙。

四、使用不安全的隨機值漏洞的防範和修補方法有哪些?

1、使用目前被業界專家認為較強的經過良好稽核的加密PRNG演算法,初始化隨機數生成器時使用具有足夠長度且不固定的種子。

2、在安全性要求較高的應用中,應使用更安全的隨機數生成器,如java.security.SecureRandom類。

Java 語言在 java.security.SecureRandom 中提供了一個加密 PRNG。就像 java.security 中其他以演算法為基礎的類那樣,SecureRandom 提供了與某個特定演算法集合相關的包,該包可以獨立實現。當使用 SecureRandom.getInstance() 請求一個 SecureRandom 例項時,您可以申請實現某個特定的演算法。如果演算法可行,那麼您可以將它作為 SecureRandom 的物件使用。如果演算法不可行,或者您沒有為演算法明確特定的實現方法,那麼會由系統為您選擇 SecureRandom 的實現方法。

五、使用不安全的隨機值漏洞樣例:

用悟空 靜態程式碼檢測工具分析 上述程式程式碼,則可以發現程式碼中存在著“使用不安全的隨機值” 導致的 程式碼缺陷 ,如下圖:

使用不安全的隨機值在CWE中被編號為CWE-330: Use of Insufficiently Random Values


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70000012/viewspace-2776103/,如需轉載,請註明出處,否則將追究法律責任。

相關文章