數(shù)十億物聯(lián)網(wǎng)設(shè)備使用的硬件隨機數(shù)生成器存在嚴(yán)重漏洞,無法正常生成隨機數(shù),導(dǎo)致設(shè)備安全性下降,面臨攻擊風(fēng)險。
Bishop Fox研究人員稱,這個漏洞影響了整個物聯(lián)網(wǎng)行業(yè)。關(guān)鍵是漏洞并不存在于單個設(shè)備的SDK或任何特定的SoC實現(xiàn)。物聯(lián)網(wǎng)需要一個偽隨機數(shù)生成器(CSPRNG)子系統(tǒng)。這個問題不能僅僅通過更改文檔和責(zé)備用戶來解決。對于這樣一個CSPRNG子系統(tǒng)來說,最優(yōu)雅的地方是在一個日益流行的物聯(lián)網(wǎng)操作系統(tǒng)中。如果您正在從頭開始設(shè)計一個新設(shè)備,建議在操作系統(tǒng)中實現(xiàn)一個CSPRNG。自己編寫RNG代碼應(yīng)該被認(rèn)為是危險的,就像加密代碼一樣。不管你有多聰明,永遠(yuǎn)不要自己編寫與RNG硬件接口的代碼。你幾乎肯定會弄錯。相反,您應(yīng)該使用由較低抽象層提供的CSPRNG子系統(tǒng)。不要直接從RNG硬件中使用熵。總的來說,硬件RNG不適合(立即)加密使用。弱熵可以也應(yīng)該通過軟件,通過cspring來修復(fù)。
“事實證明,當(dāng)涉及物聯(lián)網(wǎng)設(shè)備時,這些‘隨機’選擇的數(shù)字CSPRNG并不總是像你希望的那樣隨機,”Bishop Fox研究人員丹·彼得羅和艾倫·塞西爾在上周發(fā)表的一份分析報告中說?!笆聦嵣?,在很多情況下,設(shè)備選擇的加密密鑰是0或更糟。這可能會導(dǎo)致任何上游應(yīng)用的安全性崩潰?!?/p>
隨機數(shù)生成(RNG)是一個至關(guān)重要的過程,它支持多個加密應(yīng)用程序,包括密鑰生成、nonces和salt。在傳統(tǒng)的操作系統(tǒng)上,它來自一個加密安全的偽隨機數(shù)生成器(CSPRNG),該生成器使用從高質(zhì)量種子源獲得的熵。
當(dāng)涉及到物聯(lián)網(wǎng)設(shè)備時,這是由一個片上系統(tǒng)(SoC)提供的,它包含一個專用的硬件RNG的外圍設(shè)備,稱為真正的隨機數(shù)生成器(TRNG),用于從物理進程或?qū)]嬕魳罚╬henomenа)中捕獲隨機性。
研究人員指出當(dāng)前調(diào)用外圍設(shè)備的方式是不正確的,缺乏對錯誤代碼響應(yīng)的全面檢查,導(dǎo)致產(chǎn)生的隨機數(shù)不是簡單的隨機,更糟糕的是可預(yù)測的,導(dǎo)致部分熵,未初始化的內(nèi)存,甚至包含純零的加密密鑰。
研究人員指出:“RNG外圍設(shè)備的HAL功能可能會因各種原因失效,但到目前為止最常見的(也是可利用的)是設(shè)備的熵耗盡。”硬件RNG外設(shè)通過各種方式(如模擬傳感器或EMF讀數(shù))將熵從宇宙中提取出來,但并不是無限供應(yīng)的。
“它們每秒只能產(chǎn)生這么多隨機比特。如果你嘗試調(diào)用RNG HAL函數(shù)時,它沒有任何隨機數(shù)給你,它將失敗并返回一個錯誤代碼。因此,如果設(shè)備試圖快速獲取太多隨機號碼,呼叫就會開始失敗。”
這個問題是物聯(lián)網(wǎng)領(lǐng)域特有的,因為它們?nèi)狈νǔв须S機API的操作系統(tǒng)(例如,在類unix操作系統(tǒng)中是“/dev/random”,在Windows中是BCryptGenRandom),研究人員強調(diào)了與CSPRNG子系統(tǒng)相關(guān)聯(lián)的更大熵池的好處,這樣就消除了“熵源中的任何單點故障”。
雖然可以矯正軟件更新的問題,理想的解決方案是物聯(lián)網(wǎng)設(shè)備制造商和開發(fā)商包括CSPRNG API的種子從一組不同的熵源并確保代碼沒有忽略錯誤條件,或未能阻止調(diào)用RNG當(dāng)沒有更多的熵是可用時。
研究人員說:“這個漏洞的難點之一是,它不是一個簡單的‘你在應(yīng)該曲折的地方曲折了’的情況,可以很容易地修補。”他們強調(diào)了在物聯(lián)網(wǎng)操作系統(tǒng)中實現(xiàn)CSPRNG的必要性?!盀榱私鉀Q這個問題,必須在物聯(lián)網(wǎng)設(shè)備中設(shè)計一個實質(zhì)性和復(fù)雜的功能。”
最后,研究人員建議:
對設(shè)備所有者而言:
留意更新,并確保在它們可用時應(yīng)用它們。這是一個可以用軟件解決的問題,但可能需要一些時間。與此同時,要小心不要太相信你的物聯(lián)網(wǎng)設(shè)備。對于需要連接互聯(lián)網(wǎng)的家用設(shè)備,把它們放在一個只能連接到外部的專用網(wǎng)絡(luò)段。這將有助于防止任何漏洞蔓延到你的網(wǎng)絡(luò)。
對物聯(lián)網(wǎng)設(shè)備開發(fā)人員而言:
如果可能,請選擇包含從包括硬件 RNG 在內(nèi)的各種熵源中播種的 CSPRNG API 的物聯(lián)網(wǎng)設(shè)備。如果沒有可用的 CSPRNG 并且您別無選擇,請仔細(xì)檢查您所依賴的庫以及您自己的代碼,以確保您沒有使用從未初始化的內(nèi)存讀取、忽略硬件 RNG 外設(shè)寄存器或錯誤的代碼條件,或者在沒有更多可用熵時無法阻塞。仔細(xì)考慮阻塞不是可行選項的實時情況的影響。
對設(shè)備制造商/物聯(lián)網(wǎng)操作系統(tǒng)而言:
在SDK中棄用和/或禁用任何直接使用RNG HAL函數(shù)。相反,要包含一個CSPRNG API,該API使用健壯的、不同的熵源和適當(dāng)?shù)挠布NG處理。Linux內(nèi)核的/dev/urandom實現(xiàn)可以作為一個很好的參考。