Alguma distro está implementando um CSPRNG mais seguro no KASLR do que RDRAND em lib/kaslr.c como nas fontes vanilla?

Alguma distro está implementando um CSPRNG mais seguro no KASLR do que RDRAND em lib/kaslr.c como nas fontes vanilla?

eu comecei comkaslr.ce descobri que ele usa kaslr_get_random_long() definido emkaslr.h e implementado emlib/kaslr.conde possivelmente usa RDRAND (PRNG de hardware da Intel), um carimbo de data / hora e pelo menos um temporizador de sistema para gerar mais entropia.

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();
}

O valor retornado é um pouco difundido por meio de alguma multiplicação circular.

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

get_boot_seed parece ser um xor PRNG linear muito simples em um hash definido como 0 estático. Ele usa um xor muito simples, dependendo dos parâmetros de inicialização do kernel.

    /* 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;
}

Este parece ser um tipo de abordagem "bom o suficiente" e gostaria de saber se outra distribuição o corrigiu para usar um CSPRNG mais forte? Para uma troca de desempenho/segurança, posso entender a escolha. No entanto, tenho quase certeza de que alguém já deve ter corrigido isso para permitir mais opções para kernels reforçados.

informação relacionada