標準ソースの lib/kaslr.c の RDRAND よりも安全な CSPRNG を KASLR に実装しているディストリビューションはありますか?

標準ソースの lib/kaslr.c の RDRAND よりも安全な CSPRNG を KASLR に実装しているディストリビューションはありますか?

私はkaslr.cそして、それはkaslr_get_random_long()で定義されていることを発見した。kaslr.h そして実装されたlib/kaslr.cここでは、より多くのエントロピーを生成するために、RDRAND (Intel のハードウェア 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 は、ハッシュが静的に 0 に設定された非常に単純な線形 XOR PRNG のようです。カーネル ブート パラメータに依存する非常に単純な XOR を使用します。

    /* 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 を使用するようにパッチが適用されているかどうか疑問に思っています。パフォーマンスとセキュリティのトレードオフを考えると、この選択は理解できます。ただし、強化されたカーネルにさらに多くのオプションを許可するように、誰かがすでにこれをパッチしているはずです。

関連情報