為什麼Linux核心使用get_random_int()來產生stack_canary或stack_top?

為什麼Linux核心使用get_random_int()來產生stack_canary或stack_top?

Linux核心中有一個隨機數產生器。這通常稱為 LRNG(Linux 隨機數產生器)。我們可以透過呼叫來使用它get_random_bytes()。但stack_canarystack_top是由 產生的get_random_int()。雖然Linux核心有自己很好的隨機數產生器(LRNG),但是為什麼Linux核心要產生它呢get_random_int()?我認為這可能是因為效率。這樣對嗎?

答案1

只是閱讀原始碼:

取得僅供內部核心使用的隨機字。與 urandom 類似,但目標是最小化熵池消耗。因此,隨機值在加密上並不安全,但對於多種用途而言,消耗熵的成本太高

這就是為什麼get_random_int不只獲取 的輸出get_random_bytes。事實上,這裡的論點是錯的,原因有二:

  • 熵實際上並沒有耗盡。這只是內核內部的虛假計算。
  • 即使熵確實耗盡了,也沒有理由不使用加密安全的偽隨機數產生器而不是臨時構造。只需使用與耗盡 熵的實例不同的實例即可/dev/random。性能可能是一個原因,但適當的 CSPRNG(例如 Hash_DRBG/SHA-2)與此處使用 MD5 的臨時構造之間的差異很小。

答案2

Linux 的/dev/random/dev/urandom、 和get_random_bytes()綁定到同一個內部熵池。僅用於 RNG 時很可能會耗盡它並導致/dev/random阻塞並/dev/urandom產生低熵輸出。這種低熵條件為加密帶來了問題。

相關內容