是否有任何發行版在 KASLR 中實現比 lib/kaslr.c 中的 RDRAND 更安全的 CSPRNG(如普通原始碼中)?

是否有任何發行版在 KASLR 中實現比 lib/kaslr.c 中的 RDRAND 更安全的 CSPRNG(如普通原始碼中)?

我開始於kaslr.c並發現它使用 kaslr_get_random_long() 中定義的kaslr.h 並實施於庫/kaslr.c它可能使用 RDRAND(英特爾的硬體 PRNG)、時間戳記和至少一個系統計時器來產生更多熵。

unsigned long raw, random = get_boot_seed();
bool use_i8254 = true;

debug_putstr(purpose);
debug_putstr(" KASLR using");

if (has_cpuflag(X86_FEATURE_RDRAND)) {
    debug_putstr(" RDRAND");
    if (rdrand_long(&raw)) {
        random ^= raw;
        use_i8254 = false;
    }
}

if (has_cpuflag(X86_FEATURE_TSC)) {
    debug_putstr(" RDTSC");
    raw = rdtsc();

    random ^= raw;
    use_i8254 = false;
}

if (use_i8254) {
    debug_putstr(" i8254");
    random ^= i8254();
}

傳回值透過一些 asm 循環乘法稍微擴散。

    /* Circular multiply for better bit diffusion */
asm(_ASM_MUL "%3"
    : "=a" (random), "=d" (raw)
    : "a" (random), "rm" (mix_const));
random += raw;

get_boot_seed 似乎是一個非常簡單的線性異或 PRNG,其雜湊設定為靜態 0。

    /* Attempt to create a simple but unpredictable starting entropy. */
static unsigned long get_boot_seed(void)
{
    unsigned long hash = 0;

    hash = rotate_xor(hash, build_str, sizeof(build_str));
    hash = rotate_xor(hash, boot_params, sizeof(*boot_params));

    return hash;
}

這似乎是一種「足夠好」的方法,並想知道是否有另一個發行版對其進行了修補以使用更強大的 CSPRNG?對於性能/安全性的權衡,我可以理解這個選擇。然而,我相當肯定有人已經修補了這個,以便為硬化內核提供更多選項。

相關內容